色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

您好,歡迎來電子發燒友網! ,新用戶?[免費注冊]

您的位置:電子發燒友網>源碼下載>C/C++語言編程>

自編字型圖案及LCD文字顯示實驗案例

大小:0.1 MB 人氣:3 2017-09-06 需要積分:0
自編字型圖案及LCD文字顯示實驗案例

1、自編字型圖案實驗

/*自編字型圖案實驗(ch13-6-2.c)適用於89S51線上燒錄實驗板(USB版)*/
#include?
#define LCDP? P0?// 定義LCM 資料匯流排接至P0
sbit RS = P3^2;??// 暫存器選擇位元(0:指令,1:資料)
sbit RW = P3^1;??// 設定讀寫位元 (0:寫入,1:讀取)
sbit E =? P3^0;??// 致能位元 (0:禁能,1:致能)
sbit BF = P0^7;??// 忙碌檢查位元(0:不忙,1:忙碌)
char?count=20;?// 中斷次數計數,20次*50ms=1秒?
char?time[10];? ?// 顯示時間陣列(第1行)
/* 聲明自定義字型陣列變量 */
char code am[32] = { ?// 顯示上三角及AM
0x00, 0x00, 0x01, 0x80, 0x03, 0xC0, 0x07, 0xE0,
0x0F, 0xF0, 0x1F, 0xF8, 0x3F, 0xFC, 0x7F, 0xFE,
0x00, 0x00, 0x18, 0x44, 0x24, 0x6C, 0x24, 0x6C,
0x3C, 0x54, 0x24, 0x54, 0x24, 0x44, 0x00, 0x00};
char code pm[32] = {?// 顯示下三角及PM
0x00, 0x00, 0x7F, 0xFE, 0x3F, 0xFC, 0x1F, 0xF8,
0x0F, 0xF0, 0x07, 0xE0, 0x03, 0xC0, 0x01, 0x80,?
0x00, 0x00, 0x38, 0x44, 0x24, 0x6C, 0x24, 0x6C,
0x38, 0x54, 0x20, 0x54, 0x20, 0x44, 0x00, 0x00};
bit? ampm=1;???// 0:上午(am),1:下午(pm),初值下午?
char? hour=11;???// 聲明時,初值為11點?
char? minute=59;??// 聲明分,初值為59分?
char? second=50;??// 聲明秒,初值為50秒?
void transfer(void);?// 轉換時分秒至time陣列中?
void write_inst(char); ?// 寫入指令函數?
void write_char(char); ?// 寫入字元函數?
void write_pat(void); ?// 寫入自建字型函數?
void check_BF(void); ?// 檢查忙碌函數?
void init_LCM(void); ?// 聲明LCM初始設定函數?
//===========主程式=============================
main()
{?char i;
?init_LCM();????// 初始設定?
?write_pat();????// 寫入自建字型?
?IE=0X82;?????// Timer 0中斷致能?
?TMOD=0x01;?????// T0設為MODE1
?TH0=(56636-50000) / 256;?// 填入計時量之高位元組?
?TL0=(56636-50000) % 256;?// 填入計時量之低位元組?
?TR0=1;??????// 啟動Timer 0
?while(1)?????// 無窮循環?
?{?transfer();????// 轉換時分秒至time陣列中??
??write_inst(0x80);??// 指定第1列位置?
??for (i=0;i<10;i++)??// 循環?
???write_char(time[i]);// 顯示時間?????
?}???????// while結束?
}????????// main() 結束?
//====轉換函數===================
void transfer(void)
{?time[0]= hour/10 + 0x30;?// 時數之十位數顯示資料?
?time[1]= hour%10 + 0x30;?// 時數之個位數顯示資料?
?time[2]= ':';????// 顯示冒號??
?time[3]= minute/10 + 0x30;?// 分數之十位數顯示資料?
?time[4]= minute%10 + 0x30;?// 分數之個位數顯示資料?
?time[5]= ':';????// 顯示冒號?
?time[6]= second/10 + 0x30;?// 秒數之十位數顯示資料?
?time[7]= second%10 + 0x30;?// 秒數之個位數顯示資料?
?time[8]=0x00;????// 自鍵字型之高位元組?
?if (ampm==0)? ????// 判定是否為上午?
??time[9]=0x00;???// 表示上午之自鍵字型?
?else time[9]=0x02;???// 表示下午之自鍵字型??
}????????// transfer()函數結束?
//====寫入自建字型函數===================
void write_pat(void)
{?char i;
?write_inst(0x40);???// 設定CGRAM的位置?
?for (i=0;i<32;i++)
??write_char(am[i]);??// 寫入上午之自鍵字型?
?for (i=0;i<32;i++)
??write_char(pm[i]);??// 寫入下午之自鍵字型??
}????????// write_pat()函數結束?
//===== Timer 0中斷副程式 =======================
void clock(void)?interrupt 1?// T0中斷副程式?
{?TH0=(56636-50000)/256;??// 填入計時量?
?TL0=(56636-50000)%256;??// 填入計時量?
?if (--count==0) ???// 中斷次數是否達到20次?
?{?count=20;????// 重新計次?
??second++;????// 秒數加1?
??if (second>=60)???// 是否達到60秒?
??{?second=0;???// 秒數歸零?
???minute++;???// 分數加1?
???if (minute>=60)??// 是否達到60分?
???{?minute=0;??// 分數歸零?
????hour++;???// 時數加1?
????if (hour == 13)?// 是否達到13小時?
?????hour=1; ?// 時數改為1?
????if (hour == 12)?// 是否達到12小時?
?????ampm=~ampm;?// 切換上下午?
}?}?}?}?????// 結束?
//====初始設定函數(8位元傳輸模式)===================
void init_LCM(void)
{?write_inst(0x30);?// 設定功能-8位元-基本指令?
?write_inst(0x30);?// 設定功能-8位元-基本指令?
?write_inst(0x30);?// 英文LCM相容設定,中交LCM可忽略?
?write_inst(0x38);?// 英文LCM設定兩列,中交LCM可忽略?
?write_inst(0x08);?// 顯示功能-關顯示幕-無游標-游標不閃?
?write_inst(0x01);?// 清除顯示幕(填0x20,I/D=1)
?write_inst(0x06);?// 輸入模式-位址遞增-關顯示幕???
?write_inst(0x0c);?// 顯示功能-開顯示幕-無游標-游標不閃?
}??????//?init_LCM()函數結束?
//==== 寫入指令函數 ================================
void write_inst(char inst)
{?check_BF();???// 檢查是否忙碌?
?LCDP = inst;??// LCM讀入MPU指令?
?RS = 0; RW = 0; E = 1;?// 寫入指令至LCM
?check_BF();????? // 檢查是否忙碌??
}??????// write_inst()函數結束?
//==== 寫入字元資料函數 ============================
void write_char(char chardata)
{?check_BF();???// 檢查是否忙碌?
?LCDP = chardata;?// LCM讀入字元?
?RS = 1; RW = 0 ;E = 1;?// 寫入資料至LCM
?check_BF();???// 檢查是否忙碌?
}??????// write_char()函數結束?
//====檢查忙碌函數================================
void check_BF(void)
{?E=0;????// 禁止讀寫動作?
?do?????// do-while循環開始?
?{ ?BF=1;???// 設定BF為輸入??
? ??RS = 0; RW = 1;E = 1; ?// 讀取BF及AC
?}while(BF == 1);?// 忙碌繼續等?
}??????// check_BF()函數結束?
?
?
?

2、LCD文字顯示實驗

/*LCD文字顯示實驗(ch13-6-1.c)適用於89S51線上燒錄實驗板(USB版)*/
#include
#define LCDP? P0?//?定義LCM 資料匯流排接至P0
sbit RS?=?P3^2;?//?暫存器選擇位元(0:指令,1:資料)
sbit RW?=?P3^1;?//?設定讀寫位元 (0:寫入,1:讀取)
sbit E?=?P3^0;?//?致能位元 (0:禁能,1:致能)
sbit BF?=?P0^7;?//?忙碌檢查位元(0:不忙,1:忙碌)
char line1[]="LCM test program";// 第1次顯示字串(第1行)
char line2[]="Everything is OK";// 第1次顯示字串(第2行)
char line3[]="中文LCM 測試程序";// 第2次顯示字串(第1行)
char line4[]="一切正常歡迎使用";// 第2次顯示字串(第2行)
void init_LCM(void);?//?初始設定函數?
void write_inst(char);?//?寫入指令函數?
void write_char(char);?//?寫入字元資料函數?
void check_BF(void);?//?檢查忙碌函數?
void delay1ms(int);??//?延遲函數 ?
// ============ 主程序 ===========================
main()
{?char i;???????// 聲明變量?
?init_LCM();??????// 初始設定?
?while(1)??????// 無盡循環?
?//=====LCM test program ======
?{?write_inst(0x80);???// 指定第一列位置?
??for (i=0;i<16;i++)???// 循環?
???write_char(line1[i]);?// 顯示16個字?
?//=====Everything is OK ======
??write_inst(0x90);???// 指定第二列位置?
??for (i=0;i<16;i++)???// 循環?
???write_char(line2[i]);?// 顯示16個字?
??delay1ms(2000);????// 延遲2秒?
??//===== 中文LCM 測試程序 ======
??write_inst(0x80);???// 指定第一列位置?
??for (i=0;i<16;i++)???// 循環?
???write_char(line3[i]);?// 顯示16個字?
??//===== 一切正常歡迎使用 ======
??write_inst(0x90);???// 指定第二列位置?
??for (i=0;i<16;i++)???// 循環?
???write_char(line4[i]);?// 顯示16個字?
??delay1ms(2000);????// 延遲2秒?
?}????????// while結束?
}?????????// 主程序main()結束?
//====初始設定函數(8位元傳輸模式)===================
void init_LCM(void)
{?write_inst(0x30);?// 設定功能-8位元-基本指令?
?write_inst(0x30);?// 設定功能-8位元-基本指令?
?write_inst(0x30);?// 英文LCM相容設定,中交LCM可忽略?
?write_inst(0x38);?// 英文LCM設定兩列,中交LCM可忽略?
?write_inst(0x08);?// 顯示功能-關顯示幕-無游標-游標不閃?
?write_inst(0x01);?// 清除顯示幕(填0x20,I/D=1)
?write_inst(0x06);?// 輸入模式-位址遞增-關顯示幕?
?write_inst(0x0c);?// 顯示功能-開顯示幕-無游標-游標不閃??
}??????// init_LCM()函數結束?
//==== 寫入指令函數 ================================
void write_inst(char inst)
{?check_BF();????// 檢查是否忙碌?
?LCDP = inst;???// LCM讀入MPU指令?
?RS = 0; RW = 0; E = 1;?// 寫入指令至LCM
?check_BF();????// 檢查是否忙碌?
}???????// write_inst()函數結束?
//==== 寫入字元資料函數 ============================
void write_char(char chardata)
{?check_BF();????// 檢查是否忙碌?
?LCDP = chardata;??// LCM讀入字元?
?RS = 1; RW = 0 ;E = 1;?// 寫入資料至LCM
?check_BF();????// 檢查是否忙碌?
}???????// write_char()函數結束?
//====檢查忙碌函數================================
void check_BF(void)
{?E=0;?????// 禁止讀寫動作?
?do??????// do-while循環開始?
?{ ?BF=1;????// 設定BF為輸入?
? ?RS = 0; RW = 1;E = 1;?// 讀取BF及AC
?}while(BF == 1);??// 忙碌繼續等?
}???????//?check_BF()函數結束?
//==== 延遲函數 ================================
void delay1ms(int x)
{?int i,j;????// 聲明變量?
?for (i=1;i ??for (j=1;j<120;j++);// 執行120次,延遲1ms
}???????// delay1ms()函數結束?
?

非常好我支持^.^

(0) 0%

不好我反對

(0) 0%

用戶評論

      ?
      主站蜘蛛池模板: 亚洲色播永久网址大全 | 亚洲免费网站在线观看 | 国产成人免费 | 秋霞电影网午夜鲁丝片无码 | 国产精品xxxav免费视频 | FREECHINESE东北女人真爽 free18sex性自拍裸舞 | 久久精品国产欧美日韩99热 | 精品亚洲国产成AV人片传媒 | 伊人影院香蕉久在线26 | 翘臀后进美女白嫩屁股视频 | 无码AV熟妇素人内射V在线 | 特级淫片大乳女子高清视频 | 国产成人精品男人的天堂网站 | 亚洲AV无码A片在线观看蜜桃 | 亚洲精品视频在线播放 | 无限资源在线观看8 | 亚洲第一页在线播放 | 欧美日韩永久久一区二区三区 | 大岛优香久久中文字幕 | 91麻精品国产91久久久久 | 亚洲视频国产在线精品 | 日韩做A爰片久久毛片A片毛茸茸 | 蜜芽在线影片 | 手机看片国产日韩欧美 | 国产女人视频免费观看 | 日韩欧美群交P内射捆绑 | 日本不卡免免费观看 | 成人公开免费视频 | 幸福草电视剧演员表介绍 | 國產日韓亞洲精品AV | 精品无人区一区二区三区 | 欧美特级特黄a大片免费 | 69精品人人人人 | 性色AV乱码一区二区三区视频 | 精品久久免费视频 | 国产精品97久久AV麻豆 | 老师的快感电影完整版 | 羞羞麻豆国产精品1区2区3区 | 在线观看日韩一区 | 亚洲伊人久久网 | 一二三四在线高清中文版免费观看电影 |