1602相关知识及四线驱动程序.docx

上传人:b****6 文档编号:5255018 上传时间:2022-12-14 格式:DOCX 页数:9 大小:82.18KB
下载 相关 举报
1602相关知识及四线驱动程序.docx_第1页
第1页 / 共9页
1602相关知识及四线驱动程序.docx_第2页
第2页 / 共9页
1602相关知识及四线驱动程序.docx_第3页
第3页 / 共9页
1602相关知识及四线驱动程序.docx_第4页
第4页 / 共9页
1602相关知识及四线驱动程序.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

1602相关知识及四线驱动程序.docx

《1602相关知识及四线驱动程序.docx》由会员分享,可在线阅读,更多相关《1602相关知识及四线驱动程序.docx(9页珍藏版)》请在冰豆网上搜索。

1602相关知识及四线驱动程序.docx

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搜索:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 家庭教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1