编程技术分享平台

网站首页 > 技术教程 正文

PROTEUS仿真DHT11(1)(proteus仿真dht11一直为0)

xnh888 2024-11-03 15:46:54 技术教程 28 ℃ 0 评论

1、 LCD1602模块,实现功能:在LCD1602指定地方显示字符、数字、字符串、printf函数重映射。

1.1在Keil 4中点击菜单Manage->Component(或者点击下图所示菜单栏中的按钮),在弹出的对话框Groups选项中添加LCD1602组。



同时在项目文件夹下创建LCD1602文件夹,用于存放LCD1602.c和.h文件,然后再在LCD1602组中添加LCD1602.c文件,如图所示。


1.2、在LCD1602.h中申明接口函数:

void lcd_init(); //LCD1602初始化函数

void lcd_showstr(uint x, uint y, uchar * str); //在x,y位置显示字符串

void lcd_showchar(uint x, uint y, uchar ch); //在x,y位置显示字符

void lcd_shownum(uint x, uint y, int num,uint count); //在x,y位置显示无符号数字

1.3、完成上述接口函数的代码。此处需要根据LCD1602手册中的读写操作时序,编写代码完成写指令、写数据等基本操作,这些基本操作不对外开放,因此不需在.h文件中申明。.h文件中申明的函数调用这些基本操作完成初始化、显示字符字符串等功能。

1)、在.c文件中首先申明控制LCD的针脚,本例中使用端口P3的5-7针脚,对应LCD允许、读写、数据指令。代码如下:

sbit LCD_EN = P3^5; //LCD允许

sbit LCD_RW = P3^6; //LCD读写,H:读,L:写

sbit LCD_RS = P3^7; //LCD指令数据,H为数据,L为指令

2)、完成写指令基本操作(此函数不在.h中申明,外部不能调用):

void lcd_sendcmd(uchar command)

{

LCD_EN = 0; // LCD允许置0,此时不允许

LCD_RS = 0; //RS端口置0,表示即将交互的是指令

LCD_RW = 0; //RW置0,表示写入LCD

P2 = command; //设置8位并行数据,电气原理图P2连接LCDDB0-8

delay_ms(5); //延时5ms

LCD_EN = 1; //数据准备好之后使能LCD

delay_ms(5); //延时5ms

LCD_EN = 0; //LCD允许端口置0,在数据写入并延时后失能LCD。

//上述过程参照芯片厂商给出的时序图完成。

}

3)、完成写数据基本操作(此函数不在.h中申明,外部不能调用):

void lcd_senddate(uchar date)

{

LCD_EN = 0; //LCD使能,此时LCD不允许数据交互

LCD_RS = 1; //RS端口置0,表示 即将交互的为数据

LCD_RW = 0; //RW置0,表示写入LCD

P2 = date; //设置8位并行数据,电气原理图P2连接LCDDB0-8

delay_ms(5); //延时5ms

LCD_EN = 1; //数据及设置准备好之后,使能LCD进行数据交互

delay_ms(5); //延时5ms

LCD_EN = 0; //交互完成使能LCD。

//上述过程参照芯片厂商给出的时序图完成。

}

4)、完成初始化接口函数代码(此函数在.h文件中申明,外部可以调用):

void lcd_init()

{

LCD_EN = 0; //在进行数据准备工作前将LCD失能,防止程序运行发生意外。

lcd_sendcmd(0x38); //设置16*2显示,5*7点阵,8位数据接口。

lcd_sendcmd(0x0c); //设置开显示,不显示光标

lcd_sendcmd(0x06); //写入一个8位数据后,光标自动加1,或者说显示地

//址自动加1

lcd_sendcmd(0x01); //显示清0,数据指针清0

//函数中指令码请参照LCD1602数据手册。

}

5)、完成显示字符串接口函数代码(此函数在.h文件中申明,外部可以调用,其余的接口函数此处不一一列出):

void lcd_showstr(uint x, uint y, uchar * str)

{

if(y>1 || x>16)

{

//输入参数错误,此处暂时不添加代码,在serial模块完成之后,可以调

//用printf函数将错误信息输出到串口显示在电脑屏幕上。

return;

}

lcd_sendcmd(0x80+x+y*0x40);//设置数据指针起点,也就是显示的位置

while(*str != '\0')

{

lcd_senddate(*str); //发送显示的数据

str++; //字符串指针自增

}

}

6)、知识点:

a、字符串其实是由字符组成的数组;编译器会在字符串末尾添加’\0’表示字符串结束,因此上面函数中使用while(*str != '\0')来判断字符串是否结束。

b、上述lcd_showstr函数形参变量类型uint、uchar在头文件reg52.h中进行了定义,#define uchar unsigned char;#define uint unsigned int。如果没有定义,此函数中uint应该修改为unsigned int ;uchar应修改为unsigned char。

c、delay_ms函数在模块delay模块中由其他人员完成。此处只需要包含delay.h文件并且调用即可,充分体现了模块化编程的优势。

d、在lcd1602.h文件中按照惯例使用#ifndef #endif包含所写代码,防止重复包含造成的编译器报错。

#ifndef __LCD1602_H_

#define __LCD1602_H_

//此处为.h文件的内容。

#endif

e、在模块编制完成之后自行创建mian函数进行调试,调试完成后只需编写接口函数调用手册即可。别人根据手册对应函数即可完成LCD的各种显示功能。即使在别的项目中只要包含了LCD1602.h和.c文件,几乎不需要进行修改就能直接使用。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表