1602四线八线驱动程序非常完整.docx

上传人:b****1 文档编号:23207383 上传时间:2023-05-15 格式:DOCX 页数:14 大小:16.59KB
下载 相关 举报
1602四线八线驱动程序非常完整.docx_第1页
第1页 / 共14页
1602四线八线驱动程序非常完整.docx_第2页
第2页 / 共14页
1602四线八线驱动程序非常完整.docx_第3页
第3页 / 共14页
1602四线八线驱动程序非常完整.docx_第4页
第4页 / 共14页
1602四线八线驱动程序非常完整.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

1602四线八线驱动程序非常完整.docx

《1602四线八线驱动程序非常完整.docx》由会员分享,可在线阅读,更多相关《1602四线八线驱动程序非常完整.docx(14页珍藏版)》请在冰豆网上搜索。

1602四线八线驱动程序非常完整.docx

1602四线八线驱动程序非常完整

/*--------------------------------------------------------------*/

//防止被重复定义

#ifndef__LCD1602_8A_H__

#define__LCD1602_8A_H__

/*--------------------------------------------------------------*/

//模式选择(条件编译)

#definePort_Type_Select1//=1,选择八位数据模式

//=0,选择四位数据模式,LCD高四位接MCU端口高四位#defineInt_Transfer1//=1,允许中断服务函数调用

//=0,不允许中断服务函数调用

/*--------------------------------------------------------------*/

//LCD1602与单片机接口定义

#defineLCD_IOP0//P0-0x80,P1-0x90,P2-0xA0,P3-0xB0;sbitLCD_RS=P1^0;//LCD数据/命令选择端(H/L)

sbitLCD_RW=P1^1;//LCD读/写选择端(H/L)

sbitLCD_EN=P1^2;//LCD使能控制端

/*--------------------------------------------------------------*/

//工作方式设置

#defineLCD_DISPLAY8_DOUBLE_LINELCD_cmd(0x38);//两行显示8-bits

#defineLCD_DISPLAY8_SINGLE_LINELCD_cmd(0x30);//单行显示8-bits

#defineLCD_DISPLAY4_DOUBLE_LINELCD_cmd(0x28);//两行显示4-bits

#defineLCD_DISPLAY4_SINGLE_LINELCD_cmd(0x20);//单行显示4-bits

/*--------------------------------------------------------------*/

//输入方式设置

#defineLCD_AC_AUTO_INCREMENTLCD_cmd(0x06);//数据读、写操作后,AC自动加1

#defineLCD_AC_AUTO_DECREASELCD_cmd(0x04);//数据读、写操作后,AC自动减1

#defineLCD_MOVE_ENABLELCD_cmd(0x07);//数据读、写操作,画面平移

#defineLCD_MOVE_DISENABLELCD_cmd(0x06);//数据读、写操作,画面不动

/*--------------------------------------------------------------*/

//设置显示、光标及闪烁开、关

#defineLCD_DISPLAY_ONLCD_cmd(0x0c);//LCD开显示

#defineLCD_DISPLAY_OFFLCD_cmd(0x08);//LCD关显示

#defineLCD_CURSOR_ONLCD_cmd(0x0e);//光标显示

#defineLCD_CURSOR_OFFLCD_cmd(0x0c);//光标不显示

#defineLCD_CURSOR_BLINK_ONLCD_cmd(0x0f);//光标闪烁

#defineLCD_CURSOR_BLINK_OFFLCD_cmd(0x0e);//光标不闪烁

#defineLCD_GO_HOMELCD_cmd(0x02);//AC=0,光标、画面回HOME位,DDRAM内容不变

#defineLCD_CLRLCD_cmd(0x01);//LCD清屏,清除DDRAM,清除屏幕,置AC为0,光标回位?

/*--------------------------------------------------------------*/

//光标、画面移动,不影响DDRAM

#defineLCD_LEFT_MOVELCD_cmd(0x18);//LCD显示左移一位

#defineLCD_RIGHT_MOVELCD_cmd(0x1c);//LCD显示右移一位#defineLCD_CURSOR_LEFT_MOVELCD_cmd(0x10);//光标左移一位

#defineLCD_CURSOR_RIGHT_MOVELCD_cmd(0x14);//光标右移一位

/*--------------------------------------------------------------*/

//LCD1602地址相关

/*

#defineLINE1_HEAD0x80//第一行DDRAM起始地址

#defineLINE2_HEAD0xc0//第二行DDRAM起始地址

#defineLINE10//第一行

#defineLINE21//第二行

#defineLINE_LENGTH16//每行的最大字符长度(40-DDRAM)

/*--------------------------------------------------------------*/

//函数声明

voidLCD_busy(void);//检测LCD是否忙

voidLCD_init(void);//LCD初始化

voidLCD_cmd(unsignedcharcmd);//写入指令

voidLCD_dat(unsignedchardat);//写入数据

voidLCD_pos(unsignedcharx,unsignedchary);//显示定位

voidLCD_printc(unsignedcharx,unsignedchary,unsignedcharc);//定位输出字符

voidLCD_prints(unsignedcharx,unsignedchary,unsignedchar*s);//定位输出字符串

voidLCD_printn(unsignedcharx,unsignedchary,unsignedintnum);//定位输出16位二进制数字

unsignedcharLCD_current_addr(void);//读出AC当前地址(DB6~DB0)或忙标志位DB7

unsignedcharLCD_current_addr_dat(void);//读出AC当前地址的数据//unsignedcharLCD_addr_dat(unsignedcharx,unsignedchary);//读出AC指定地址的数据

//voidLCD_pos_CG(unsignedcharx,unsignedchar*CGRAM_dat);//指定地址(x:

0-7)写入8bytes数据CGRAM

/*--------------------------------------------------------------*///读出AC当前地址(DB6~DB0)或忙标志位DB7

#ifPort_Type_Select//选择八位数据模式

unsignedcharLCD_current_addr(void)

{

unsignedcharac_addr;

LCD_EN=0;

LCD_RS=0;//指令

LCD_RW=1;//读出

LCD_IO=0xff;//端口置为输入方式(P0)

LCD_EN=1;

ac_addr=LCD_IO;

LCD_EN=0;

return(ac_addr);

}

#else//选择四位数据模式

unsignedcharLCD_current_addr(void)

{

unsignedcharac_addr;

LCD_EN=0;

LCD_RS=0;//指令

LCD_RW=1;//读出

LCD_IO|=0xf0;//端口置为输入方式(P0)

LCD_EN=1;

ac_addr=LCD_IO&0xf0;//高四位

LCD_EN=0;

LCD_EN=1;

ac_addr|=LCD_IO>>4;//低四位

LCD_EN=0;

return(ac_addr);

}

#endif

/*--------------------------------------------------------------*///检测LCD忙状态

#ifInt_Transfer//允许中断服务函数调用

voidLCD_busy(void)

unsignedcharac_dat;

unsignedcharbusy_flag;

do

{

ac_dat=LCD_current_addr();

busy_flag=ac_dat&0x80;

}while(busy_flag);//=1表示忙,=0表示空闲}

#else//不允许中断服务函数调用

voidLCD_busy(void)

{

unsignedcharac_dat;

bitbusy_flag;

do

{

ac_dat=LCD_current_addr();

busy_flag=(bit)(ac_dat&0x80);

}while(busy_flag);//=1表示忙,=0表示空闲

#endif

///*--------------------------------------------------------------*/////读出AC当前地址的数据

//#ifPort_Type_Select//选择八位数据模式

//unsignedcharLCD_current_addr_dat(void)

//{

//unsignedcharaddr_dat;

////unsignedchari;

//LCD_busy();//或者检查忙最可靠

////for(i=0;i<3;i++)//要连续读出三次才会有效

//{

//LCD_EN=0;

//LCD_RS=1;//数据

//LCD_RW=1;//读出

//LCD_IO=0xff;//端口置为输入方式(P0)

//LCD_EN=1;

//addr_dat=LCD_IO;

//LCD_EN=0;

//}

//return(addr_dat);

//}

//#else//选择四位数据模式

//unsignedcharLCD_current_addr_dat(void)

//{

//unsignedcharaddr_dat;

////unsignedchari;

//LCD_busy();//或者检查忙最可靠

////for(i=0;i<3;i++)//要连续读出三次才会有效//{

//LCD_EN=0;

//LCD_RS=1;//数据

//LCD_RW=1;//读出

//LCD_IO|=0xf0;//端口置为输入方式(P0)

//LCD_EN=1;

//addr_dat=LCD_IO&0xf0;//高四位

//LCD_EN=0;

//LCD_EN=1;

//addr_dat|=LCD_IO>>4;//低四位

//LCD_EN=0;

//}

//return(addr_dat);

//}

//#endif

/*--------------------------------------------------------------*///写入指令

#ifPort_Type_Select//选择八位数据模式

voidLCD_cmd(unsignedcharcmd)

{

LCD_busy();//检测忙

LCD_RS=0;//指令

LCD_RW=0;//写入

LCD_EN=1;

LCD_IO=cmd;//传指令

LCD_EN=0;//下降沿有效

}

#else//选择四位数据模式

voidLCD_cmd(unsignedcharcmd)

{

LCD_busy();//检测忙

LCD_IO&=0x0f;//清高四位

LCD_RS=0;//指令

LCD_RW=0;//写入

LCD_EN=1;

LCD_IO|=cmd&0xf0;//写高四位

LCD_EN=0;//下降沿有效

cmd<<=4;//低四位移到高四位

LCD_IO&=0x0f;//清高四位

LCD_EN=1;

LCD_IO|=cmd&0xf0;//写高四位

LCD_EN=0;//下降沿有效

}

#endif

/*--------------------------------------------------------------*///写入数据

#ifPort_Type_Select//选择八位数据模式voidLCD_dat(unsignedchardat)

{

LCD_busy();//检测忙

LCD_RS=1;//数据

LCD_RW=0;//写入

LCD_EN=1;

LCD_IO=dat;//传数据

LCD_EN=0;//下降沿有效

}

#else//选择四位数据模式

voidLCD_dat(unsignedchardat)

{

LCD_busy();//检测忙

LCD_IO&=0x0f;//清高四位

LCD_RS=1;//数据

LCD_RW=0;//写入

LCD_EN=1;

LCD_IO|=dat&0xf0;//写高四位

LCD_EN=0;//下降沿有效

dat<<=4;//低四位移到高四位

LCD_IO&=0x0f;//清高四位

LCD_EN=1;

LCD_IO|=dat&0xf0;//写高四位

LCD_EN=0;//下降沿有效

}

#endif

/*--------------------------------------------------------------*/

//显示定位DDRAM

voidLCD_pos(unsignedcharx,unsignedchary)

{

if(y)LCD_cmd(x|0xc0);//y=1第二行显示,y=0第一行显示0<=x<16(40-DDRAM)

elseLCD_cmd(x|0x80);//数据指针=80+地址码(00H~27H,40H~67H)}

///*--------------------------------------------------------------*/

////指定地址(x:

0-7)写入8bytes数据CGRAM

//voidLCD_pos_CG(unsignedcharx,unsignedchar*CGRAM_dat)

//{

//unsignedchari;

//x<<=3;//转化为6位数据的高三位,就是x*8;

//x|=0x40;

//LCD_cmd(x);//写入地址

//for(i=0;i<8;i++)

//LCD_dat(CGRAM_dat[i]);//写入数据

//}

///*--------------------------------------------------------------*/

////读出AC指定地址的数据

//unsignedcharLCD_addr_dat(unsignedcharx,unsignedchary)//{

//unsignedcharaddr_dat;

//LCD_pos(x,y);//定位

//addr_dat=LCD_current_addr_dat();//读出数据

//return(addr_dat);

//}

/*--------------------------------------------------------------*/

//定位输出字符

voidLCD_printc(unsignedcharx,unsignedchary,unsignedcharc){

LCD_pos(x,y);

LCD_dat(c);

}

/*--------------------------------------------------------------*/

//定位输出字符串

voidLCD_prints(unsignedcharx,unsignedchary,unsignedchar*s){

LCD_pos(x,y);

while(*s)

{

LCD_dat(*s);

s++;

}

}

/*--------------------------------------------------------------*/

//定位输出16位二进制数字

//0<=num<65536

voidLCD_printn(unsignedcharx,unsignedchary,unsignedintnum){

chari=0;

unsignedcharii=0;

unsignedchardat[6]={0,0,0,0,0,0};

for(i=0;i<6;i++)dat[i]=0;i=0;//初始化数据

while(num/10)//拆位

{

dat[i]=num%10;//最低位

num/=10;i++;

}

dat[i]=num;//最高位

ii=i;//保存dat的位数

for(;i>=0;i--)dat[i]+=48;//转化成ASCII

LCD_prints(x,y,"");//清显示区域

LCD_pos(x,y);

for(i=ii;i>=0;i--)LCD_dat(dat[i]);//输出数字字符

///*--------------------------------------------------------------*/

////定位输出32位二进制数字

////0<=num<65536

//voidLCD_print_long(unsignedcharx,unsignedchary,unsignedlongnum)

//{

//

//chari;

//unsignedcharii;

//unsignedchardat[11];

//for(i=0;i<11;i++)dat[i]=0;i=0;//初始化数据

//while(num/10)//拆位

//{

//dat[i]=num%10;//最低位

//num/=10;i++;

//}

//dat[i]=num;//最高位

//ii=i;//保存dat的位数

//for(;i>=0;i--)dat[i]+=48;//转化成ASCII

//LCD_prints(x,y,"");//清显示区域

//LCD_pos(x,y);

//for(i=ii;i>=0;i--)

//LCD_dat(dat[i]);//输出数字字符

//}

/*--------------------------------------------------------------*/

//LCD初始化

voidLCD_init(void)

{

#ifPort_Type_Select//选择八位数据模式

LCD_DISPLAY8_DOUBLE_LINE//设置LCD为16X2显示,5X7点阵,八位数据接口

#else

LCD_DISPLAY4_DOUBLE_LINE//设置LCD为16X2显示,5X7点阵,四位数据接口

#endif

LCD_AC_AUTO_INCREMENT//LCD显示光标移动设置(光标地址指针加1,整屏显示不移动)

LCD_DISPLAY_ON//LCD开显示及光标设置(光标不闪烁,不显示"_")

LCD_CLR//清屏

}

/*--------------------------------------------------------------*/#endif

 

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

当前位置:首页 > 考试认证 > 交规考试

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

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