CGRAM 1602能夠存儲8個自定義字符,這8個自定義字符的存儲空間首地址分別是:0X40,0X48,0X50,0X58,0X60,0X68,0X70,0X78。我們以0x40來說,它的存儲空間如下圖所示:
如果是使用的5*7字符的話,那么最左的3位和最后一行的數據實際上是沒有用的,通常置0。如果是要自定義一個℃符號,那么就先填框,如圖(紅1白0)
使用時先把這一些編碼填充到CGRAM
隨便使用8*8取模軟件畫了兩個字符下面為示例代碼
#include <reg51.h>
#include <string.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define Data P0 //數據口
sbit en=P2^2; //E脈沖控制信號端口
sbit rs=P2^0; //命令控制端口
sbit rw=P2^1; //讀寫控制口
uchar t_code1[]={0x15,0x1F,0x04,0x04,0x1C,0x11,0x1F,0x00};//自定義的一個5*7點陣 截圖里的編碼
uchar t_code2[]={0x15,0x1F,0x04,0x00,0x04,0x1F,0x15,0x00};
void read_sta() //讀狀態
{
uint j=1000;//超時變量
Data=0x80;
rs=0; //rs=0 rw=1 E=1 讀狀態
rw=1;
en=1;
while((Data&0x80)&&j--)_nop_();//忙則等待一個nop大概1us配合上面的j=1000 做1ms超時判斷
en=0; //en拉低
}
void write_com(uchar com)
{
read_sta(); //讀忙信號
rs=0; //寫命令rs=0 寫數據rs=1
rw=0; //寫rw都為0
Data=com; //把要寫的數據放到數據口
en=0; //E一個正脈沖寫一個數據 所謂一個正脈沖就是指E從0->1->0的一個低高低的變換 所以這里先拉低en=0
en=1;
en=0;
}
void write_data(uchar date)
{
read_sta();
rs=1; //rs=1寫數據
rw=0;
Data=date;
en=0; //同上
en=1;
en=0;
}
void lcd1602_init()
{
write_com(0x38); //8位數據口,兩行顯示,5*7點陣字符
write_com(0x0c); //無光標不閃爍
write_com(0x06); //讀寫指針加1屏幕不移動 0101
write_com(0x01); //清屏光標返回00H位置
}
void main()
{
uchar flag=0,off_on=1,i;
lcd1602_init();
for(i=0;i<8;i++)
{
write_com(0x40+i); //地址 0x40-0x78 8個對應一個字符
write_data(t_code1[i]);
}
for(i=0;i<8;i++)
{
write_com(0x78+i); //地址 0x40-0x78 8個對應一個字符 寫第八個字符
write_data(t_code2[i]);
}
for(i=0;i<16;i++)
{
write_com(0x80+i); //一行
write_data(0x00); //0x00是第一個
}
for(i=0;i<16;i++)
{
write_com(0x80+0x40+i); //第二行
write_data(0x07); //0x07是第第8個因為是從0開始
}
while(1)
{
}
}