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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

為啥數碼管0x14那一行顯示代表0-9?

[復制鏈接]
跳轉到指定樓層
#


  1. #include <reg52.h>                 //調用單片機頭文件
  2. #define uchar unsigned char  //無符號字符型 宏定義        變量范圍0~255
  3. #define uint  unsigned int         //無符號整型 宏定義        變量范圍0~65535

  4. #include <intrins.
  5. //數碼管段選定義 0     1    2    3           4           5        6         7          8           9        
  6. uchar code smg_du[]={0x14,0x77,0x4c,0x45,0x27,0x85,0x84,0x57,0x04,0x05,A        B         C        

  7.   D           E   F        不顯示
  8.                                             0x06,0xa4,0x9c,0x64,0x8c,0x8e,0xff};         //斷碼        
  9. //數碼管位選定義
  10. sbit smg_we1 = P2^0;            //數碼管位選定義
  11. sbit smg_we2 = P2^2;
  12. sbit smg_we3 = P2^4;
  13. sbit smg_we4 = P2^6;
  14. uchar dis_smg[8] = {0x14,0x77,0x4c,0x45,0x27,0x85,0x84};

  15. sbit SCL=P1^2;                //SCL定義為P1口的第3位腳,連接ADC0832SCL腳
  16. sbit DO=P1^3;                //DO定義為P1口的第4位腳,連接ADC0832DO腳
  17. sbit CS=P1^0;                //CS定義為P1口的第4位腳,連接ADC0832CS腳

  18. uchar shidu;     //濕度等級
  19. uchar s_high = 70,s_low = 25;        //濕度報警參數

  20. sbit dianji = P3^5;     //電機IO定義

  21. /***********************1ms延時函數*****************************/
  22. void delay_1ms(uint q)
  23. {
  24.         uint i,j;
  25.         for(i=0;i<q;i++)
  26.                 for(j=0;j<120;j++);
  27. }


  28. /***********************數碼位選函數*****************************/
  29. void smg_we_switch(uchar i)
  30. {
  31.         switch(i)
  32.         {
  33.                 case 0: smg_we1 = 0;  smg_we2 = 1; smg_we3 = 1;  smg_we4 = 1; break;
  34.                 case 1: smg_we1 = 1;  smg_we2 = 0; smg_we3 = 1;  smg_we4 = 1; break;
  35.                 case 2: smg_we1 = 1;  smg_we2 = 1; smg_we3 = 0;  smg_we4 = 1; break;
  36.                 case 3: smg_we1 = 1;  smg_we2 = 1; smg_we3 = 1;  smg_we4 = 0; break;
  37.         }        
  38. }

  39. uchar flag_200ms ;
  40. uchar key_can;                 //按鍵值的變量
  41. uchar menu_1;        //菜單設計的變量

  42. /***********************數碼顯示函數*****************************/
  43. void display()
  44. {
  45.         static uchar i;   
  46.         i++;
  47.         if(i >= 4)
  48.                 i = 0;        
  49.         P0 = 0xff;                         //消隱
  50.         smg_we_switch(i);                 //位選
  51.         P0 = dis_smg[i];                 //段選               
  52. //        delay_1ms(1);
  53. }

  54. /***********讀數模轉換數據********************************************************/        
  55. //請先了解ADC0832模數轉換的串行協議,再來讀本函數,主要是對應時序圖來理解,本函數是模擬0832

  56. 的串行協議進行的
  57.                                                 //  1  1  0 通道
  58.                                                 //  1  1  1 通道
  59. unsigned char ad0832read(bit SGL,bit ODD)
  60. {
  61.         unsigned char i=0,value=0,value1=0;               
  62.                 SCL=0;
  63.                 DO=1;
  64.                 CS=0;                //開始
  65.                 SCL=1;                //第一個上升沿        
  66.                 SCL=0;
  67.                 DO=SGL;
  68.                 SCL=1;          //第二個上升沿
  69.                 SCL=0;
  70.                 DO=ODD;
  71.                 SCL=1;           //第三個上升沿
  72.                 SCL=0;           //第三個下降沿
  73.                 DO=1;
  74.                 for(i=0;i<8;i++)
  75.                 {
  76.                         SCL=1;
  77.                         SCL=0; //開始從第四個下降沿接收數據
  78.                         value=value<<1;
  79.                         if(DO)
  80.                                 value++;                                                
  81.                 }
  82.                 for(i=0;i<8;i++)
  83.                 {                        //接收校驗數據
  84.                         value1>>=1;
  85.                         if(DO)
  86.                                 value1+=0x80;
  87.                         SCL=1;
  88.                         SCL=0;
  89.                 }
  90.                 SCL=1;
  91.                 DO=1;
  92.                 CS=1;        
  93.                 if(value==value1)                                //與校驗數據比較,正確就返

  94. 回數據,否則返回0        
  95.                         return value;
  96.         return 0;
  97. }



  98. /********************獨立按鍵程序*****************/
  99. uchar key_can;         //按鍵值

  100. void key()         //獨立按鍵程序
  101. {
  102.         static uchar key_new;
  103.         key_can = 20;                   //按鍵值還原
  104.         P1 |= 0xf0;
  105.         if((P1 & 0xf0) != 0xf0)                //按鍵按下
  106.         {
  107.                 delay_1ms(1);                     //按鍵消抖動
  108.                 if(((P1 & 0xf0) != 0xf0) && (key_new == 1))
  109.                 {                                                //確認是按鍵按下
  110.                         key_new = 0;
  111.                         switch(P1 & 0xf0)
  112.                         {
  113.                                 case 0x70: key_can = 1; break;           //得到k2鍵值
  114.                                 case 0xb0: key_can = 2; break;           //得到k3鍵值
  115.                                 case 0xd0: key_can = 3; break;           //得到k4鍵值
  116.                         }                                
  117.                 }                        
  118.         }
  119.         else
  120.                 key_new = 1;        
  121. }

  122. /****************按鍵處理顯示函數***************/
  123. void key_with()
  124. {
  125.         if(menu_1 == 0)
  126.         {
  127.                 if(key_can == 3)   //手動打開電機
  128.                         dianji = 0;     //打開電機
  129.                 if(key_can == 2)
  130.                         dianji = 1;     //關閉電機
  131.                 }

  132.         if(key_can == 1)         //設置鍵
  133.         {
  134.                 menu_1 ++;
  135.                 if(menu_1 >= 3)
  136.                 {
  137.                         menu_1 = 0;

  138.                 }
  139.         }
  140.         if(menu_1 == 1)                        //設置濕度上限
  141.         {
  142.                 if(key_can == 2)
  143.                 {
  144.                         s_high ++ ;                //濕度上限值加1
  145.                         if(s_high > 99)
  146.                                 s_high = 99;
  147.                 }
  148.                 if(key_can == 3)
  149.                 {
  150.                         s_high -- ;                //濕度上限值減1
  151.                         if(s_high <= s_low)
  152.                                 s_high = s_low + 1 ;
  153.                 }
  154.                 dis_smg[0] = smg_du[s_high % 10];                   //取個位顯示
  155.                 dis_smg[1] = smg_du[s_high / 10 % 10];  //取十位顯示
  156.                 dis_smg[2] = 0xef;         
  157.                 dis_smg[3] = 0x26;         //H  0010 0110

  158.         }        
  159.         if(menu_1 == 2)                        //設置濕度下限
  160.         {
  161.                 if(key_can == 2)
  162.                 {
  163.                         s_low ++ ;          //濕度下限值加1
  164.                         if(s_low >= s_high)
  165.                                 s_low = s_high - 1;
  166.                 }
  167.                 if(key_can == 3)
  168.                 {
  169.                         s_low --;          //濕度下限值減1
  170.                         if(s_low <= 1)
  171.                                 s_low = 1;
  172.                 }
  173.                 dis_smg[0] = smg_du[s_low % 10];                   //取個位顯示
  174.                 dis_smg[1] = smg_du[s_low / 10 % 10];  //取十位顯示
  175.                 dis_smg[2] = 0xef;         
  176.                 dis_smg[3] = 0xBC;         //L
  177.         }        
  178. }  

  179. /****************電機控制函數***************/
  180. void dianji_kongzi()
  181. {
  182.         static uchar value,value1;
  183.         if(shidu <= s_low)
  184.         {
  185.                 value ++;
  186.                 if(value >= 2)
  187.                 {
  188.                         value = 10;
  189.                         dianji = 0;       //關機電機
  190.                 }
  191.         }
  192.         else
  193.           value = 0;
  194.         if(shidu >= s_high)
  195.         {
  196.                 value1 ++;
  197.                 if(value1 >= 2)
  198.                 {
  199.                         value1 = 10;
  200.                         dianji = 1;       //打開電機
  201.                 }
  202.         }else
  203.                 value1 = 0;
  204. }

  205. /***************主函數*****************/
  206. void main()
  207. {
  208.         delay_1ms(100);
  209.         P0 = P1 = P2 = P3 = 0xff;   //初始化IO口
  210.         while(1)
  211.         {
  212.                 key();                                        //獨立按鍵程序
  213.                 if(key_can < 10)
  214.                 {
  215.                         key_with();                        //按鍵按下要執行的程序
  216.                 }
  217.                 flag_200ms ++;
  218.                 if(flag_200ms >= 200)
  219.                 {               
  220.                         flag_200ms = 0;         
  221.                         P0 = 0xff;                         //消隱
  222.                         if(menu_1 == 0)
  223.                         {                                          
  224.                                 shidu = ad0832read(1,0);        //讀出濕度
  225.                                 shidu =100-shidu * 99 / 255;
  226.                                 dis_smg[0] = 0xff;         //
  227.                                 dis_smg[1] = smg_du[shidu % 10]; //取濕度的個位顯示
  228.                                 dis_smg[2] = smg_du[shidu / 10 % 10] ;//取濕度的十位顯示
  229.                                 dis_smg[3] = 0XFF;        //
  230.                                 dianji_kongzi();  //電機控制函數
  231.                         }
  232.                         
  233.                 }
  234.                 display();          //數碼管顯示函數
  235.                 delay_1ms(1);
  236.         }
  237. }
復制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

板凳
ID:213173 發表于 2018-5-5 06:44 | 只看該作者
通常數碼管的管腳 A~dp按順序對應接單片機P00~07,這就是常用的共陰極段碼0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f或共陽極段碼0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90。
從你的接線圖看不是常見接法,所以使用的段碼也不同。要顯示0必須使G和dp筆段高電平,其他筆段低電平。對應段碼是0x14,二進制碼0001 0100。其他數字段碼與其同理。
回復

使用道具 舉報

沙發
ID:319344 發表于 2018-5-4 21:36 | 只看該作者
運行了嗎?我覺得這是有錯誤的,0x14只是表示兩個段會亮,不可能顯示0,共陽極顯示0是0xc0(引腳與IO口相對應的情況下),可以找共陽極數碼管筆形碼表對應一下
回復

使用道具 舉報

樓主
ID:318768 發表于 2018-5-4 21:18 | 只看該作者
你可以把8段數碼管想象成8個小燈,顯示0要外圈6個燈亮,P0口要輸出00010100,轉換成16進制就是0X14.
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线日韩欧美 | 97avcc| 欧美精品三区 | 成人免费视频观看 | 草久视频| 国产精品夜夜春夜夜爽久久电影 | 性福视频在线观看 | 日韩和的一区二区 | 欧美日韩久久精品 | 怡红院怡春院一级毛片 | 国产成人影院 | 我想看一级黄色毛片 | 男女羞羞视频在线看 | 亚洲一区在线播放 | 一级黄色片日本 | 免费激情网站 | 日本不卡视频 | 网站黄色在线 | 色888www视频在线观看 | 亚洲第一网站 | 亚洲免费一区二区 | 欧美大片一区 | 精品国产一区二区三区久久久四川 | 亚洲精品大片 | 日韩中文一区二区 | 青青草视频免费观看 | 精品一区二区免费视频 | 久久国产婷婷国产香蕉 | 日韩精品在线一区 | 欧美一区二区三区视频 | 国产一区二区三区不卡av | 午夜伦理影院 | 无码一区二区三区视频 | 久久精品97 | 国产精品福利久久久 | 国产高清精品一区 | 天天久久| 国产成人在线观看免费 | 亚洲一区二区三区免费视频 | 伊人久久精品一区二区三区 | 国产高清精品一区二区三区 |