1、時(shí)序圖
2、代碼
3、自定義字符
時(shí)序圖
代碼:
#include <reg51.h>
#include<intrins.h>
sbit RS = P2^4; //定義端口
sbit RW = P2^5;
sbit EN = P2^6;
void Delayus(unsigned char t) // us級(jí)別延時(shí)
{
while(--t);
}
void Delayms(unsigned char t)// ms級(jí)別延時(shí)
{
while(t--)
{
//大致延時(shí)1mS
Delayus(245);
Delayus(245);
}
}
bit m_1602() //判斷1602是否忙
{
P0 = 0xFF; //準(zhǔn)備讀取
RS = 0;
RW = 1;
EN = 0;
_nop_();
EN = 1; //產(chǎn)生高電平
return (bit)(P0 & 0x80);
}
void x_1602(bit i,unsigned char j) //參數(shù)一是寫(xiě)(0、寫(xiě)指令 1、寫(xiě)數(shù)據(jù)),參數(shù)二是寫(xiě)入的8位數(shù)據(jù)
{
while(m_1602())
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
RS = i;
RW = 0;
EN = 1;
P0 = j;
_nop_();
EN = 0; //產(chǎn)生下降沿
}
void qp_1602() //清屏函數(shù)
{
x_1602(0,0x01); //第一個(gè)參數(shù)是:寫(xiě)入的類(lèi)型(0、寫(xiě)指令 1、寫(xiě)數(shù)據(jù)),第一個(gè)參數(shù)是:寫(xiě)入的數(shù)據(jù)
Delayms(5);
}
//顯示字符
void zf_1602(unsigned char x,unsigned char y,unsigned dat) //參數(shù)一是顯示的列,參數(shù)二是顯示的行,參數(shù)三是顯示的數(shù)據(jù)
{
if(y==0)
{
x_1602(0,(0x80+x)); //第一行
}
else
{
x_1602(0,(0xc0+x)); //第二行
}
x_1602(1,dat); //寫(xiě)入數(shù)據(jù)
}
void zfc_1602(unsigned char x,unsigned char y,unsigned char *dat)
{
if(y==0)
{
x_1602(0,(0x80+x)); //第一行
}
else
{
x_1602(0,(0xc0+x)); //第二行
}
while(*dat) //&:取地址 *:取值
{
x_1602(1,*dat);
dat ++;
}
}
void csh_1602() //初始化1602
{
x_1602(0,0x38); //顯示模式設(shè)置
Delayms(5);
x_1602(0,0x38);
Delayms(5);
x_1602(0,0x38);
Delayms(5);
x_1602(0,0x38);
x_1602(0,0x08); //顯示關(guān)閉.
x_1602(0,0x01); //顯示清屏
x_1602(0,0x06); //顯示光標(biāo)移動(dòng)設(shè)置
Delayms(5);
x_1602(0,0x0c); //顯示開(kāi)及光標(biāo)設(shè)置
}
void main()
{
csh_1602();
qp_1602();
while(1)
{
zf_1602(0,0,'Q'); //寫(xiě)入字符
zf_1602(1,0,'Q'); //寫(xiě)入字符
zf_1602(2,0,' '); //寫(xiě)入字符
zfc_1602(3,0,"www.baidu.con"); //寫(xiě)入字符串
zfc_1602(1,1,"1990.02.08"); //寫(xiě)入字符串
while(1);
}
}
自定義字符 (轉(zhuǎn))
用戶自定義字符的應(yīng)用:
我們從CGROM表上可以看到,在表的最左邊是一列可以允許用戶自定義的CGRAM,從上往下看著是16個(gè),實(shí)際只有8個(gè)字節(jié)可用。它的字符碼是 00000000-00000111這8個(gè)地址,表的下面還有8個(gè)字節(jié),但因?yàn)檫@個(gè)CGRAM的字符碼規(guī)定0-2位為地址,3位無(wú)效,4-7全為零。因此 CGRAM的字符碼只有最后三位能用也就是8個(gè)字節(jié)了。等效為0000X111,X為無(wú)效位,最后三位為000-111共8個(gè)。
如果我們要想顯示這8個(gè)用戶自定義的字符,操作方法和顯示CGROM的一樣,先設(shè)置DDRAM位置,再向DDRAM寫(xiě)入字符碼,例如“A”就是41H,F(xiàn)在我們要顯示 CGRAM的第一個(gè)自定義字符,就向DDRAM寫(xiě)入00000000B(00H),如果要顯示第8個(gè)就寫(xiě)入00000111(08H),簡(jiǎn)單吧!
好!現(xiàn)在我們來(lái)看怎么向這八個(gè)自定義字符寫(xiě)入字模。有個(gè)設(shè)置CGRAM地址的指令如下圖:
從這個(gè)指令可以看出指令數(shù)據(jù)的高2位已固定是01,只有后面的6位是地址數(shù)據(jù),而這6位中的高3位就表示這八個(gè)自定義字符,最后的3位就是字模數(shù)據(jù)的八個(gè)地址了。例如第一個(gè)自定義字符的字模地址為01000000-01000111八個(gè)地址。我們向這8個(gè)字節(jié)寫(xiě)入字模數(shù)據(jù),讓它能顯示出“℃”
地址:01000000 數(shù)據(jù):00010000 圖示: ○○○■○○○○
01000001 00000110 ○○○○○■■○
01000010 00001001 ○○○○■○○■
01000011 00001000 ○○○○■○○○
01000100 00001000 ○○○○■○○○
01000101 00001001 ○○○○■○○■
01000110 00000110 ○○○○○■■○
01000111 00000000 ○○○○○○○○