1602c语⾔驱动程序,51单⽚机驱动LCD1602程序设计(C语
⾔)很详细的教程
//********写指令函数************
void LCD_write_command(uchar dat)
{
LCD_DB=dat;
LCD_RS=0;//指令
LCD_RW=0;//写⼊
LCD_E=1;//允许
LCD_E=0;
delay_n40us(1);//实践证明,我的LCD1602上,⽤for循环1次就能完成普通写指令。
}
//*******************************
//********写数据函数*************
void LCD_write_data(uchar dat)
{
LCD_DB=dat;
LCD_RS=1;//数据
LCD_RW=0;//写⼊
LCD_E=1;//允许
LCD_E=0;
delay_n40us(1);
}
//********************************
//*******显⽰⼀个字符函数*********
void LCD_disp_char(uchar x,uchar y,uchar dat)
{
uchar address;
if(y==1)
address=0x80+x;
else
address=0xc0+x;
LCD_write_command(address);
LCD_write_data(dat);
}
//********************************
/*******检查忙函数*************
void LCD_check_busy() //实践证明,在我的LCD1602上,检查忙指令通过率极低,以
{ //⾄于不能正常使⽤LCD。因此我没有再⽤检查忙函数。⽽使
do //⽤了延时的⽅法,延时还是⾮常好⽤的。我试了⼀下,⽤
{ LCD_E=0; //for循环作延时,普通指令只要1次循就可完成。清屏指令
LCD_RS=0; //要⽤200次循环便能完成。
LCD_RW=1;
LCD_DB=0xff;
LCD_E=1;
}while(LCD_DB^7==1);
}
******************************/
//********延时函数***************
void delay_n40us(uint n)
{ uint i;
uchar j;
for(i=n;i>0;i--)
for(j=0;j<2;j++); //在这个延时循环函数中我只做了2次循环,
} //实践证明我的LCD1602上普通的指令只需1次循环就能可靠完成。//*******************************
//*********主函数*****************
void main(void)
{
LCD_init();
LCD_disp_char(0,1,’A’);
while(1);
}
//*******************************
具体电路的制作是很简单的,就接了两个电阻,⼀个是10欧姆的背光限流电阻,另⼀个是2K的LCD极板电压调节电阻。这两个电阻的阻值怎么定呢?背光⽐较简单,它就相当于在后⾯接了⼏个发光⼆极管,任何时候你只要在15、16脚串上个100欧的电位器接上电源,调节电位器,觉得亮度合适。此时的阻值便可。LCD液晶极板驱动电压调节电阻的确定就稍微⿇烦⼀点。在各数据线,控制线接好关通
上电源的前提下在第3脚(VEE)和地之间接⼀个10K的电位器。调节电位器。当3脚电压⾼时为全亮,电压为0时为全暗(液晶全显⽰为⿊块)。你⽤电位器把屏幕从全暗刚好调到变亮。这时便可调试程序。待屏幕能正确显⽰后再细调电位器,使对⽐度合适。这时的阻值便可确定,然后换成等值的固定电阻焊上便可。
组装后:
具体电路图:
接⼝说明:
我们从CGROM表上可以看到,在表的最左边是⼀列可以允许⽤户⾃定义的CGRAM,从上往下看着是16个,实际只有8个字节可⽤。它的字符码是00000000-00000111这8个地址,表的下⾯还有8个字节,但因为这个CGRAM的字符码规定0-2位为地址,3位⽆效,4-7全为零。因此CGRAM的字符码只有最后三位能⽤也就是8个字节了。等效为0000X111,X为⽆效位,最后三位为000-111共8个。
自定义函数怎么用c语言如果我们要想显⽰这8个⽤户⾃定义的字符,操作⽅法和显⽰CGROM的⼀样,先设置DDRAM位置,再向DDRAM写⼊字符码,例
如“A”就是41H。现在我们要显⽰CGRAM的第⼀个⾃定义字符,就向DDRAM写⼊00000000B(00H),如果要显⽰第8个就写⼊00000111(08H),简单吧!
现在我们来看怎么向这⼋个⾃定义字符写⼊字模。有个设置CGRAM地址的指令⼤家还记得吗?赶快再出来看看。
从这个指令可以看出指令数据的⾼2位已固定是01,只有后⾯的6位是地址数据,⽽这6位中的⾼3位就表⽰这⼋个⾃定义字符,最后的3位就是字模数据的⼋个地址了。例如第⼀个⾃定义字符的字模地址为01000000-01000111⼋个地址。我们向这8个字节写⼊字模数据,让它能显⽰出“℃”
地址:01000000 数据:00010000 图⽰:○○○■○○○○
01000001 00000110 ○○○○○■■○
01000010 00001001 ○○○○■○○■
01000011 00001000 ○○○○■○○○
01000100 00001000 ○○○○■○○○
01000101 00001001 ○○○○■○○■
01000110 00000110 ○○○○○■■○
01000111 00000000 ○○○○○○○○
可以通过⼿动提取的⽅法。如下图所⽰,对应⼀个字符显⽰区域。每8个字节,组成⼀个点阵数组。
“⽇”的点阵数组即为 {0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00}
“车”字取模数组为:{0x00,0x0f,0x02,0x04,0x07,0x00,0x0f,0x00,
0x10,0x1e,0x00,0x10,0x1c,0x10,0x1e,0x10}
将⽣成的点阵数组保存到CGRAM存储器中,⽣成⾃定义字符。1602内部CGRAM⽤于⾃定义的字符点阵的存储,总共64字节。由上⼀步点阵提取可知,每⼀个字符由8个字节数据组成。所以64字节CGRAM存储器,能够存储8组⾃定义字符的点阵数组。按照CGRAM地址划分为0-7为第⼀组,8-15为第⼆组,依次类推56-63为第8组数据。把⾃定义字符的数组按8个字节⼀组存储到CGRAM中,程序代码参考如下。
//功能:将⾃定义字符的编码数组 写⼊到CGRAM中.
//输⼊:⾃定义字符的编码数组
void Write_CGRAM(unsigned char *p)
{
unsigned char i,j,kk;
unsigned char tmp=0x40; //操作CGRAM的命令码
kk=0;
for(j=0;j<8;j++) //64 字节存储空间,可以⽣成 8 个⾃定义字符点阵
{
for(i=0;i<8;i++) // 8 个字节⽣成 1 个字符点阵
{
Write_com(tmp+i); //操作CGRAM的命令码+写⼊CGRAM地址.
Write_dat(p[kk]); //写⼊数据
kk++;
}
tmp += 8;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论