LCD1602自定義點陣字符
CGRAM 1602能存儲8個自定義字符,這8個自定義字符存儲空間的首地址分別是:0X40,0X48,0X50,0X58,0X60,0X68,0X70,0X78。以0x40
來說,它的存儲空間如圖所示:
如果使用5*7字符的話,那么最左3位和最后一行的數據實際上是沒用的,通常置0。如果要自定義一個℃符號,那么先填框,如圖(紅1白0)
使用時先把這些編碼填充到CGRAM
隨便用8*8取模軟件畫了兩個字符下面為示例代碼
#include
#include
#include
#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() //讀狀態(tài)
{
uint j=1000;//超時變量
Data=0x80;
rs=0; //rs=0 rw=1 E=1 讀狀態(tài)
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)
{
}
}