📄 ds18b20-lcd1602-c51-avr.c
字号:
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+地址变量
}
/*******************************************************************/
/* */
/*自定义字符写入CGRAM */
/* */
/*******************************************************************/
void writetab(void)
{
uchar i;
lcd_wcmd(0x40,1); //写CGRAM
for (i = 0; i< 8; i++)
lcd_wdat(mytab[i]);
}
/*******************************************************************/
/* */
/* 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++;
}
writetab(); //自定义字符写入CGRAM
delay_nms(5);
lcd_pos(0x0d);
lcd_wdat(0x00); //显示自定义字符
lcd_pos(0x40); //设置显示位置为第二行第1个字符
m = 0;
while(cdis2[m] != '\0')
{
lcd_wdat(cdis2[m]); //显示字符
m++;
}
lcd_pos(0x4d);
lcd_wdat(0x00); //显示自定义字符
}
/*******************************************************************/
/* */
/* 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++;
}
}
/*******************************************************************/
/* */
/* 数据转换与温度显示 */
/* */
/*******************************************************************/
void Disp_Temperature(uchar x)
{
display[4]=temp_data[0]&0x0f;
display[0]=ditab[display[4]]+0x30; //查表得小数位的值
display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
display[3]=display[4]/100+0x30;
display[1]=display[4]%100;
display[2]=display[1]/10+0x30;
display[1]=display[1]%10+0x30;
if(display[3]==0x30) //高位为0,不显示
{
display[3]=0x20;
if(display[2]==0x30) //次高位为0,不显示
display[2]=0x20;
}
if(x==1)
{
lcd_pos(0x48); //在LCD第二行显示
lcd_wdat(display[3]); //百位数显示
lcd_pos(0x49);
lcd_wdat(display[2]); //十位数显示
lcd_pos(0x4a);
lcd_wdat(display[1]); //个位数显示
lcd_pos(0x4c);
lcd_wdat(display[0]); //小数位数显示
}
else
{
lcd_pos(0x08); //在LCD第一行显示
lcd_wdat(display[3]); //百位数显示
lcd_pos(0x09);
lcd_wdat(display[2]); //十位数显示
lcd_pos(0x0a);
lcd_wdat(display[1]); //个位数显示
lcd_pos(0x0c);
lcd_wdat(display[0]); //小数位数显示
}
}
/********************************************************/
/* */
/* 主函数 */
/* */
/********************************************************/
int main(void)
{
init_io();
while(1)
{
Ok_Menu ();
do
{
Read_Temperature(0); //第一个DS18B20
Disp_Temperature(0);
delay_nms(50);
Read_Temperature(1); //第二个DS18B20
Disp_Temperature(1);
delay_nms(50);
}
while(!presence) ;
Error_Menu ();
do
{
Init_DS18B20();
beep();
}
while(presence);
}
}
/********************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -