delay(5); lcden=0;
}
void lcd_init(){ lcden=0;
write_com(0x38); // write_com(0x0c); // write_com(0x06); // write_com(0x01); //}
void displaynum(uchar temp){ write_com(0x80+0x40); // write_dat(temp/10+0x30); // write_dat(0x2e);
write_dat(temp+0x30);
}
void displaynum2(uchar temp){ write_com(0x80+0x44); write_dat(temp/10+0x30); write_dat(0x2e);
write_dat(temp+0x30);
}
void displaynum3(uchar temp){
write_com(0x80+0x48);
设置16*2显示,5*7点阵,8位数据接口开显示,不现实光标 写一个字符后地址加一 显示清零,指针清零
显示位置第二行 数字变换为ASCII码 15
}
write_dat(temp/10+0x30); write_dat(temp+0x30);
void displayword(uchar *temp){ }
说明:write_com子程序用于向1602写入指令(rs=0),write_dat子程序用于向1602写入数据(rs=1)。lcd_init子程序通过向lcd1602写入一系列指令来完成初始化工作。其余子程序分别在不同位置显示数字或字母。需要注意的是,数字需要经过ASCII译码方可正确显示,LCD1602内部RAM缓冲区如图4-5所示。
write_com(0x80); //显示位置第一行 while(*temp != 0){ write_dat(*temp); temp++; }
图 4-5
向0x00-0x0F和0x40-0x4F区域写入显示数据可立即显示在LCD1602的第一、第二行上,写入到其他地址则需要通过移屏指令移入可显示区域。本设计只使用前者。
16
4.4 温度测量程序
温度检测子程序的主要功能是读出RAM中的2字节温度数据,并计算声速。其程序流程图如图4-6所示
图 4-6
温度检测源程序如下: void dswrite(uchar dat) {
17
uint i; uchar j; bit testb; for(j=1;j<=8;j++) {
testb=dat&0x01; dat=dat>>1; if(testb) { DS=0;
i++;i++; DS=1;
i=8;while(i>0)i--; } else {
DS=0; i=8;while(i>0)i--; DS=1; i++;i++; } } }
uchar dsread(void) {
uchar i,j,dat; dat=0;
18
for(i=1;i<=8;i++) {
j=dsreadbit();
dat=(j<<7)|(dat>>1);
}
return(dat); }
bit dsreadbit(void) {
uint i; bit dat;
DS=0;i++; DS=1;i++;i++; dat=DS;
i=8;while(i>0)i--; return (dat); }
void dsreset(void) {
uint i; DS=0; i=103;
while(i>0)i--; DS=1; i=4;
while(i>0)i--;
19