单片机液晶显示温度
来源:互联网 发布:libzip windows 编辑:程序博客网 时间:2024/04/29 06:42
#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit lcdrs=P1^7;sbit lcdrw=P1^6;sbit le=P2^4;sbit DQ=P3^5;uchar num = 0;uchar i;uchar code tabel[]="0123456789.";uchar tabel0[]="TEMPERATURE:";uchar tabel1[]="THE TIME IS:"; void delay8(uint ms){ while(ms--);}void delay(uint s){ uint x,y; for(x=s;x>0;x--) for(y=110;y>0;y--);}void init_1820() //1820的复位{ uchar x; DQ=1; delay8(8); DQ=0; delay8(140); DQ=1; delay8(15); x=DQ; delay8(5);}void write_byte(uchar dat) //写指令{ uchar i; for(i=0;i<8;i++) { DQ=0; //这里是单片机 DQ=dat&0x01; //这还是单片机发的 所以不用释放 delay8(4); DQ=1; dat>>=1; } delay(5);} uchar read_byte() //读数据 { uchar i,value; for(i=0;i<8;i++) { DQ=0; value>>=1; DQ=1; //一定要释放 因为DQ即将要被1820用到而不是单片机 if(DQ) value|=0x80; delay8(4); } return value;}uint temper() //就是由于把uint写成uchar导致无法显示小数点,浪费8个小时啊.....{ uchar a,b; uint temp; init_1820(); write_byte(0xcc); //跳过ROM write_byte(0x44); //启动转换温度 delay8(300); init_1820(); //每次操作都要init初始化才行 write_byte(0xcc); write_byte(0xbe); //读取温度 a=read_byte(); b=read_byte(); temp=(a+b*256)*(0.0625*10); //保留一位小数,即百位实际是十位,十位是个位,个位是小数点后一位 return temp;}void write_com(uchar com){ lcdrs=0; //le=0; delay(5); P0=com; delay(5); le=1; delay(5); le=0;}void write_data(uchar dete){ lcdrs=1; //le=0; delay(5); P0=dete; delay(5); le=1; delay(5); le=0;}void init(){ le=0; lcdrw=0; //时序图是低电平 而文档文字是高电平 write_com(0x01); //清屏等操作 write_com(0x38); write_com(0x0f); /////////////////////外部中断0 EA = 1; EX0 = 1; IT0 = 1; }void main(){ uchar shi,ge,dot1; uint tt; init(); while(1){ write_com(0x80+0x40); for(i=0;i<12;i++) { write_data(tabel0[i]); delay(30); } write_com(0x80); for(i=0;i<12;i++) { write_data(tabel1[i]); delay(30); } write_com(0x80+0x4c); tt=temper(); shi=tt/100; ge=tt%100/10; dot1=tt%10; write_data(tabel[shi]); delay(200); write_data(tabel[ge]&0x7f); //突出小数点 delay(200); write_data(tabel[10]); delay(200); write_data(tabel[dot1]); delay(200); } }void int0() interrupt 0{ num++;}
#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit lcdrs=P2^2;sbit lcdrw=P2^3;sbit le=P2^4;sbit peng=P2^1;uchar min1=1;uchar min2=0;uchar sex1=0;uchar sex2=0;int fage=1;uchar i;uchar code tabel[]="0123456789.";uchar tabel0[]=":";uchar tabel1[]="THE TIME IS:"; void delay8(uint us){ while(us--);}void delay(uint ms){ uint x,y; for(x=ms;x>0;x--) for(y=110;y>0;y--);}void write_com(uchar com){ lcdrs=0; //le=0; delay(5); P0=com; delay(5); le=1; delay(5); le=0;}void write_data(uchar dete){ lcdrs=1; //le=0; delay(5); P0=dete; delay(5); le=1;delay(5); le=0;}void init(){ le=0; lcdrw=0; //时序图是低电平 而文档文字是高电平 write_com(0x01); //清屏等操作 write_com(0x38); write_com(0x0f); /////////////////////外部中断0EA = 1; EX0 = 1; EX1=1; //开外部中断1 IT1=0; //外部中断边沿触发,下降沿触发 IT0=0; //外部中断0边沿触发,下降沿触发 }void int0() interrupt 0{ fage=0;} void int1() interrupt 2{ fage=1;}void main(){ init();peng=0; while(1){if(fage==1){ write_com(0x80); for(i=0;i<12;i++) { write_data(tabel1[i]); delay(30); }write_com(0x80+0x49);write_data(tabel[min1]);delay(30);write_data(tabel[min2]);delay(30);write_data(tabel0[0]);delay(30);write_data(tabel[sex1]);delay(30);write_data(tabel[sex2]);delay(30) ;if((sex1==0)&&(sex2==1)&&(min2==0)&&(min1==0)){ fage=0;peng=1;}if((sex1==0)&&(sex2==0)&&(min2==0)&&(min1==1)){ min1--; min2=9; sex1=5; sex2=10;}if((sex1==0)&&(sex2==0)&&(min2!=0)){ min2--; sex1=5; sex2=10;}if(sex2==0&&(sex1!=0)){ sex1--; sex2=10;} delay(700) ; sex2--;}else{ write_com(0x80); for(i=0;i<12;i++) { write_data(tabel1[i]); delay(30); }write_com(0x80+0x49);write_data(tabel[min1]);delay(30);write_data(tabel[min2]);delay(30);write_data(tabel0[0]);delay(30);write_data(tabel[sex1]);delay(30);write_data(tabel[sex2]);delay(30) ;delay(700) ;}} }