#include #define uint unsigned int #define uchar unsigned char //#define disdata P0 //#define discan P2 sbit WENDU=P3^7; sbit rs =P2^0; sbit rw=P2^1; sbit lcden=P2^2; sbit ALR=P1^0; uint Temp=0,n=0; //-------------------------------- const uchar table[]="Welcome !" ; const uchar table1[]="Fre Is :"; const uchar WAR[]="WARNING !"; const uchar alarm1[]="Too HIGH TEM !"; const uchar alarm2[]="Too LOW TEM !"; ////温度小数部分查表 //uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09}; //uchar code dis_7[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40} ; //uchar code scan_con[4]={0xfe,0xfd,0xfb,0xf7}; //uchar data temp_data[2]={0xff,0xff}; //uchar data display[5]={0xff,0xff,0xff,0xff,0xff}; uchar data temp_data[2]={0x00,0x00}; ////延时函数 void delay(uint ms) { uint i,j; for(i=0;i for(j=0;j<1141;j++); } } void delay1(uint t) { for (;t>0;t--); } void write_com(uchar com) { rs=0; rw=0; P0=com; //写地址 lcden=1; delay(1); lcden=0; } //--------------------------- void write_data(uchar dat) { rs=1; rw=0; P0=dat; //写数据 lcden=1; delay(1); lcden=0; } //---------------------------- ow_reset(viod) { char presence=1; while(presence) { while(presence) { WENDU=1; _nop_(); _nop_(); WENDU=0; delay1(50); WENDU=1; delay1(6); presence=WENDU; } delay1(45); presence=~WENDU; } WENDU=1; } ////写字节 void write_byte(uchar val) { uchar i; for(i=8;i>0;i--) { WENDU=1; _nop_(); _nop_(); WENDU=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); WENDU=val&0x01; delay1(6); val=val/2; } WENDU=1; delay1(1); } ////////////////// uchar read_byte(void) { uchar i; uchar value=0; for(i=8;i>0;i--) { WENDU=1; _nop_(); _nop_(); value>>=1; WENDU=0; _nop_(); _nop_(); _nop_(); _nop_(); WENDU=1; _nop_(); _nop_(); _nop_(); _nop_(); if(WENDU) value|=0x80; delay1(6); } WENDU=1; return(value); } /////读字节 暂存 void init() { write_com(0x38); delay(5); write_com(0x01); delay(5); write_com(0x0c); delay(5); write_com(0x06); delay(5); } //-------------------------- void lcd_dis1() { uint i; lcden=0; init(); write_com(0x80+0); for(i=0;i<9;i++) { write_data(table[i]); } write_com(0x80+0x40); for(i=0;i<8;i++) { write_data(table1[i]); } } //--------------------------- void lcd_dis2() { uint i; write_com(0x80+0); for(i=0;i<9;i++) { write_data(WAR[i]); } write_com(0x80+0x42); for(i=0;i<14;i++) { write_data(alarm1[i]); } } //-------------------------- void lcd_dis3() { uint i; lcden=0; init(); write_com(0x80+0); for(i=0;i<9;i++) { write_data(WAR[i]); } write_com(0x80+0x42); for(i=0;i<14;i++) { write_data(alarm2[i]); } } //--------------------------- work_temp() { uint T1=0,T2=0,T3=0,T4=0,Temp1,T5; read_temp(); if(temp_data[1]>128) //负数时进行取补 { temp_data[1]=~(temp_data[1]); temp_data[0]=~(temp_data[0])+1; n=1; } T5=temp_data[0]&0x0f; //低字节,取小数 //小数放最低位 Temp=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4); //整数部分 高字节取第四位,低字节取高四位 T1=48+Temp/100; //取整数最高位放在数码管最高位 T2=48+(Temp%100)/10; // 下面依次存放整数部分 T4=48+Temp%10; //////////////////////////// write_com(0x80+0x48); write_data(0); write_com(0x80+0x49); write_data(48); write_data(T1); write_data(T2); write_data(T3); write_data(T4); write_data(46); write_data(48); if (Temp>=37) { ALR=1; lcden=0; init(); lcd_dis2(); delay(200); lcd_dis1(); } if((n)&&(Temp>=21)) { ALR=1; lcden=0; init(); lcd_dis3(); delay(200); lcd_dis1(); } } read_temp() { ow_reset(); write_byte(0xcc); write_byte(0xbe); temp_data[0]=read_byte(); temp_data[1]=read_byte(); //读两个字节暂存 ow_reset(); write_byte(0xcc); write_byte(0x44); //work_temp(); } ////////////// 主函数 void main() { ALR=0; lcd_dis1(); while(1) { ALR=0; work_temp(); if(n) { n=0; write_com(0x80+0x48); write_data(45); } } }