lcd4linux 1602,LCD1602 4位数据总线的液晶显示单片机源程序

本文介绍了如何在12MHz晶振的单片机中实现LCD1602液晶屏的延时函数Lcd1602_Delay1ms,以及针对不同LCD1602接线方式的写入命令和数据的LcdWriteCom和LcdWriteData函数。核心内容包括了LCD初始化过程和针对4位和8位总线模式的区别处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include "lcd.h"

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

* 函 数 名         : Lcd1602_Delay1ms

* 函数功能                   : 延时函数,延时1ms

* 输    入         : c

* 输    出         : 无

* 说    名         : 该函数是在12MHZ晶振下,12分频单片机的延时。

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

void Lcd1602_Delay1ms(uint c)   //误差 0us

{

uchar a,b;

for (; c>0; c--)

{

for (b=199;b>0;b--)

{

for(a=1;a>0;a--);

}

}

}

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

* 函 数 名         : LcdWriteCom

* 函数功能                   : 向LCD写入一个字节的命令

* 输    入         : com

* 输    出         : 无

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

#ifndef         LCD1602_4PINS         //当没有定义这个LCD1602_4PINS时

void LcdWriteCom(uchar com)          //写入命令

{

LCD1602_E = 0;     //使能

LCD1602_RS = 0;           //选择发送命令

LCD1602_RW = 0;           //选择写入

LCD1602_DATAPINS = com;     //放入命令

Lcd1602_Delay1ms(1);                //等待数据稳定

LCD1602_E = 1;                  //写入时序

Lcd1602_Delay1ms(5);          //保持时间

LCD1602_E = 0;

}

#else

void LcdWriteCom(uchar com)          //写入命令

{

LCD1602_E = 0;         //使能清零

LCD1602_RS = 0;         //选择写入命令

LCD1602_RW = 0;         //选择写入

LCD1602_DATAPINS = com;        //由于4位的接线是接到P0口的高四位,所以传送高四位不用改

Lcd1602_Delay1ms(1);

LCD1602_E = 1;         //写入时序

Lcd1602_Delay1ms(5);

LCD1602_E = 0;

LCD1602_DATAPINS = com << 4; //发送低四位

Lcd1602_Delay1ms(1);

LCD1602_E = 1;         //写入时序

Lcd1602_Delay1ms(5);

LCD1602_E = 0;

}

#endif

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

* 函 数 名         : LcdWriteData

* 函数功能                   : 向LCD写入一个字节的数据

* 输    入         : dat

* 输    出         : 无

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

#ifndef         LCD1602_4PINS

void LcdWriteData(uchar dat)                        //写入数据

{

LCD1602_E = 0;        //使能清零

LCD1602_RS = 1;        //选择输入数据

LCD1602_RW = 0;        //选择写入

LCD1602_DATAPINS = dat; //写入数据

Lcd1602_Delay1ms(1);

LCD1602_E = 1;   //写入时序

Lcd1602_Delay1ms(5);   //保持时间

LCD1602_E = 0;

}

#else

void LcdWriteData(uchar dat)                        //写入数据

{

LCD1602_E = 0;          //使能清零

LCD1602_RS = 1;          //选择写入数据

LCD1602_RW = 0;          //选择写入

LCD1602_DATAPINS = dat;        //由于4位的接线是接到P0口的高四位,所以传送高四位不用改

Lcd1602_Delay1ms(1);

LCD1602_E = 1;          //写入时序

Lcd1602_Delay1ms(5);

LCD1602_E = 0;

LCD1602_DATAPINS = dat << 4; //写入低四位

Lcd1602_Delay1ms(1);

LCD1602_E = 1;          //写入时序

Lcd1602_Delay1ms(5);

LCD1602_E = 0;

}

#endif

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

* 函 数 名       : LcdInit()

* 函数功能                 : 初始化LCD屏

* 输    入       : 无

* 输    出       : 无

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

#ifndef                LCD1602_4PINS

void LcdInit()                                                  //LCD初始化子程序

{

LcdWriteCom(0x38);  //开显示

LcdWriteCom(0x0c);  //开显示不显示光标

LcdWriteCom(0x06);  //写一个指针加1

LcdWriteCom(0x01);  //清屏

LcdWriteCom(0x80);  //设置数据指针起点

}

#else

void LcdInit()                                                  //LCD初始化子程序

{

LcdWriteCom(0x32);         //将8位总线转为4位总线

LcdWriteCom(0x28);         //在四位线下的初始化

LcdWriteCom(0x0c);  //开显示不显示光标

LcdWriteCom(0x06);  //写一个指针加1

LcdWriteCom(0x01);  //清屏

LcdWriteCom(0x80);  //设置数据指针起点

}

#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值