📄 read-ds18b20-lcd1602-c51-avr.c
字号:
crc >>= 1;
crc |= 0x80;
}
crcbuff >>= 1;
}
}
return (crc);
}
/*************************************************************/
/* */
/* 数据转换与显示 */
/* */
/*************************************************************/
void Disp_RomCode(void)
{
uchar j;
uchar H_num=0x40; //LCD第二行初始位置
for(j=0;j<8;j++)
{
Temp = RomCode[j];
display[0]=((Temp&0xf0)>>4);
if(display[0]>9)
{ display[0]=display[0]+0x37;}
else{display[0]=display[0]+0x30;}
lcd_pos(H_num);
lcd_wdat(display[0]); //高位数显示
H_num++;
display[1]=(Temp&0x0f);
if(display[1]>9)
{display[1]=display[1]+0x37;}
else {display[1]=display[1]+0x30;}
lcd_pos(H_num);
lcd_wdat(display[1]); //低位数显示
H_num++;
}
}
/*************************************************************/
/* */
/* LCD初始化设定 */
/* */
/*************************************************************/
void lcd_init(void)
{
DDRA=0XFF; //设置PA输出
PORTA=0XFF; //全部加上上拉电阻
DDRC=0XFF; //设置PC为输出
PORTC=0XFF; //全部加上上拉电阻
delay_nms(30); //等待上电稳定
lcd_wcmd(0x38,0); //16*2显示,5*7点阵,8位数据
delay_nms(5);
lcd_wcmd(0x38,0); //不进行忙检测
delay_nms(5);
lcd_wcmd(0x38,0);
delay_nms(5);
lcd_wcmd(0x0c,1); //显示开,关光标
delay_nms(5);
lcd_wcmd(0x06,1); //移动光标
delay_nms(5);
lcd_wcmd(0x01,1); //清除LCD的显示内容
delay_nms(5);
}
/*************************************************************/
/* */
/*写指令数据到LCD */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
/*command为指令,wait_en指定是否要检测LCD忙信号 */
/* */
/*************************************************************/
void lcd_wcmd(uchar command,uchar wait_en)
{
if(wait_en) //若wait_en为1,则要检测LCD忙信号
lcd_busy();
PORTC &=~_BV(LCD_RS);
PORTC &=~_BV(LCD_RW);
PORTC &=~_BV(LCD_EN);
PORTA =command; //送指令数据
PORTC |=_BV(LCD_EN);
_NOP();
_NOP();
PORTC &=~_BV(LCD_EN);
}
/*************************************************************/
/* */
/*写显示数据到LCD */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
/* */
/*************************************************************/
void lcd_wdat(uchar dat)
{
lcd_busy();
PORTC |=_BV(LCD_RS);
PORTC &=~_BV(LCD_RW);
PORTC &=~_BV(LCD_EN);
PORTA=dat; //送显示数据
PORTC |=_BV(LCD_EN);
_NOP();
_NOP();
PORTC &=~_BV(LCD_EN);
}
/*************************************************************/
/* */
/*检查LCD忙状态 */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据 */
/* */
/*************************************************************/
void lcd_busy(void)
{
DDRA &=~_BV(busy); //设置busy口为输入
PORTC &=~_BV(LCD_RS);
PORTC |= _BV(LCD_RW);
PORTC |= _BV(LCD_EN);
while(PINA & _BV(busy)); //忙等待
PORTC &=~_BV(LCD_EN);
DDRA|=_BV(busy); //设置busy口为输出
}
/*************************************************************/
/* */
/* 设定显示位置 */
/* */
/*************************************************************/
void lcd_pos(uchar pos)
{
lcd_wcmd(pos|0x80,1); //数据指针=80+地址变量
}
/*************************************************************/
/* */
/* DS18B20 OK 显示菜单 */
/* */
/*************************************************************/
void Ok_Menu (void)
{
uchar m;
lcd_init(); //初始化LCD
lcd_pos(0); //设置显示位置为第一行的第1个字符
m = 0;
while(cdis1[m] != '\0')
{ //显示字符
lcd_wdat(cdis1[m]);
m++;
}
lcd_pos(0x40); //设置显示位置为第二行第1个字符
m = 0;
while(cdis2[m] != '\0')
{
lcd_wdat(cdis2[m]); //显示字符
m++;
}
}
/*************************************************************/
/* */
/* DS18B20 ERROR 显示菜单 */
/* */
/*************************************************************/
void Error_Menu (void)
{
uchar m;
lcd_init(); //初始化LCD
lcd_pos(0); //设置显示位置为第一行的第1个字符
m = 0;
while(cdis3[m] != '\0')
{ //显示字符
lcd_wdat(cdis3[m]);
m++;
}
lcd_pos(0x40); //设置显示位置为第二行第1个字符
m = 0;
while(cdis4[m] != '\0')
{
lcd_wdat(cdis4[m]); //显示字符
m++;
}
}
/*************************************************************/
/* */
/* 主函数 */
/* */
/*************************************************************/
int main(void)
{
init_io();
while(1)
{
Ok_Menu ();
Read_RomCord(); //读取64位序列码
CRC8(); //CRC效验
if(crc==0) //CRC效验正确
{
Disp_RomCode(); //显示64位序列码
beep(); //蜂鸣器响一声
}
while(!presence) //检测DS18B20是否存在
{
Init_DS18B20();
delay_nms(500);
}
Error_Menu (); //显示错误菜单
do
{
Init_DS18B20();
beep(); //蜂鸣器报警
}
while(presence);
}
}
/*************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -