内容发布更新时间 : 2024/12/26 3:24:47星期一 下面是文章的全部内容请认真阅读。
/*****************************************************************************/ Name: LCD1602+US-100+STC89C52 HC-SR04 超声波测距模块串口程序 晶振:11.0592M Designed by : 庶野琴风 Date:2016/08/11 QQ: 397739038 接线:模块TRIG接 P3.1 ECH0 接P3.0 RS(CS) 接 P2.0; RW(SID) 接 P2.1; E(SCLK) 接 P2.2; BF 接 P0.7; /*****************************************************************************/ #include
#define nops {_nop_();_nop_();_nop_();_nop_();}
/******************************引脚及变量的定义****************************/ sbit RS = P2^0; //寄存器选择位 sbit RW = P2^1; //读取选择位 sbit E = P2^2; //使能信号位 sbit BF = P0^7; //忙碌信号位
unsigned char code Tab[] = {\
unsigned char code string[] = {\char part,ge,shi,bai;
char idata GLengthLoh[2]; //接收缓冲区 bit success_flag; //定义测试成功标志位
/*********************************************************/ /*********函数名称:delay1ms(void) ******************/ /*********函数功能:延时1毫秒 ******************/ /*********函数参数:void ******************/ /*********************************************************/ void delay1ms(void) //误差 -0.651041666667us {
char a,b;
for(b=102;b>0;b--) for(a=3;a>0;a--); }
/*********************************************************/ /*********函数名称:delaynms(char n) ******************/
/*********函数功能:延时n个1毫秒 ******************/ /*********函数参数:n ******************/ /*********************************************************/ void delaynms(char n) {
char a; for(a = 0;a > n;a--) delay1ms(); }
/*********************************************************/ /*********函数名称:BusyTest(void) ******************/ /*********函数功能:判断液晶模块忙碌状态******************/ /*********函数参数:返回值:result ******************/
/*********************************************************/ unsigned char BusyTest() {
bit result; RS = 0; RW = 1; //RS为低电平,RW为高电平时,可以读状态 E = 1; //使能为高电平时可读取信息 nops; //延时40us,给硬件反应时间 result = BF; //将忙碌标志位电平赋给result E = 0; //使能1到0:执行指令 return result; }
/*********************************************************/ /*********函数名称:WriteInstruction(char dictate)*******/
/*********函数功能:将模式设置指令或显示地址写入液晶模块**/ /*********函数参数:dictate ******************/ /*********************************************************/ void WriteInstruction(char dictate) {
while(BusyTest() == 1); //如果忙碌标志位忙碌则等待 RS = 0; RW = 0; //RS/RW位同时为低电平时可写入指令 E = 0; //使能0到1:写入指令 nops; P0 = dictate; //将数据送入P0口,写入数据或地址 nops; E = 1; //使能0到1:写入指令 nops; E = 0; //使能1到0:执行指令 }
/*********************************************************/ /*********函数名称:WriteAddress(char x) *******/ /*********函数功能:指定字符显示的实际地址 ***********/ /*********函数参数:x ******************/ /*********************************************************/ void WriteAddress(char x)
{
WriteInstruction(x|0x80); //80H+地址码 }
/*********************************************************/ /*********函数名称:WriteData(char y) *******/ /*********函数功能:将数据(字符的标准ASCII码)写入液晶模块*/ /*********函数参数:y ******************/ /*********************************************************/ void WriteData(char y) {
while(BusyTest() == 1); //如果忙碌标志位忙碌则等待 RS = 1;
RW = 0; //RS为高电平,RW为低电平时,可以写入数据 E = 0; P0 = y; nops; E = 1; nops; E = 0; }
/*********************************************************/ /*********函数名称:LCDInit(void) *******/ /*********函数功能:液晶模块初始化 ****************/ /*********函数参数:void ******************/ /*********************************************************/ void LCDInit(void) {
delaynms(15); //延时15毫秒,首次写入液晶指令应给反应时间 WriteInstruction(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口 delaynms(5); //延时5秒,反应时间 WriteInstruction(0x38); delaynms(5); //延时5秒,反应时间 WriteInstruction(0x38); delaynms(5); //连续三次,确保初始化成功 WriteInstruction(0x0c); //显示模式设置:显示开,无光标,光标不闪烁 delaynms(5); WriteInstruction(0x06); //显示模式设置:显示光标右移,屏幕不移动 delaynms(5); WriteInstruction(0x01); //清屏 delaynms(5); }
/*********************************************************/ /*********函数名称:UART_Send(char dat) *******/ /*********函数功能:串口发送函数 ****************/