单片机液晶显示温度

来源:互联网 发布: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) ;}}  }


原创粉丝点击