4.2 LCD显示模块程序设计 4.2.1模块简介
液晶显示部分主要显示“bi ye she ji”和所检测的距离。显示开始先对LCD初始化,把LCD定位到首行首列,然后显示字符“bi ye she ji”到第一行,LCD第二行,显示字符“juli:X.XX MM”。当测量距离超过超声波模块的最大测量范围时,显示“ju li:-.--MM”。程序流程图如图4.2所示。
图4.2 显示模块程序流程图
4.2.2程序代码
写数据函数:该函数主要用于向1602发送数据,参数WDLCM为需要传送的数据
voidWriteDataLCM(unsigned char WDLCM) { }
ReadStatusLCM(); //检测忙 LCM_Data = WDLCM; LCM_RS = 1; LCM_RW = 0;
LCM_E = 0; //若晶振速度太高可以在这后加小的延时 LCM_E = 0; //延时 LCM_E = 1;
写指令函数:该函数主要功能为向1602写入用户指令,指令码通过参数WCLCM传送,参数BuysC为1602显示器忙信号,用于检测1602是否处于忙状态。
void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
{
if (BuysC) ReadStatusLCM(); //根据需要检测忙 LCM_Data = WCLCM; LCM_RS = 0;
16
}
LCM_RW = 0; LCM_E = 0; LCM_E = 0; LCM_E = 1;
读数据函数
unsigned char ReadDataLCM(void) { } //读状态
unsigned char ReadStatusLCM(void) { }
初始化函数:该函数主要用于对1602显示器的初始化,例如显示模式的设置,设置屏显,光标设置等等。
void LCMInit(void) //LCM初始化 {
LCM_Data = 0;
WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号 Delay5Ms();
17
LCM_RS = 1; LCM_RW = 1; LCM_E = 0; LCM_E = 0; LCM_E = 1; return(LCM_Data);
LCM_Data = 0xFF; LCM_RS = 0; LCM_RW = 1; LCM_E = 0; LCM_E = 0; LCM_E = 1;
while (LCM_Data& Busy); //检测忙信号 return(LCM_Data);
}
WriteCommandLCM(0x38,0); Delay5Ms();
WriteCommandLCM(0x38,0); Delay5Ms();
WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号 WriteCommandLCM(0x08,1); //关闭显示 WriteCommandLCM(0x01,1); //显示清屏
WriteCommandLCM(0x06,1); // 显示光标移动设置 WriteCommandLCM(0x0c,1); // 显示开及光标设置
字符显示函数:该函数主要用于在1602指定位置显示一个字符,字符的位置通过坐标X,Y确定,其中X为列坐标,Y为行坐标。参数Ddata 为需要具体显示的字符。
voidDisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{ }
字符串显示函数:该函数主要用于在1602中显示字符串,坐标通过参数X.Y确定,其中X为列坐标,Y为行坐标。字符串通过指针Ddata确定。
voidDisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{
ListLength = 0;
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
18
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1 if (Y) X |= 0x40; //当要显示第二行时地址码+0x40; X |= 0x80; //算出指令码
WriteCommandLCM(X, 1); //发命令字 WriteDataLCM(DData); //发数据
unsigned char ListLength;
个字符
}
while (DData[ListLength]>0x19) //若到达字串尾则退出
{ }
if (X <= 0xF) //X坐标应小于0xF
{ }
DisplayOneChar(X, Y, DData[ListLength]); //显示单ListLength++; X++;
4.3超声波测距模块程序设计 4.3.1模块简介
该模块主要用于驱动超声波模块,实现启动模块,读取超声波模块回送信号的作用,并根据超声波测距原理计算出障碍物的距离。为1602显示提供实时数据。
4.3.2模块代码
模块启动函数:该函数主要是为超声波硬件模块提供启动时需要的10us的高电平。
void StartModule() {
TX=1;
//启动一次模块
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
19
//启动模块
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); TX=0;
}
测距函数:该函数主要用于计算实际测得的距离,通过单片机的时钟测得的时间与声波在空气中的传播速度计算求得。实际的距离通过参数S返回。
unsigned long Conut(void) {
time=TH0*256+TL0; TH0=0; TL0=0;
return S = (time*1.7)/100; //算出来是CM }
距离显示函数:该函数主要用于对采集回来的数据与模块可提供的准确测距范围进行比对,如果超出量程则显示-.- -,如果在精度范围内则显示具体的数据。显示需要的数据通过参数S传入。
void display(unsigned long S) {
if((S>=700)||flag==1) //超出测量范围显示“-” { flag=0;
DisplayOneChar(6, 1, ASCII[11]); DisplayOneChar(7, 1, ASCII[10]); DisplayOneChar(8, 1, ASCII[11]);
20
//显示点