1602相关知识及四线驱动程序.docx
《1602相关知识及四线驱动程序.docx》由会员分享,可在线阅读,更多相关《1602相关知识及四线驱动程序.docx(9页珍藏版)》请在冰豆网上搜索。
1602相关知识及四线驱动程序
今天在调1602显示的时候又费了点小周折,由于平常我们一般是对液晶进行写操作,所以在有的开发板上这个引脚直接是接地的,今天自己用杜邦线连了个1602忽略了这个问题,后来接地就好了。
数据传输的四线接法和八线接法差别在于写数据的顺序,下面附上四线接法的程序。
[cpp]viewplaincopy/*--------------------------------------------------------------*/
//Name:
LCD1602四线驱动程序
//File:
LCD1602_4.H
//Date:
11-2-9
//TimE:
12:
42
//Ver:
0.1
/*--------------------------------------------------------------*/
#include"reg51.h"
#include
//LCD1602接口定义
#defineLCD_DATAP1//P1口(P14~P17)与LCD高四位(D4~D7)对应相接
sbitLCD1602_RS=P1^2;//数据指令
sbitLCD1602_EN=P1^3;//使能
//延时函数,12mhz6t延迟时间10*255us
voidLCD_init(void);
voidLCD_en_write(void);
voidLCD_write_command(unsignedcharcommand);
voidLCD_write_data(unsignedcharRecdata);
voidLCD_set_xy(unsignedcharx,unsignedchary);
voidLCD_write_string(unsignedcharX,unsignedcharY,unsignedchar*s);
voidLCD_write_char(unsignedcharX,unsignedcharY,unsignedcharRecdata);
voiddelay_nus(unsignedintn);
voiddelay_nms(unsignedintn);
//以下函数用于输出字符串和数字
intLCD_PutNum(unsignedlongnum,intXS,intpos);
intLCD_PutStr(unsignedchar*DData,intpos);
//-------------------------1us延时函数---------------------------------
voiddelay_1us(void)
{
_nop_();
}
//------------------------Nus延时函数---------------------------------
voiddelay_nus(unsignedintn)
{
unsignedinti=0;
for(i=0;i
delay_1us();
}
//-----------------------1ms延时函数----------------------------------
voiddelay_1ms(void)
{
unsignedinti;
for(i=0;i<1140;i++);
}
//-----------------------Nms延时函数---------------------------------
voiddelay_nms(unsignedintn)
{
unsignedinti=0;
for(i=0;i
delay_1ms();
}
//------------------------液晶初始化-----------------------------------
voidLCD_init(void)
{
LCD_write_command(0x28);
delay_nus(40);
LCD_write_command(0x28);
delay_nus(40);
LCD_write_command(0x28);
delay_nus(40);
LCD_en_write();
delay_nus(40);
LCD_write_command(0x28);//4位显示
LCD_write_command(0x0c);//显示开
LCD_write_command(0x01);//清屏
delay_nms
(2);
}
//----------------------液晶使能函数-------------------------------------
voidLCD_en_write(void)
{//EN由高电平跳变到低电平时液晶使能
LCD1602_EN=1;
delay_nus
(1);
LCD1602_EN=0;
}
//------------------------写指令函数--------------------------------------
voidLCD_write_command(unsignedcharcommand)
{
delay_nus(16);
LCD1602_RS=0;//RS=0
LCD_DATA&=0X0f;//清高四位
LCD_DATA|=command&0xf0;//写高四位
LCD_en_write();
command=command<<4;//低四位移到高四位
LCD_DATA&=0x0f;//清高四位
LCD_DATA|=command&0xf0;//写低四位
LCD_en_write();
}
//------------------------写数据函数--------------------------------------
voidLCD_write_data(unsignedcharRecdata)
{
delay_nus(16);
LCD1602_RS=1;//RS=1
LCD_DATA&=0X0f;//清高四位
LCD_DATA|=Recdata&0xf0;//写高四位
LCD_en_write();
Recdata=Recdata<<4;//低四位移到高四位
LCD_DATA&=0X0f;//清高四位
LCD_DATA|=Recdata&0xf0;//写低四位
LCD_en_write();
}
//-----------------------地址定位函数-------------------------------------
voidLCD_set_xy(unsignedcharx,unsignedchary)
{
unsignedcharaddress;
if(y==0)address=0x80+x;
elseaddress=0xc0+x;
LCD_write_command(address);
}
//----------------------在某个地址处,写一个字符----------------------------
voidLCD_write_char(unsignedcharX,unsignedcharY,unsignedcharRecdata)//列x=0~15,行y=0,1
{
LCD_set_xy(X,Y);//写地址
LCD_write_data(Recdata);
}
//----------------------------输出字符串-------------------------------------
intLCD_PutStr(unsignedchar*DData,intpos)//pos表示字符显示位置,0~31
{
unsignedchari;
if(pos==-1)
{
LCD_write_command(0x01);//清屏
delay_nms
(2);
pos=0;
}
while((*DData)!
='')
{
switch(*DData)
{
case'n':
//如果是n,则换行
{
if(pos<17)
{
for(i=pos;i<16;i++)LCD_write_char(i%16,i/16,'');
pos=16;
}
else
{
for(i=pos;i<32;i++)LCD_write_char(i%16,i/16,'');
pos=0;
}
break;
}
case'b':
//如果是b,则退格
{
if(pos>0)pos--;
LCD_write_char(pos%16,pos/16,'');
break;
}
default:
{
if((*DData)<0x20)//小于0x20的显示不了?
{
*DData='';
}
LCD_write_char(pos%16,pos/16,*DData);
pos++;
break;
}
}
DData++;
}
return(pos);
}
//----------------------------输出数字---------------------------------
//这段程序写法我的理解大致是这样:
num为去掉小数点之后的数字,XS为小数点
//从左数第几位,pos为显示的位置
//---------------------------------------------------------------------
intLCD_PutNum(unsignedlongnum,intXS,intpos)
{
unsignedlongtmp=0;
unsignedcharnumbits=0;//总数字位数
if(pos==-1)
{
LCD_write_command(0x01);
delay_nms
(2);
pos=0;
}
if(num==0)
{
LCD_write_char(pos%16,pos/16,'0');
pos++;
}
else
{
if(num<0)
{
LCD_write_char(pos%16,pos/16,'-');
num*=(-1);
pos++;
}
while(num)//例如数字1234,经过这个运算变成了4321
{
tmp=tmp*10+(num%10);
num=num/10;
numbits++;
}
while(tmp)
{
LCD_write_char(pos%16,pos/16,(tmp%10)+48);
tmp=tmp/10;
pos++;
numbits--;
if(numbits==XS)pos=LCD_PutStr(".",pos);//插入小数点
}
while(numbits--)
{
LCD_write_char(pos%16,pos/16,'0');
pos++;
}
}
return(pos);
}
IC网站,电子元器件搜索,ic芯片datasheet搜索: