?? ds18b20-lcd1602-c51-avr.c
字號:
{
DDRA=0XFF; //設(shè)置PA輸出
PORTA=0XFF; //全部加上上拉電阻
DDRC=0XFF; //設(shè)置PC為輸出
PORTC=0XFF; //全部加上上拉電阻
delay_nms(30); //等待上電穩(wěn)定
lcd_wcmd(0x38,0); //16*2顯示,5*7點陣,8位數(shù)據(jù)
delay_nms(5);
lcd_wcmd(0x38,0); //不進(jìn)行忙檢測
delay_nms(5);
lcd_wcmd(0x38,0);
delay_nms(5);
lcd_wcmd(0x0c,1); //顯示開,關(guān)光標(biāo)
delay_nms(5);
lcd_wcmd(0x06,1); //移動光標(biāo)
delay_nms(5);
lcd_wcmd(0x01,1); //清除LCD的顯示內(nèi)容
delay_nms(5);
}
/*******************************************************************/
/* */
/*寫指令數(shù)據(jù)到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; //送指令數(shù)據(jù)
PORTC |=_BV(LCD_EN);
_NOP();
_NOP();
PORTC &=~_BV(LCD_EN);
}
/*******************************************************************/
/* */
/*寫顯示數(shù)據(jù)到LCD */
/*RS=H,RW=L,E=高脈沖,D0-D7=數(shù)據(jù)。 */
/* */
/*******************************************************************/
void lcd_wdat(uchar dat)
{
lcd_busy();
PORTC |=_BV(LCD_RS);
PORTC &=~_BV(LCD_RW);
PORTC &=~_BV(LCD_EN);
PORTA=dat; //送顯示數(shù)據(jù)
PORTC |=_BV(LCD_EN);
_NOP();
_NOP();
PORTC &=~_BV(LCD_EN);
}
/*************************************************************/
/* */
/*檢查LCD忙狀態(tài) */
/*lcd_busy為1時,忙,等待。lcd-busy為0時,閑,可寫指令與數(shù)據(jù) */
/* */
/*************************************************************/
void lcd_busy(void)
{
DDRA &=~_BV(busy); //設(shè)置busy口為輸入
PORTC &=~_BV(LCD_RS);
PORTC |= _BV(LCD_RW);
PORTC |= _BV(LCD_EN);
while(PINA & _BV(busy)); //忙等待
PORTC &=~_BV(LCD_EN);
DDRA|=_BV(busy); //設(shè)置busy口為輸出
}
/*************************************************************/
/* */
/* 設(shè)定顯示位置 */
/* */
/*************************************************************/
void lcd_pos(uchar pos)
{
lcd_wcmd(pos|0x80,1); //數(shù)據(jù)指針=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); //設(shè)置顯示位置為第一行的第1個字符
m = 0;
while(cdis1[m] != '\0')
{ //顯示字符
lcd_wdat(cdis1[m]);
m++;
}
lcd_pos(0x40); //設(shè)置顯示位置為第二行第1個字符
m = 0;
while(cdis2[m] != '\0')
{
lcd_wdat(cdis2[m]); //顯示字符
m++;
}
writetab(); //自定義字符寫入CGRAM
delay_nms(5);
lcd_pos(0x4d);
lcd_wdat(0x00); //顯示自定義字符
}
/*******************************************************************/
/* */
/* DS18B20 ERROR 顯示菜單 */
/* */
/*******************************************************************/
void Error_Menu (void)
{
uchar m;
lcd_init(); //初始化LCD
lcd_pos(0); //設(shè)置顯示位置為第一行的第1個字符
m = 0;
while(cdis3[m] != '\0')
{ //顯示字符
lcd_wdat(cdis3[m]);
m++;
}
lcd_pos(0x40); //設(shè)置顯示位置為第二行第1個字符
m = 0;
while(cdis4[m] != '\0')
{
lcd_wdat(cdis4[m]); //顯示字符
m++;
}
}
/*******************************************************************/
/* */
/* 數(shù)據(jù)轉(zhuǎn)換與溫度顯示 */
/* */
/*******************************************************************/
void Disp_Temperature(void)
{
display[4]=temp_data[0]&0x0f;
display[0]=ditab[display[4]]+0x30; //查表得小數(shù)位的值
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;
}
lcd_pos(0x48);
lcd_wdat(display[3]); //百位數(shù)顯示
lcd_pos(0x49);
lcd_wdat(display[2]); //十位數(shù)顯示
lcd_pos(0x4a);
lcd_wdat(display[1]); //個位數(shù)顯示
lcd_pos(0x4c);
lcd_wdat(display[0]); //小數(shù)位數(shù)顯示
}
/********************************************************/
/* */
/* 主函數(shù) */
/* */
/********************************************************/
int main(void)
{
init_io();
while(1)
{
Ok_Menu ();
do
{
Read_Temperature();
Disp_Temperature();
}
while(!presence) ;
Error_Menu ();
do
{
Init_DS18B20();
beep();
}
while(presence);
}
}
/********************************************************/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -