最新51单片机任意2个IO口驱动LCD1602.docx

上传人:b****6 文档编号:6743461 上传时间:2023-01-09 格式:DOCX 页数:11 大小:1.29MB
下载 相关 举报
最新51单片机任意2个IO口驱动LCD1602.docx_第1页
第1页 / 共11页
最新51单片机任意2个IO口驱动LCD1602.docx_第2页
第2页 / 共11页
最新51单片机任意2个IO口驱动LCD1602.docx_第3页
第3页 / 共11页
最新51单片机任意2个IO口驱动LCD1602.docx_第4页
第4页 / 共11页
最新51单片机任意2个IO口驱动LCD1602.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

最新51单片机任意2个IO口驱动LCD1602.docx

《最新51单片机任意2个IO口驱动LCD1602.docx》由会员分享,可在线阅读,更多相关《最新51单片机任意2个IO口驱动LCD1602.docx(11页珍藏版)》请在冰豆网上搜索。

最新51单片机任意2个IO口驱动LCD1602.docx

最新51单片机任意2个IO口驱动LCD1602

51单片机任意2个IO口驱动LCD1602

51单片机任意2个IO口驱动LCD1602

相信大家对1602显示屏已经十分熟悉,驱动方式有8线制〔需要11根线〕和4线制〔需要7根线〕,这里为大家推荐一种只需要2根线就能驱动1602的方法。

之前在网上见到Arduino通过IIC驱动1602的实例,本人完全不懂Arduino程序,看了一下驱动电路,发现PCF8574这个关键芯片,它就相当于一个桥梁,将IIC总线转换为8位准双向口。

思路

1、单片机通过IIC与PCF8574进行通信。

首先写好IIC通信程序,网上到处都是IIC通信程序,很容易找。

PCF8574的器件地址为40h,由于硬件地址引脚A0-A2可寻址8个器件,所以器件地址并不唯一,具体说明大家去查查PCF8574芯片手册。

2、单片机4线制驱动1602

网上也有很多相关程序,我就不再多说。

4线制驱动方式需要7个IO口〔RS、RW、E和4条数据线〕,而PCF8574提供了8位准双向口,所以管脚还有剩余。

3、IIC通信程序和1602的4线制驱动程序相结合

4、51单片机任意2个IO口驱动1602成功!

〔我只是个业余爱好者,要是各位觉得太低端那就见谅了〕

驱动电路图

效果图

Proteus仿真

程序

#include

#include

sbitSCL=P3^0;

sbitSDA=P3^1;

bitack;

unsignedcharLCD_data;

unsignedcharcodedigit[]={"0123456789"};//定义字符数组显示数字

//*****************延时************************

voiddelay_nus(unsignedintn)//Nus延时函数

{

unsignedinti=0;

for(i=0;i

_nop_();

}

voiddelay_nms(unsignedintn)//Nms延时函数

{

unsignedinti,j;

for(i=0;i

for(j=0;j<1140;j++);

}

voidnop4()

{

_nop_();//等待一个机器周期

_nop_();//等待一个机器周期

_nop_();//等待一个机器周期

_nop_();//等待一个机器周期

}

//***************************************

voidStart()

{

SDA=1;

_nop_();

SCL=1;

nop4();

SDA=0;

nop4();

SCL=0;

_nop_();

_nop_();

}

voidStop()

{

SDA=0;

_nop_();

SCL=0;

nop4();//>4us后SCL跳变

SCL=1;

nop4();

SDA=1;

_nop_();

_nop_();

}

//******************************************

voidWrite_A_Byte(unsignedcharc)

{

unsignedcharBitCnt;

for(BitCnt=0;BitCnt<8;BitCnt++)//要传送的数据长度为8位

{

if((c<

elseSDA=0;

_nop_();

SCL=1;//置时钟线为高,通知被控器开始接收数据位

nop4();

_nop_();

SCL=0;

}

_nop_();

_nop_();

SDA=1;//8位发送完后释放数据线,准备接收应答位

_nop_();

_nop_();

SCL=1;

_nop_();

_nop_();

_nop_();

if(SDA==1)ack=0;

elseack=1;//判断是否接收到应答信号

SCL=0;

_nop_();

_nop_();

}

bitWrite_Random_Address_Byte(unsignedcharadd,unsignedchardat)

{

Start();//启动总线

Write_A_Byte(add);//发送器件地址

if(ack==0)return(0);

Write_A_Byte(dat);//发送数据

if(ack==0)return(0);

Stop();//结束总线

return

(1);

}

//********************液晶屏使能*********************

voidEnable_LCD_write()

{

LCD_data|=(1<<(3-1));//E=1;

Write_Random_Address_Byte(0x40,LCD_data);

delay_nus

(2);

LCD_data&=~(1<<(3-1));//E=0;

Write_Random_Address_Byte(0x40,LCD_data);

}

//*************写命令****************************

voidLCD_write_command(unsignedcharcommand)

{

delay_nus(16);

LCD_data&=~(1<<(1-1));//RS=0;

LCD_data&=~(1<<(2-1));//RW=0;

Write_Random_Address_Byte(0x40,LCD_data);

LCD_data&=0X0f;//清高四位

LCD_data|=command&0xf0;//写高四位

Write_Random_Address_Byte(0x40,LCD_data);

Enable_LCD_write();

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

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

LCD_data|=command&0xf0;//写低四位

Write_Random_Address_Byte(0x40,LCD_data);

Enable_LCD_write();

}

//*************写数据****************************

voidLCD_write_data(unsignedcharvalue)

{

delay_nus(16);

LCD_data|=(1<<(1-1));//RS=1;

LCD_data&=~(1<<(2-1));//RW=0;

Write_Random_Address_Byte(0x40,LCD_data);

LCD_data&=0X0f;//清高四位

LCD_data|=value&0xf0;//写高四位

Write_Random_Address_Byte(0x40,LCD_data);

Enable_LCD_write();

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

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

LCD_data|=value&0xf0;//写低四位

Write_Random_Address_Byte(0x40,LCD_data);

Enable_LCD_write();

}

//**********************设置显示位置*********************************

voidset_position(unsignedcharx,unsignedchary)

{

unsignedcharposition;

if(y==0)

position=0x80+x;

else

position=0xc0+x;

LCD_write_command(position);

}

//**********************显示字符串*****************************

voiddisplay_string(unsignedcharx,unsignedchary,unsignedchar*s)

{

set_position(x,y);

while(*s)

{

LCD_write_data(*s);

s++;

}

}

//*************液晶初始化****************************

voidLCD_init(void)

{

LCD_write_command(0x28);

delay_nus(40);

LCD_write_command(0x28);

delay_nus(40);

Enable_LCD_write();

delay_nus(40);

LCD_write_command(0x28);//4位显示!

LCD_write_command(0x0c);//显示开

LCD_write_command(0x01);//清屏

delay_nms

(2);

}

voidmain(void)

{

LCD_init();

display_string(4,0,"imxuheng");//显示一段文字

display_string(2,1,"HelloToday!

");//显示一段文字

while

(1);

}

程序还不够完美,自身工作与电学没什么关系,只是业余爱好鼓捣鼓捣,希望各位能够提出修改意见。

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

当前位置:首页 > 工程科技 > 纺织轻工业

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

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