PIC18F452之1602自定義字符
顯示自定義字符
步驟如下:
1. 先將自定義字符寫(xiě)入CGRAM ; 2. 再將CGRAM中的自定義字符送到DDRAM中顯示
很簡(jiǎn)單的:看好了
查看LCD1602 的CGROM 字符代碼表,可以發(fā)現(xiàn) 從00000000B~00000111B(00H~07H)地址的內(nèi)容是沒(méi)有定義的,它是留給用戶(hù)自己定義的,用戶(hù)可以通過(guò)先定義LCD1602的CGRAM中的內(nèi)容,然后就可以同調(diào)用CGROM字符一樣來(lái)調(diào)用自定義好的字符(這里提示一下,自定義的字符最多可寫(xiě)8個(gè)),那么如何設(shè)定CGRAM中的內(nèi)容呢?
首先我們要把所要編寫(xiě)的字符對(duì)應(yīng)于5X8點(diǎn)陣的“字?!碧崛〕鰜?lái),我們可以通過(guò)相關(guān)的軟件來(lái)提取,也可以手工提取。說(shuō)白了也就是將點(diǎn)陣的某一行中有顯示的點(diǎn)用1表示,無(wú)顯示的點(diǎn)用0表示,以此形成該行對(duì)應(yīng)的字模數(shù)據(jù)。
設(shè)定CGRAM的內(nèi)容,要一行一行的設(shè)定,每一行對(duì)應(yīng)一個(gè)CGRAM,5X8點(diǎn)陣,每行5點(diǎn),共8行,因此要將8行的字模數(shù)據(jù)都寫(xiě)入CGRAM。寫(xiě)好后,就可像調(diào)
用CGROM字符一樣來(lái)來(lái)調(diào)用它了。
定義一行的內(nèi)容,分兩步:
1. 設(shè)定行地址(CGRAM地址):
用到的命令如下:
RS R/W DB7 DB6DB5 DB4 DB3DB2 DB1 DB0
0 0 0 1 DATA
其中:DB5,DB4,DB3為字符號(hào),也就是你將來(lái)要顯示該字符時(shí)要用到的字符地址。
DB2,DB1,DB0為行號(hào)。
2. 設(shè)定CGRAM數(shù)據(jù)(內(nèi)容)指令碼如下:
RS R/WDB7 DB6 DB5DB4 DB3 DB2 DB1 DB0
1 0 DATA
其中:DB4,DB3,DB2,DB1,DB0對(duì)應(yīng)于每行5點(diǎn)的字模數(shù)據(jù)。
DB7,DB6,DB5可為任何數(shù)據(jù),一般取“000”。
1 #include
2 __CONFIG(1,XT) ; //晶振為外部4M
3 __CONFIG(2,WDTDIS) ; //看門(mén)狗關(guān)閉
4 __CONFIG(4,LVPDIS) ; //禁止低電壓編程
5
6 #define RSPIN RB5 //Data or Instrument Select
7 #define RWPIN RB4 //Write or Read
8 #define EPIN RB3 //6800 mode Enable single
9 unsigned char table[]="LCD check ok"; //要顯示的內(nèi)容1放入數(shù)組tablel
10
11 //此函數(shù)定義八個(gè)字符分別寫(xiě)入CGRAM的八個(gè)地址
12 unsigned char pic[]={
13 0x03,0x07,0x0f,0x1f,0x1f,0x1f,0x1f,0x1f,
14 0x18,0x1E,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,
15 0x07,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,
16 0x10,0x18,0x1c,0x1E,0x1E,0x1E,0x1E,0x1E,
17 0x0f,0x07,0x03,0x01,0x00,0x00,0x00,0x00,
18 0x1f,0x1f,0x1f,0x1f,0x1f,0x0f,0x07,0x01,
19 0x1f,0x1f,0x1f,0x1f,0x1f,0x1c,0x18,0x00,
20 0x1c,0x18,0x10,0x00,0x00,0x00,0x00,0x00
21
22 };
23 ///---------------------------------------
24 //名稱(chēng): 延時(shí)函數(shù)
25 //-----------------------------------------
26 void delay(unsigned int t)
27 {
28 unsigned int i,j;
29 for(i=0;i 30 { 31 for(j=0;j<10;j++); 32 } 33 } 34 35 //--------------------------------------- 36 //名稱(chēng): 1602忙檢測(cè)函數(shù) 37 //----------------------------------------- 38 void lcd_wait_busy(void) 39 { 40 TRISD7=1; //為讀狀態(tài)做準(zhǔn)備 41 RSPIN=0; //選擇指令寄存器 42 RWPIN=1; //選擇讀 43 EPIN=1; //使能線(xiàn)電平變化 44 while(RD7==1); //讀忙狀態(tài),不忙時(shí)退出 45 EPIN=0; //恢復(fù)使能線(xiàn)電平 46 TRISD7=0; 47 } 48 //--------------------------------------- 49 //名稱(chēng): 1602寫(xiě)命令函數(shù) 50 //----------------------------------------- 51 void lcd_write_com(unsigned char combuf) 52 { 53 RSPIN=0; //選擇指令寄存器 54 RWPIN=0; //選擇寫(xiě) 55 PORTD=combuf; //把命令字送入RD 56 EPIN=1; //使能線(xiàn)電平變化,命令送入1602的8位數(shù)據(jù)口 57 asm("NOP"); 58 EPIN=0; //恢復(fù)使能線(xiàn)電平 59 } 60 //--------------------------------------- 61 //名稱(chēng): 1602寫(xiě)命令函數(shù)(帶忙檢測(cè)) 62 //----------------------------------------- 63 void lcd_write_com_busy(unsigned char combuf) 64 { 65 lcd_wait_busy(); //調(diào)用忙檢測(cè)函數(shù) 66 lcd_write_com(combuf); //調(diào)用寫(xiě)命令函數(shù) 67 } 68 //--------------------------------------- 69 //名稱(chēng): 1602寫(xiě)數(shù)據(jù)函數(shù)(帶忙檢測(cè)) 70 //----------------------------------------- 71 void lcd_write_data(unsigned char databuf) 72 { 73 lcd_wait_busy(); //調(diào)用忙檢測(cè)函數(shù) 74 RSPIN=1; //選擇數(shù)據(jù)寄存器 75 RWPIN=0; //選擇寫(xiě) 76 PORTD=databuf; //把數(shù)據(jù)字送入P2 77 EPIN=1; //使能線(xiàn)電平變化,命令送入1602的8位數(shù)據(jù)口 78 asm("NOP"); 79 EPIN=0; //恢復(fù)使能線(xiàn)電平 80 } 81 //--------------------------------------- 82 //名稱(chēng): 1602顯示地址寫(xiě)函數(shù) 83 //----------------------------------------- 84 void lcd_write_address(unsigned char x,unsigned char y) 85 { 86 x&=0x0f; //列地址限制在0-15 87 y&=0x01; //行地址限制在0-1 88 if(y==0x00) 89 lcd_write_com_busy(x|0x80); //第一行的列地址寫(xiě)入 90 else 91 lcd_write_com_busy((x+0x40)|0x80); //第二行的列地址寫(xiě)入 92 } 93 //--------------------------------------- 94 //名稱(chēng): 1602初始化函數(shù) 95 //----------------------------------------- 96 void lcdreset(void) 97 { 98 lcd_write_com_busy(0x38); //8位數(shù)據(jù),雙列,5*7字形 99 lcd_write_com_busy(0x08); //顯示功能關(guān),無(wú)光標(biāo) 100 lcd_write_com_busy(0x01); //清屏指令 101 lcd_write_com_busy(0x06); //寫(xiě)入新的數(shù)據(jù)后,光標(biāo)右移,顯示屏不移動(dòng) 102 lcd_write_com_busy(0x0c); //顯示功能開(kāi),無(wú)光標(biāo), 103 } 104 //--------------------------------------- 105 //名稱(chēng): 指定地址寫(xiě)入函數(shù) 106 //----------------------------------------- 107 void lcd_write_char(unsigned char x,unsigned char y,unsigned char buf) 108 { 109 lcd_write_address(x,y);