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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5220|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

求解決單片機(jī)LCD1602光標(biāo)閃爍問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:432874 發(fā)表于 2018-12-5 22:17 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
小弟單片機(jī)萌新,正在做一個課程設(shè)計。
求大佬幫我解決一個問題:調(diào)時間的時候,所選擇的那一位如:時、分、秒處于閃爍狀態(tài),調(diào)節(jié)完畢后繼續(xù)正常工作。
解釋一下程序功能:按下K3時,時鐘停止,再按下K1可以切換需要調(diào)節(jié)的位置(第一次默認(rèn)為秒),按下K2實(shí)現(xiàn)+1。

  1. /*******************************************************************************
  2. * 實(shí)驗(yàn)名                  :溫度+時鐘顯示
  3. * 使用的IO             :
  4. * 實(shí)驗(yàn)效果       :1602顯示溫度
  5. *        注意                                         :
  6. *******************************************************************************/

  7. #include<reg51.h>
  8. #include"lcd.h"
  9. #include"ds1302.h"
  10. #include"temp.h"

  11. sbit K1=P3^1;
  12. sbit K2=P3^0;
  13. sbit K3=P3^2;
  14. sbit K4=P3^3;

  15. uchar CNCHAR[6] = "攝氏度";
  16. void Int0Configuration();
  17. void LcdDisplay(int);
  18. void UsartConfiguration();
  19. unsigned char SetState,SetPlace;
  20. void Delay10ms(void);   //誤差 0us
  21. void LcdDisplay1();

  22. /*******************************************************************************
  23. * 函數(shù)名         : main
  24. * 函數(shù)功能                   : 主函數(shù)
  25. * 輸入           : 無
  26. * 輸出                  : 無
  27. *******************************************************************************/

  28. void main()
  29. {
  30.         unsigned char i;
  31.         Int0Configuration();
  32.         UsartConfiguration();
  33.         LcdInit();                         //初始化LCD1602
  34.         LcdWriteCom(0x80+0x4f);        //寫地址 80表示初始地址
  35.         LcdWriteData('C');
  36.         Ds1302Init();
  37.         while(1)
  38.         {
  39.                     if(SetState==0)
  40.                 {
  41.                         Ds1302ReadTime();
  42.                 }
  43.                 else
  44.                 {
  45.                         if(K1==0)                //檢測按鍵K1是否按下
  46.                         {
  47.                                 Delay10ms();        //消除抖動
  48.                                 if(K1==0)
  49.                                 {
  50.                                         SetPlace++;         
  51.                                         if(SetPlace>=7)
  52.                                                 SetPlace=0;                                       
  53.                                 }

  54.                                 while((i<50)&&(K1==0))         //檢測按鍵是否松開
  55.                                 {
  56.                                         Delay10ms();
  57.                                         i++;
  58.                                 }
  59.                                 i=0;
  60.                         }
  61.                         if(K2==0)                //檢測按鍵K2是否按下
  62.                         {
  63.                                 Delay10ms();        //消除抖動
  64.                                 if(K2==0)
  65.                                 {
  66.                                         TIME[SetPlace]++;
  67.                                         if((TIME[SetPlace]&0x0f)>9)                                         //換成BCD碼。
  68.                                         {
  69.                                                 TIME[SetPlace]=TIME[SetPlace]+6;
  70.                                         }
  71.                                         if((TIME[SetPlace]>=0x60)&&(SetPlace<2))                //分秒只能到59
  72.                                         {
  73.                                                 TIME[SetPlace]=0;
  74.                                         }
  75.                                         if((TIME[SetPlace]>=0x24)&&(SetPlace==2))                //小時只能到23
  76.                                         {
  77.                                                 TIME[SetPlace]=0;
  78.                                         }
  79.                                         if((TIME[SetPlace]>=0x32)&&(SetPlace==3))                //日只能到31
  80.                                         {
  81.                                                 TIME[SetPlace]=0;       
  82.                                         }
  83.                                         if((TIME[SetPlace]>=0x13)&&(SetPlace==4))                //月只能到12
  84.                                         {
  85.                                                 TIME[SetPlace]=0;
  86.                                         }       
  87.                                         if((TIME[SetPlace]>=0x8)&&(SetPlace==5))                //周只能到7
  88.                                         {
  89.                                                 TIME[SetPlace]=1;
  90.                                         }               
  91. //                                        if(SetPlace==5)                //月只能到12
  92. //                                        {
  93. //                                                TIME[SetPlace]=;
  94. //                                        }       
  95.                                 }
  96.                                
  97.                                 while((i<50)&&(K2==0))         //檢測按鍵是否松開
  98.                                 {
  99.                                         Delay10ms();
  100.                                         i++;
  101.                                 }
  102.                                 i=0;
  103.                                
  104.                         }                                               
  105.                 }
  106.                         LcdDisplay1();       
  107.                         LcdDisplay(Ds18b20ReadTemp());        //                Delay1ms(1000);//1s鐘刷一次
  108.                           
  109.         }
  110. }

  111. /*******************************************************************************
  112. * 函數(shù)名         : LcdDisplay()
  113. * 函數(shù)功能                   : LCD顯示讀取到的溫度
  114. * 輸入           : v
  115. * 輸出                  : 無
  116. *******************************************************************************/
  117. void LcdDisplay(int temp)          //lcd顯示
  118. {
  119.    
  120.   unsigned char i, datas[] = {0, 0, 0, 0, 0}; //定義數(shù)組
  121.         float tp;  
  122.         if(temp< 0)                                //當(dāng)溫度值為負(fù)數(shù)
  123.           {
  124.                   LcdWriteCom(0x80+0x49);                //寫地址 80表示初始地址
  125.                 SBUF='-';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  126.                 while(!TI);                                 //等待發(fā)送數(shù)據(jù)完成
  127.                 TI=0;                                                 //清除發(fā)送完成標(biāo)志位
  128.             LcdWriteData('-');                  //顯示負(fù)
  129.                 //因?yàn)樽x取的溫度是實(shí)際溫度的補(bǔ)碼,所以減1,再取反求出原碼
  130.                 temp=temp-1;
  131.                 temp=~temp;
  132.                 tp=temp;
  133.                 temp=tp*0.0625*100+0.5;       
  134.                 //留兩個小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點(diǎn)
  135.                 //后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
  136.                 //算由?.5,還是在小數(shù)點(diǎn)后面。

  137.           }
  138.         else
  139.           {                       
  140.                   LcdWriteCom(0x80+0x49);                //寫地址 80表示初始地址
  141.             LcdWriteData('+');                 //顯示正
  142.                 SBUF='+';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  143.                 while(!TI);                                 //等待發(fā)送數(shù)據(jù)完成
  144.                 TI=0;                                                 //清除發(fā)送完成標(biāo)志位
  145.                 tp=temp;//因?yàn)閿?shù)據(jù)處理有小數(shù)點(diǎn)所以將溫度賦給一個浮點(diǎn)型變量
  146.                 //如果溫度是正的那么,那么正數(shù)的原碼就是補(bǔ)碼它本身
  147.                 temp=tp*0.0625*100+0.5;       
  148.                 //留兩個小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點(diǎn)
  149.                 //后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
  150.                 //算加上0.5,還是在小數(shù)點(diǎn)后面。
  151.         }
  152.         datas[0] = temp / 10000;
  153.         datas[1] = temp % 10000 / 1000;
  154.         datas[2] = temp % 1000 / 100;
  155.         datas[3] = temp % 100 / 10;
  156.         datas[4] = temp % 10;

  157.        
  158.         LcdWriteCom(0x80+0x4a);                 //寫地址 80表示初始地址
  159.         LcdWriteData('0'+datas[1]); //十位
  160.         SBUF = '0'+datas[1];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  161.         while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
  162.         TI = 0;

  163.         LcdWriteCom(0x80+0x4b);                //寫地址 80表示初始地址
  164.         LcdWriteData('0'+datas[2]); //個位
  165.         SBUF = '0'+datas[2];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  166.         while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
  167.         TI = 0;

  168.         LcdWriteCom(0x80+0x4c);                //寫地址 80表示初始地址
  169.         LcdWriteData('.');                 //顯示 ‘.’
  170.         SBUF = '.';//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  171.         while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
  172.         TI = 0;

  173.         LcdWriteCom(0x80+0x4d);                 //寫地址 80表示初始地址
  174.         LcdWriteData('0'+datas[3]); //顯示小數(shù)點(diǎn)  
  175.         SBUF = '0'+datas[3];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  176.         while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
  177.         TI = 0;

  178.         LcdWriteCom(0x80+0x4e);                 //寫地址 80表示初始地址
  179.         LcdWriteData('0'+datas[4]); //顯示小數(shù)點(diǎn)
  180.         SBUF = '0'+datas[4];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  181.         while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
  182.         TI = 0;
  183.         for(i=0; i<6; i++)
  184.         {
  185.                  SBUF = CNCHAR[i];//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  186.                 while (!TI);                                 //等待發(fā)送數(shù)據(jù)完成
  187.                 TI = 0;
  188.         }

  189. }
  190. void LcdDisplay1()
  191. {
  192.         LcdWriteCom(0x80+0X40);
  193.         LcdWriteData('0'+TIME[2]/16);                                //時
  194.         LcdWriteData('0'+(TIME[2]&0x0f));Delay10ms();                                 
  195.         LcdWriteData('-');
  196.         LcdWriteData('0'+TIME[1]/16);                                //分
  197.         LcdWriteData('0'+(TIME[1]&0x0f));Delay10ms();       
  198.         LcdWriteData('-');
  199.         LcdWriteData('0'+TIME[0]/16);                                //秒
  200.         LcdWriteData('0'+(TIME[0]&0x0f));Delay10ms();

  201.         LcdWriteCom(0x80);
  202.         LcdWriteData('2');
  203.         LcdWriteData('0');
  204.         LcdWriteData('0'+TIME[6]/16);                        //年
  205.         LcdWriteData('0'+(TIME[6]&0x0f));
  206.         LcdWriteData('-');
  207.         LcdWriteData('0'+TIME[4]/16);                        //月
  208.         LcdWriteData('0'+(TIME[4]&0x0f));
  209.         LcdWriteData('-');
  210.         LcdWriteData('0'+TIME[3]/16);                        //日
  211.         LcdWriteData('0'+(TIME[3]&0x0f));
  212.         LcdWriteCom(0x8D);
  213.         LcdWriteData('0'+(TIME[5]&0x07));        //星期                         
  214. }

  215.                  

  216. /*******************************************************************************
  217. * 函數(shù)名         : Int0Configuration()
  218. * 函數(shù)功能                   : 配置外部中斷0
  219. * 輸入           : 無
  220. * 輸出                  : 無
  221. *******************************************************************************/

  222. void Int0Configuration()
  223. {
  224.         //設(shè)置INT0
  225.         IT0=1;//跳變沿出發(fā)方式(下降沿)
  226.         EX0=1;//打開INT0的中斷允許。
  227.         EA=1;//打開總中斷       
  228. }
  229. /*******************************************************************************
  230. * 函數(shù)名         : Int0()
  231. * 函數(shù)功能                   : 外部中斷0 中斷函數(shù)
  232. * 輸入           : 無
  233. * 輸出                  : 無
  234. *******************************************************************************/

  235. void Int0() interrupt 0                 
  236. {
  237.         Delay10ms();
  238.         if(K3==0)
  239.         {
  240.                 SetState=~SetState;
  241.                 SetPlace=0;
  242.                 Ds1302Init();       
  243.         }
  244. }
  245. /*******************************************************************************
  246. * 函數(shù)名         : Delay10ms
  247. * 函數(shù)功能                   : 延時函數(shù),延時10ms
  248. * 輸入           : 無
  249. * 輸出                  : 無
  250. *******************************************************************************/
  251. void Delay10ms(void)   //誤差 0us
  252. {
  253.     unsigned char a,b,c;
  254.     for(c=1;c>0;c--)
  255.         for(b=38;b>0;b--)
  256.             for(a=130;a>0;a--);
  257. }
  258. /*******************************************************************************
  259. * 函 數(shù) 名         :UsartConfiguration()
  260. * 函數(shù)功能                   :設(shè)置串口
  261. * 輸    入         : 無
  262. * 輸    出         : 無
  263. *******************************************************************************/

  264. void UsartConfiguration()
  265. {
  266.         SCON=0X50;                        //設(shè)置為工作方式1
  267.         TMOD=0X20;                        //設(shè)置計數(shù)器工作方式2
  268.         PCON=0X80;                        //波特率加倍
  269.         TH1=0XF3;                                //計數(shù)器初始值設(shè)置,注意波特率是4800的
  270.         TL1=0XF3;
  271. //        ES=1;                                                //打開接收中斷
  272. //        EA=1;                                                //打開總中斷
  273.         TR1=1;                                        //打開計數(shù)器
  274. }
復(fù)制代碼


LCD顯示溫度 時間 串口接收溫度.zip

59.06 KB, 下載次數(shù): 16

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

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一区免费 | 免费看91 | 一区视频 | 久久久精品高清 | 久久蜜桃av一区二区天堂 | 欧美日韩精品一区二区三区四区 | 久久国产香蕉 | 国产丝袜一区二区三区免费视频 | 性色的免费视频 | 日韩一三区 | 亚洲国产一区视频 | 69电影网| 日韩精品久久一区二区三区 | 成人精品鲁一区一区二区 | 日韩有码一区 | 精品av久久久久电影 | 久久精品国产清自在天天线 | 成人福利电影 | 久久久一区二区三区 | 久久99国产精一区二区三区 | 国产欧美一区二区三区国产幕精品 | 亚洲一区二区中文字幕 | 97国产在线观看 | 国产在线中文 | 国产精品爱久久久久久久 | 精品1区2区3区 | 久久伊 | 日本精品久久久久 | 99r在线 | 中文字幕啪啪 | 日韩精品久久久久 | 日本成人二区 | 日韩中文字幕在线观看 | 日韩视频在线免费观看 | 夜夜摸天天操 | 人人做人人澡人人爽欧美 | 日韩国产专区 | 欧美成人激情 | 在线一区| 亚洲成av人片在线观看无码 | 国产欧美日韩一区二区三区在线 |