lcd刷新慢_LCD1602刷新率很慢的问题

该博客主要探讨了LCD1602显示器出现刷新慢的问题,通过提供精确的延时函数Lcd1602_Delay1ms进行优化,并展示了如何向LCD写入命令和数据的详细函数,包括LcdWriteCom和LcdWriteData,以提高刷新率。

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

#include"lcd.h"

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

* 函 数 名         : Lcd1602_Delay1ms

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

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

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写入一个字节的命令

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

#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_Delay1ms(1);

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

Lcd1602_Delay1ms(1);

LCD1602_E = 1;         //写入时序

Lcd1602_Delay1ms(5);

LCD1602_E = 0;

}

#endif

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

* 函 数 名         : LcdWriteData

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

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

#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

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

选择写入位置

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

void SelectPosition(unsigned char x,unsigned char y)

{

if (x == 0)

{

LcdWriteCom(0x80 + y);     //表示第一行

}

else

{

LcdWriteCom(0xC0 + y);      //表示第二行

}

}

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

写入字符串函数

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

void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)

{

SelectPosition(x,y) ;

while (*s)                                   //*s表示s是一个指针。*s表示s指针指向的相应变量的值

{

LcdWriteData( *s);

s ++;

}

}

//========================================================================

// 函数: void LCD_Write_Char(uchar x,uchar y,uint s,uchar l)

// 应用: LCD_Write_Char(0,1,366,4) ;

// 描述: 在第0行第一个字节位置显示366的后4位,显示结果为 0366

// 参数: x:行,y:列,s:要显示的字,l:显示的位数

//========================================================================

void LCD_Write_Char(uchar x,uchar y,uint s,uchar l)

{

SelectPosition(x,y) ;

if(l>=5)

LcdWriteData(0x30+s/10000%10);        //万位

if(l>=4)

LcdWriteData(0x30+s/1000%10);                //千位

if(l>=3)

LcdWriteData(0x30+s/100%10);                //百位

if(l>=2)

LcdWriteData(0x30+s/10%10);                        //十位

if(l>=1)

LcdWriteData(0x30+s%10);                //个位

}

/*显示函数1*/

void Display1(wendu,yanwu,pm25,jiaquan) //温度,烟雾,PM2.5,甲醛

{

//时时温度

LCD_Write_Char(0,6,wendu/10,2);

LcdWriteData('.');

LCD_Write_Char(0,9,wendu%10,1);

//时时烟雾

LCD_Write_Char(0,13,yanwu,3);

//时时pm25

LCD_Write_Char(1,6,pm25,3);

//时时甲醛

LCD_Write_Char(1,13,jiaquan,3);

}

/*显示函数2*/

void Display2(yushe_wendu,yushe_yanwu,yushe_pm25,yushe_jiaquan)

{

//显示预设温度

LCD_Write_Char(0,6,yushe_wendu,2);

//显示预设烟雾

LCD_Write_Char(0,13,yushe_yanwu,3);

//显示预设PM2.5

LCD_Write_Char(1,6,yushe_pm25,3);

//显示预设甲醛

LCD_Write_Char(1,13,yushe_jiaquan,3);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值