久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3752|回復: 7
打印 上一主題 下一主題
收起左側

基于矩陣按鍵可調上下限溫度報警1602顯示空白

[復制鏈接]
跳轉到指定樓層
樓主
板子沒有問題,輸入其他顯示程序可以正常顯示,但是這個程序輸入進去,運行卻沒有完整的顯示出來。



  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. }
復制代碼








分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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
上面粘貼出來的源碼應該不是原板配套的

的確不是,所以現在不知道改動去適應新的板子。
回復

使用道具 舉報

5#
ID:96682 發表于 2017-12-22 13:30 | 只看該作者
沒有這板子的原理圖說啥都白搭
回復

使用道具 舉報

6#
ID:264406 發表于 2017-12-25 18:23 | 只看該作者
你把引腳改成你自己的板子
回復

使用道具 舉報

7#
ID:264029 發表于 2017-12-30 00:16 | 只看該作者
問題已經得到解決,謝謝各位的見解。
回復

使用道具 舉報

8#
ID:122146 發表于 2018-3-31 08:44 | 只看該作者
謝謝分享,正好用來測試按鍵。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲乱码一区二区三区在线观看 | 日韩精品在线网站 | 亚洲精品一区二区久 | 日韩精品在线一区 | 久久精品免费 | 久久久精品一区 | 亚洲成人免费观看 | 偷拍第一页| 亚洲精品久久嫩草网站秘色 | 综合色影院| 亚洲福利 | 超碰一区二区 | 成人性生交大片免费看中文带字幕 | 日韩免费视频 | 久草在线高清 | 中文字幕日韩一区 | 99久久婷婷国产综合精品电影 | 久久久久久国产精品免费免费狐狸 | 黄片毛片免费观看 | 久久大陆| 精品久久久一区二区 | 日韩一级免费观看 | 中文字幕精品一区二区三区在线 | 婷婷毛片 | 欧美无乱码久久久免费午夜一区 | 亚洲成人免费视频 | 视频一区 亚洲 | 国产一区二区在线91 | 国产精品久久久久久网站 | 国产精品久久久久久影院8一贰佰 | 欧美精品一区二区三区蜜桃视频 | 亚洲一区二区中文字幕 | 欧美一区二区在线视频 | 日韩精品一区在线 | 欧美一级大片 | 欧美综合一区 | 国产精品视频免费播放 | 欧美成人精品 | 91精品国产综合久久精品 | 国产精品久久久久久久久久免费看 | 99国产精品99久久久久久 |