}
* LCD初始化设定 *
*******************************************************************
void lcd_init() {
delay1(15) ;
lcd_wcmd(0x01) ; 清除LCD的显示内容 lcd_wcmd(0x38) ; 16*2显示,5*7点阵,8位数据 delay1(5) ; lcd_wcmd(0x38) ; delay1(5) ; lcd_wcmd(0x38) ; delay1(5) ;
lcd_wcmd(0x0c) ; 显示开,关光标 delay1(5) ;
lcd_wcmd(0x06) ; 移动光标 delay1(5) ;
lcd_wcmd(0x01) ; 清除LCD的显示内容 delay1(5) ; }
* 设定显示位置 *
*******************************************************************
void lcd_pos(uchar pos) {
lcd_wcmd(pos | 0x80) ; 数据指针=80+地址变量 }
*自定义字符写入CGRAM *
*******************************************************************
void writetab() {
unsigned char i ;
lcd_wcmd(0x40) ; 写CGRAM for (i = 0 ; i< 8 ; i++) lcd_wdat(mytab[ i ]) ; }
*us级延时函数 *
*******************************************************************
void Delay(unsigned int num) {
while( --num ) ; }
*初始化ds1820 *
*******************************************************************
Init_DS18B20(void) {
DQ = 1 ; DQ复位 Delay(8) ; 稍做延时 DQ = 0 ; 单片机将DQ拉低 Delay(90) ; 精确延时 大于 480us DQ = 1 ; 拉高总线 Delay(8) ;
presence = DQ ; 如果=0则初始化成功 =1则初始化失败 Delay(100) ; DQ = 1 ;
return(presence) ; 返回信号,0=presence,1= no presence }
* 读一个字节 *
*******************************************************************
ReadOneChar(void) {
unsigned char i = 0 ; unsigned char dat = 0 ;
for (i = 8 ; i > 0 ; i--) {
DQ = 0 ; 给脉冲信号 dat >>= 1 ;
DQ = 1 ; 给脉冲信号 if(DQ) dat |= 0x80 ; Delay(4) ; }
return (dat) ; }
* 写一个字节 *
*******************************************************************
WriteOneChar(unsigned char dat) {
unsigned char i = 0 ; for (i = 8 ; i > 0 ; i--) { DQ = 0 ; DQ = dat&0x01 ; Delay(5) ; DQ = 1 ; dat>>=1 ; } }
* 读取温度 *
*******************************************************************
Read_Temperature(void) {
Init_DS18B20() ;
WriteOneChar(0xCC) ; 跳过读序号列号的操作 WriteOneChar(0x44) ; 启动温度转换
Init_DS18B20() ;
WriteOneChar(0xCC) ; 跳过读序号列号的操作 WriteOneChar(0xBE) ; 读取温度寄存器 temp_data[0] = ReadOneChar() ; 温度低8位 temp_data[1] = ReadOneChar() ; 温度高8位 }
* 数据转换与温度显示 *
*******************************************************************
Disp_Temperature() {
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]0 ; display[2]=display[1]10+0x30 ; display[1]=display[1]+0x30 ; if(display[3]==0x30) 高位为0,不显示 {
display[3]=0x20 ;
if(display[2]==0x30) 次高位为0,不显示 display[2]=0x20 ; }
lcd_pos(0x48) ;
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]) ; 小数位数显示 }
*****************************************************************
**
* 蜂鸣器响一声 *
*******************************************************************
void beep() {
unsigned char y ; for (y=0 ;y<100 ;y++) {
Delay(60) ;
BEEP=!BEEP ; BEEP取反 }
BEEP=1 ; 关闭蜂鸣器 Delay(40000) ; }
* DS18B20 OK 显示菜单 *
*******************************************************************
void Ok_Menu () { 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]) ; 显示字符