?? 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 + -