找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3303|回复: 7
收起左侧

基于矩阵按键可调上下限温度报警1602显示空白

[复制链接]
ID:264029 发表于 2017-12-21 05:02 | 显示全部楼层 |阅读模式
板子没有问题,输入其他显示程序可以正常显示,但是这个程序输入进去,运行却没有完整的显示出来。

实际运行图

实际运行图

原理图

原理图


  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit BEEP=P2^1;//蜂鸣器接口定义
  5. sbit DQ=P1^6;  //ds18b20数据线接口定义
  6. sbit RS=P3^0;
  7. sbit RW=P3^1;
  8. sbit E=P3^2;
  9. /*函数定义*/
  10. void delay(uint k);
  11. void init_watch(void);
  12. void lcd_init(void);
  13. void showchar(void);
  14. void lcd_write_command(uchar dat);
  15. void lcd_write_data(uchar dat);
  16. void display(uchar *p);
  17. void watch_show(void);
  18. uint read_temp(void);
  19. void ds18b20_reset(void);
  20. uchar ds18b20_readdata(void);
  21. void ds18b20_writedata(uchar dat);
  22. void ds18b20_temp_display(void);
  23. void key_scan(void);
  24. uchar code table[]={0x10,0x06,0x09,
  25.   0x08,0x08,0x09,0x06,0x00};//字符℃
  26. uchar tab[]={0x30,0x31,0x32,0x33,0x34,
  27.   0x35,0x36,0x37,0x38,0x39};//0~9ASCII码
  28. /*字符串及变量定义*/
  29. uchar code str1[]={"TEMP:"};
  30. uchar code str2[]={"TH:"};
  31. uchar code str3[]={"TL:"};
  32. uchar code str4[]={"member1:"};
  33. uchar code str5[]={"chen feng!"};
  34. uchar code str6[]={"member2:"};
  35. uchar code str7[]={"zhang shun!"};
  36. uchar code str8[]={"member3:"};
  37. uchar code str9[]={"yang zheng ru!"};
  38. uchar code str10[]={" Welcome"};
  39. uchar code str11[]={"To wen kong!"};
  40. uchar hour1,hour2,min1,min2,sec1,
  41.   sec2,t,hour,min,sec,tflag;
  42. uchar year1,year2,year3,year4,month,
  43.   month1,month2,day,day1,day2;
  44. uchar moshi=0;//初始显示界面定义
  45. uint year,tvalue,temph=30,templ=15;
  46. unsigned data disdata[5];
  47. void delay(uint k)
  48. { while(k--);}
  49. /*lcd初始化*/
  50. void lcd_init(void)
  51. { lcd_write_command(0x30);
  52.   lcd_write_command(0x30);
  53.   lcd_write_command(0x30);
  54.   lcd_write_command(0x38);
  55.   lcd_write_command(0x08);
  56.   lcd_write_command(0x01);
  57.   lcd_write_command(0x06);
  58.   lcd_write_command(0x0c);
  59. }
  60. /*始终初始化及中断定义*/
  61. void init_watch()
  62. { hour=10;year=2012;month=7;day=5;
  63.   lcd_init();
  64.   TMOD=0x01; //工作方式1                                          
  65.   TH0=(65536-5000)/256;      
  66.   TL0=(65536-5000)%256;  
  67.   EA=1; //开总中断               
  68.   ET0=1; //开定时器中断0               
  69.   EX0=1; //开外部中断0
  70.   IT0=1;//外部中断0下降沿触发
  71.   TR0=1;//启动定时器0               
  72. }
  73. /*显示温度界面提示字符*/
  74. void showchar(void)
  75. { lcd_init();
  76.   lcd_write_command(0x80);
  77.   display(str1);//显示字符串str1
  78. }
  79. /*lcd写命令子程序*/
  80. void lcd_write_command(uchar dat)
  81. {
  82.   delay(5);//操作前短暂延时,保证信号稳定
  83.   P0=dat;
  84.   RS=0;
  85.   RW=0;
  86.   E=1;
  87.   E=0;
  88.   delay(100);
  89. }

  90. /*lcd写数据子程序*/
  91. void lcd_write_data(uchar dat)
  92. {
  93.   delay(5);//操作前短暂延时,保证信号稳定
  94.   P0=dat;
  95.   RS=1;
  96.   RW=0;
  97.   E=1;
  98.   E=0;
  99.   delay(100);
  100. }
  101. /*lcd显示时间*/
  102. void watch_show()
  103. { year1=year/1000;year2=year/100%10;
  104. year3=year%100/10;year4=year%10;   
  105. month1=month/10;month2=month%10;
  106. day1=day/10;day2=day%10;hour1=hour/10;  
  107. hour2=hour%10;min1=min/10;
  108. min2=min%10; sec1=sec/10;sec2=sec%10;
  109. lcd_write_command(0x84);           
  110. lcd_write_data(tab[hour1]);//显示时高位     
  111. lcd_write_data(tab[hour2]);//显示时低位     
  112. lcd_write_data(0x3a);           
  113. lcd_write_data(tab[min1]);//显示分高位        
  114. lcd_write_data(tab[min2]);//显示分低位        
  115. lcd_write_data(0x3a);         
  116. lcd_write_data(tab[sec1]);//显示秒高位
  117. lcd_write_data(tab[sec2]);//显示秒低位
  118. lcd_write_command(0xc3);//下四行显示年
  119. lcd_write_data(tab[year1]);
  120. lcd_write_data(tab[year2]);
  121. lcd_write_data(tab[year3]);
  122. lcd_write_data(tab[year4]);
  123. lcd_write_data('-');//显示-
  124. lcd_write_data(tab[month1]);//显示月高位
  125. lcd_write_data(tab[month2]);//显示月低位
  126. lcd_write_data('-');
  127. lcd_write_data(tab[day1]);//显示日高位
  128. lcd_write_data(tab[day2]);//显示日低位
  129. }
  130. /*显示字符子程序*/
  131. void display(uchar *p)
  132. { while(*p!='\0')
  133.   { lcd_write_data(*p);p++; }
  134. }

  135. /*ds18b20复位*/                  
  136. void ds18b20_reset(void)
  137. { DQ=0;
  138.   delay(100);
  139.   DQ=1;
  140.   delay(50);
  141. }
  142. /*读ds8b20数据*/
  143. uchar ds18b20_readdata(void)
  144. { uchar i,value;
  145.   value=0;
  146.   for(i=8;i>0;i--)
  147.   { DQ=0;
  148.     value>>=1;
  149.     DQ=1;
  150.     if(DQ)
  151.     { value|=0x80;}
  152.     delay(5);
  153.   }
  154.   return(value);
  155. }
  156. /*ds18b20写数据*/
  157. void ds18b20_writedata(uchar dat)
  158. { uchar i;
  159.   for(i=8;i>0;i--)
  160.   { DQ=0;
  161.     DQ=dat&0x01;
  162.     delay(5);
  163.     DQ=1;
  164.     dat>>=1;
  165. }
  166. }
  167. /*读取温度并转换*/
  168. uint read_temp(void)
  169. { uchar a,b;
  170.   ds18b20_reset();
  171.   ds18b20_writedata(0xcc);
  172.   ds18b20_writedata(0x44);
  173.   delay(100);
  174.   ds18b20_reset();
  175.   ds18b20_writedata(0xcc);
  176.   ds18b20_writedata(0xbe);
  177.   delay(100);
  178.   a=ds18b20_readdata();
  179.   b=ds18b20_readdata();
  180.   tvalue=b;
  181.   tvalue<<=8;
  182.   tvalue=tvalue|a;
  183.   if(tvalue<=0x0fff)
  184.     tflag=0;//温度符号位为正
  185.   else
  186.   { tvalue=~tvalue+1;tflag=1; }//符号位为负
  187.   tvalue=tvalue*0.625;
  188.   return(tvalue);
  189. }
  190. /*温度显示*/
  191. void ds18b20_temp_display(void)
  192. { char flagdat,m=0;
  193.   disdata[0]=tvalue/1000+0x30;
  194.   disdata[1]=(tvalue%1000)/100+0x30;
  195.   disdata[2]=(tvalue%100)/10+0x30;
  196.   disdata[3]=tvalue%10+0x30;
  197.   if(tflag==0)  flagdat=' ';//温度为正不显示
  198.   else  flagdat=0x2d;//温度为负则显示-
  199.   if(disdata[0]==0x30)
  200. { disdata[0]=0x20;//温度最高位为0不显示
  201.    if(disdata[1]==0x30)
  202.    { disdata[1]=0x20; }
  203. }
  204.   lcd_write_command(0x89);
  205.   lcd_write_data(flagdat);//显示符号位
  206.   lcd_write_data(disdata[0]);//显示温度
  207.   lcd_write_data(disdata[1]);
  208.   lcd_write_data(disdata[2]);
  209.   lcd_write_data(0x2e);//显示小数点
  210. lcd_write_data(disdata[3]);//显示温度小数位
  211.   lcd_write_command(0x40);               for(m=0;m<8;m++) //CGRAM中写入字符℃   
  212.   { lcd_write_data(table[m]); }
  213.    lcd_write_command(0x8f);        
  214.    lcd_write_data(0x00);//显示字符℃
  215.    lcd_write_command(0xc0);
  216.    display(str2);
  217.    lcd_write_data((temph/10)+0x30);
  218.    lcd_write_data((temph%10)+0x30);
  219.    lcd_write_command(0xc5);        
  220.    lcd_write_data(0x00);
  221.    lcd_write_command(0xc9);
  222.   display(str3);
  223.   lcd_write_data((templ/10)+0x30);
  224.   lcd_write_data((templ%10)+0x30);
  225.   lcd_write_command(0xce);        
  226.   lcd_write_data(0x00);
  227. }
  228. /*定时器0中断产生时间*/
  229. void timer0() interrupt 1
  230. {TH0=(65536-50000)/256;                 
  231.   TL0=(65536-50000)%256;
  232.   t++;
  233.   if(t==20)                     
  234.   { t=0;
  235. sec++;                           
  236. if(sec==60)                     
  237.     { sec=0;
  238.       min++;
  239.       if(min==60)
  240.       { min=0;
  241.         hour++;
  242.         if(hour==24)
  243.         { hour=0;
  244.          day++;              
  245.        if((month==1||month==3||month==5||
  246.          month==7||month==8||month==10||
  247.          month==12)&day==32)
  248.           { day=1;
  249.             month++;
  250.           }            
  251.        if((month==4||month==6||month==9||
  252.   month==11)&&day==31)
  253.           { day=1;
  254.             month++;
  255.           }           
  256.     if(year%4!=0&&month==2&&day==29)
  257.           { day=1;
  258.             month++;
  259.           }           
  260.    if(year%4==0&&month==2&&day==30)
  261.           { day=1;
  262.             month++;
  263.           }
  264.           if(month==13)
  265.           { month=1;
  266.             year++;
  267.           }
  268.         }
  269.       }
  270.     }         
  271.   }
  272. }
  273. /*外部中断0实现显示界面的转换*/
  274. void iint0() interrupt 0
  275. { moshi++;//一次中断则显示界面转换一次
  276.   if(moshi==6) moshi=0;//共6个显示界面
  277. }         
  278. /*4*4键盘扫描*/
  279. uchar Keycan(void)
  280. { uchar rcode, ccode;
  281.   P1=0xF0;      
  282.   if((P1&0xF0) != 0xF0)
  283.   { delay(30000);
  284.     if((P1&0xF0) != 0xF0)
  285. {rcode=0xFE;               
  286. while((rcode&0x10) != 0)
  287.       {P1=rcode;                 
  288.        if((P1&0xF0) != 0xF0)
  289.        { ccode = (P1&0xF0)|0x0F;
  290.         do{;}while((P1&0xF0)!=0xF0);
  291.         return ((~rcode) + (~ccode));
  292.        }
  293.        else
  294.              rcode = (rcode<<1)|0x01;
  295.       }
  296.     }
  297.   }
  298.   return 0;
  299. }
  300. /*根据扫描结果调整报警上下限、日期及时间*/
  301. void KeyDispaly(uchar key)
  302. { switch(key)
  303. {case 0x11: temph++; break;//提高报警上限
  304.   case 0x21: temph--; break;//降低报警上限
  305.   case 0x41: templ++; break;//提高报警下限
  306.   case 0x81: templ--; break;//降低报警下限
  307.   case 0x12: sec++; break;//按键增加秒
  308.   case 0x22: sec--; break;//按键降低秒
  309.    case 0x42: min++; break;//按键增加分
  310.    case 0x82: min--; break;//按键降低分
  311.    case 0x14: hour++; break;//按键增加时
  312.    case 0x24: hour--; break;//按键降低时
  313.    case 0x44: day++; break;//按键增加日
  314.    case 0x84: day--; break;//按键降低日
  315.    case 0x18: month++; break;//按键增加月
  316.    case 0x28: month--; break;//按键降低月
  317.    case 0x48: year++; break;//按键增加年
  318.    case 0x88: year--; break;//按键降低年
  319.    default: break;
  320.   }
  321. }
  322. /*主程序*/
  323. void main(void)
  324. { uchar Key;
  325.   DQ=1;
  326.   BEEP=1;//初始蜂鸣器不报警
  327.   init_watch();
  328.   while(1)
  329.   { if(moshi==0)//显示界面1
  330.     { lcd_write_command(0x01);
  331.       while(moshi==0)
  332.       { lcd_write_command(0x80);
  333.         display(str10);
  334.             lcd_write_command(0xc1);
  335.         display(str11);
  336.    }
  337.     }
  338.     if(moshi==1)//显示界面2
  339.     { lcd_write_command(0x01);//lcd清屏
  340.       while(moshi==1)
  341.       { lcd_write_command(0x80);
  342.         display(str4);
  343.             lcd_write_command(0xc2);
  344.         display(str5);
  345.       }
  346.     }
  347.     if(moshi==2)//显示界面3
  348.     { lcd_write_command(0x01);
  349.       while(moshi==2)
  350.       { lcd_write_command(0x80);
  351.         display(str6);
  352.             lcd_write_command(0xc3);
  353.         display(str7);
  354.       }
  355.     }
  356.     if(moshi==3)//显示界面4
  357.     { lcd_write_command(0x01);
  358.       while(moshi==3)
  359.       { lcd_write_command(0x80);
  360.         display(str8);
  361.             lcd_write_command(0xc1);
  362.         display(str9);
  363.       }
  364. }
  365.     if(moshi==4)//显示界面5
  366.     { lcd_write_command(0x01);
  367.       showchar();
  368.       while(moshi==4)
  369.       { read_temp();//读温度
  370.        if(((tvalue/10)%100)>=temph)
  371.           BEEP=0;//温度大于上限时报警         
  372.        else if(((tvalue/10)%100)<=templ)
  373.           BEEP=0;//温度小于下限时报警
  374.           else BEEP=1;//否则不报警   
  375.        ds18b20_temp_display();
  376.        Key = Keycan();//键盘扫描
  377.        KeyDispaly(Key);//调整报警上下限
  378.       }
  379.     }
  380.     if(moshi==5)//显示界面6
  381.     { lcd_write_command(0x01);
  382.       while(moshi==5)
  383.       { watch_show();//显示日期时间
  384.         Key = Keycan();
  385.         KeyDispaly(Key);
  386.       }
  387.     }
  388.   }
  389. }
复制代码








回复

使用道具 举报

ID:264029 发表于 2017-12-21 14:38 | 显示全部楼层
感觉是lcd写入地址不对。
回复

使用道具 举报

ID:96682 发表于 2017-12-21 20:35 | 显示全部楼层
上面粘贴出来的源码应该不是原板配套的
回复

使用道具 举报

ID:264029 发表于 2017-12-21 22:29 | 显示全部楼层
wc86110 发表于 2017-12-21 20:35
上面粘贴出来的源码应该不是原板配套的

的确不是,所以现在不知道改动去适应新的板子。
回复

使用道具 举报

ID:96682 发表于 2017-12-22 13:30 | 显示全部楼层
没有这板子的原理图说啥都白搭
回复

使用道具 举报

ID:264406 发表于 2017-12-25 18:23 | 显示全部楼层
你把引脚改成你自己的板子
回复

使用道具 举报

ID:264029 发表于 2017-12-30 00:16 | 显示全部楼层
问题已经得到解决,谢谢各位的见解。
回复

使用道具 举报

ID:122146 发表于 2018-3-31 08:44 | 显示全部楼层
谢谢分享,正好用来测试按键。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表