LCD1602自定義符號的使用
在對LCD1602有了基本的了解與使用后,我們可以接著了解LCD1602的自定義字符的使用,
要顯示自定義符號,就得使用CGRAM存盤器,LCD1602最多只可以顯示8個自定義字符,
CGRAM可以存盤8個自定義字符,他們在存盤器中的首地址分別為:0x40,0x48,0x50,0x58,0x60,0x68,0x70,0x78.
把字模資料寫入CGRAM,就需要從首地址中選一個,并將字模資料送入,切記要把CGRAM中的自定義字符再送入DDRAM,
這樣自定義字符才能夠正常顯示,以下為CGRAM存盤器中首地址所對應的索引 0x00:第一個(0x40) 0x01:第二個(0x48) 0x02:第三個(0x50) 0x03:第四個(0x58) 0x04:第五個(0x60) 0x05:第六個(0x68) 0x06:第七個(0x70) 0x07:第八個(0x78) ,把CGRAM中的自定義字符再送入DDRAM ,只需將CGRAM存盤器中首地址相對應的索引寫入DDRAM即可,(具體步驟可以看代碼部分)
字模部分
在對LCD1602的使用中一般設定其像素為5*7,但一個自定義字符占8個位元組,所以在寫入字符時;將最后一位寫為0x00即可;
例如在程式中uchar code table[ ]={0x07,0x08,0x1c,0x08,0x1c,0x08,0x07,0x00};
uchar code table1[ ]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};
上面table中的是歐元貨幣符號的字模資料(人名幣和美元的貨幣符號均可直接顯示),table1中是攝氏度符號的字模資料,
下圖為我在excel畫的€

第一行的00111對應十六進制的0x07,
01000~0x08;
11100~0x1c;
01000~0x08;
11100~0x1c;
01000~0x08;
00111~0x07 ;
00000~0x00,
按順序向下排便得到了一個自定義字符的字模資料,可以用取字模的軟體直接得到字模資料,同樣也可以向我一樣用excel表格慢慢搞…
自定義符號顯示基本步驟:
1、 將自定義字符寫入CGRAM,
2、 將CGRAM中自定義的字符送入DDRAM,
自定義符號的顯示和自帶字符的基本操作是完全一樣的,寫指令,寫資料,將字符在相應位置顯示的操作都與自帶字符的操作一摸一樣,
代碼部分
通過寫命令,可以對LCD進行初始化操作和送出顯示地址
void lcdwcom(uchar com) //1602寫命令函式
{
lcdrs=0; //選擇指令暫存器
//rw=0; //選擇寫;我的開發板已接地
P0=com; //把命令字送入P3
delay(5); //延時一小會兒,讓1602準備接收資料
lcden=1; //使能線電平變化,命令送入1602的8位資料口
lcden=0;
}
通過寫資料,將我們要顯示的字符送入LCD
void lcdwdat(uchar dat) //寫資料
{
lcdrs=1; //選擇寫資料
//rw=0;
P0=dat; //把要顯示的資料送入
delay(5); //延時一小會兒,讓1602準備接收資料
lcden=1; //使能變化;資料送入
lcden=0;
}
對lcd初始化,設定其顯示模式
void lcdinit() //1602初始化
{
dula=0;
wela=0;//將數碼管關閉
lcdwcom(0x38); //8位資料,雙列,5*7字形
lcdwcom(0x0c); //開啟顯示屏,關游標,游標不閃爍
lcdwcom(0x06); //顯示地址遞增,寫一個資料后,顯示位置右移一位
lcdwcom(0x01); //清屏
}
定義了4個變數,在主函式中呼叫即可顯示自定義字符
void display1(uchar cgr,uchar table_num,uchar pos_,uchar count)//自定義符號顯示
{
lcdinit();//液晶初始化
lcdwcom(cgr);//設定CGRAM地址,把自定義字符存盤進去
for(m=table_num;m<table_num+8;m++) //將table[]中的資料依次送入1602顯示
{
lcd_wdat(table[m]);//寫入資料
delay(10);
}
lcdwcom(pos_); //顯示地址
lcdwdat(count); //向DDRAM寫入
}
類似于開機影片,不過只能顯示一串字符…
void display()//開屏左移
{
lcdinit();//液晶初始化
lcdwcom(0x80);//選擇顯示地址起始位
for(b=0;b<11;b++)
{
lcdwdat(table1[b]);//將hello world 送入1602
delay(200); //可以通過延時控制hello word 的顯示速度
}
for(b=0;b<10;b++)
{
lcdwcom(0x18);//全屏左移
delay(300);//可以通過延時控制hello word 左移的速度
}
}
主函式部分
void main() //主函式
{
display();
delay(10);
//display1(0x40,0,0x86,0x00);//顯示攝氏度
display1(0x48,8,0x86,0x01);//顯示歐元
lcdwcom(0x80);//選擇顯示地址
for(num=0;num<6;num++)
{
lcdwdat(table2[num]);
delay(20);
}
while(1);//動態停機
}
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit lcden=P3^4;//使能位
sbit lcdrs=P3^5;//資料&命令選擇端;
sbit dula=P2^6;
sbit wela=P2^7; //數碼管的兩個鎖存器
uchar code table[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00,
0x07,0x08,0x1c,0x08,0x1c,0x08,0x07,0x00};
//要顯示的內容放入陣列table
uchar code table1[]="Hello world";
uchar code table2[]="Types:";
uchar b,m,num;
顯示的結果:Hello world顯示完畢后左移至消失后顯示types:€
本人新手┗┃? ■ ?┃┛寫的不好,請見諒!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/279327.html
標籤:其他
上一篇:線索二叉樹(作業二)
