您的位置 首页 厂商

克己单片机之五(2)……LCD1602的驱动

具体电路的制作是很简单的,就接了两个电阻,一个是10欧姆的背光限流电阻,另一个是2K的LCD极板电压调节电阻。这两个电阻的阻值怎么定呢?…

详细电路的制造是很简略的,就接了两个电阻,一个是10欧姆的背光限流电阻,另一个是2K的LCD极板电压调理电阻。这两个电阻的阻值怎样定呢?背光比较简略,它就相当于在后边接了几个发光二极管,任何时候你只要在15、16脚串上个100欧的电位器接上电源,调理电位器,觉得亮度适宜。此刻的阻值便可。LCD液晶极板驱动电压调理电阻的确认就略微费事一点。在各数据线,控制线接好关通上电源的条件下在第3脚(VEE)和地之直接一个10K的电位器。调理电位器。当3脚电压高时为全亮,电压为0时为全暗(液晶全显现为黑块)。你用电位器把屏幕从全暗刚好调到变亮。这时便可调试程序。待屏幕能正确显现后再细调电位器,使对比度适宜。这时的阻值便可确认,然后换成等值的固定电阻焊上便可。

咱们接着前次的体系板制做:

新买的1602LCD,20元,贵不?
不和:
拼装后:

详细电路图:

接口阐明:

运转:
用户自界说字符的使用:
咱们从CGROM表上能够看到,在表的最左面是一列能够答应用户自界说的CGRAM,从上往下看着是16个,实践只要8个字节可用。它的字符码是00000000-00000111这8个地址,表的下面还有8个字节,但由于这个CGRAM的字符码规则0-2位为地址,3位无效,4-7全为零。因而CGRAM的字符码只要最终三位能用也便是8个字节了。等效为0000X111,X为无效位,最终三位为000-111共8个。
假如咱们要想显现这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个自界说字符显现出一个心的图画:
# include
unsigned char table1[]={0x03,0x07,0x0f,0x1f,0x1f,0x1f,0x1f,0x1f,
0x18,0x1E,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,
0x07,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,
0x10,0x18,0x1c,0x1E,0x1E,0x1E,0x1E,0x1E,
0x0f,0x07,0x03,0x01,0x00,0x00,0x00,0x00,
0x1f,0x1f,0x1f,0x1f,0x1f,0x0f,0x07,0x01,
0x1f,0x1f,0x1f,0x1f,0x1f,0x1c,0x18,0x00,
0x1c,0x18,0x10,0x00,0x00,0x00,0x00,0x00};//心图画
unsigned char table[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};//字符℃

#define CLEARSCREEN LCD_write_command(0x01)
/**************界说接口************************/
#define LCDIO P2
sbit LCD1602_RS=P3^0;
sbit LCD1602_RW=P3^1;
sbit LCD1602_EN=P3^2;
/**************界说函数************************/
void LCD_write_command(unsigned char command);//写入指令函数
void LCD_write_dat(unsigned char dat);//写入数据函数
void LCD_set_xy( unsigned char x, unsigned char y );//设置显现方位函数
void LCD_dsp_char( unsigned x,unsigned char y,unsigned char dat);//显现一个字符函数
void LCD_dsp_string(unsigned char X,unsigned char Y,unsigned char *s);//显现字符串函数
void LCD_init(void);//初始化函数
void delay_nms(unsigned int n);//延时函数
/********************************************/
/************初始化函数****************/
void LCD_init(void)
{
CLEARSCREEN;//clear screen
LCD_write_command(0x38);//set 8 bit data transmission mode
LCD_write_command(0x0c);//open display (enable lcd display)
LCD_write_command(0x80);//set lcd first display address
CLEARSCREEN;//clear screen
}
/****************************************************/
/**************写指令函数********************************/
void LCD_write_command(unsigned char command)
{
LCDIO=command;
LCD1602_RS=0;
LCD1602_RW=0;
LCD1602_EN=0;
LCD1602_EN=1;
delay_nms(10);
}
/***************************************************/
/****************写数据函数************************/
void LCD_write_dat(unsigned char dat)
{
LCDIO=dat;
LCD1602_RS=1;
LCD1602_RW=0;
LCD1602_EN=0;
delay_nms(1);
LCD1602_EN=1;
}
/****************************************************/
/***************设置显现方位**************************/
void LCD_set_xy( unsigned char x, unsigned char y )
{
unsigned char address;
if (y == 1)
address = 0x80 + x;
else
address =0xc0+ x;
LCD_write_command(address);
}
/***************************************************/
/****************显现一个字符**********************/
void LCD_dsp_char( unsigned x,unsigned char y,unsigned char dat)
{
LCD_set_xy( x, y );
LCD_write_dat(dat);
}
/**********************************************/
/***************显现字符串函数***************/
void LCD_dsp_string(unsigned char X,unsigned char Y,unsigned char *s)
{
LCD_set_xy( X, Y );
while (*s)
{
LCD_write_dat(*s);
s ++;
}
}
/***********************************************/
/********** 延时**********************/
void delay_nms(unsigned int n)
{
unsigned int i=0,j=0;
for (i=n;i>0;i–)
for (j=0;j<10;j++);
}
/**************************************/
/***********主函数**************/
void main(void)
{
unsigned char i,j,k,tmp;
LCD_init();
delay_nms(100);
tmp=0x40;//设置CGRAM地址的格局字
k=0;
for(j=0;j<8;j++)
{
for(i=0;i<8;i++)
{
LCD_write_command(tmp+i); // 设置自界说字符的 CGRAM 地址
delay_nms(2);
LCD_write_dat(table1[k]); // 向CGRAM写入自界说字符表的数据
k++;
delay_nms(2);
}
tmp=tmp+8;
}
LCD_dsp_string(1,1,”LCD TEST “);//在榜首行榜首列显现“LCD TEST”
LCD_dsp_string(1,2,”SUCCESSFUL “);//在第二行榜首列显现“SUCCESSFUL”
for (i=0;i<4;i++)
{
LCD_dsp_char( 12+i,1,i);//在榜首行第12列方位显现心图画的上半部
delay_nms(1);
}
for (i=4;i<8;i++)
{
LCD_dsp_char( 12+i-4,2,i);在第二行第12列方位显现心图画的下半部
delay_nms(1);
}
while (1);
}
/********************************************************************/
实践效果如图:

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/272068.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部