找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3508|回復(fù): 1
收起左側(cè)

51單片機學(xué)習(xí):4*4矩陣鍵盤與可對時電子鐘

[復(fù)制鏈接]
ID:161768 發(fā)表于 2017-2-9 22:19 | 顯示全部樓層 |閱讀模式
今天學(xué)習(xí)了下矩陣鍵盤,
4*4,  分別代表0~F這16個數(shù)字
我們按了哪個鍵就顯示到數(shù)碼管上

看完郭老師講解原理后就自己動手寫了,郁悶的是
在keil軟件中,我在switch-case語句中 少了個冒號,竟然編譯通過!
結(jié)果當然不正確了,然后我再keil中調(diào)試代碼,那更郁悶了,P3口在掃描到第2行鍵盤時就
會復(fù)位成0xff,怎么賦值都沒用,其實是沒寫冒號啊!

調(diào)了半天都不行,最后不得不將STC89C52RC換上仿真芯片SST89E516,在線調(diào)試后才發(fā)現(xiàn)的錯誤,
然后參考書上的代碼才調(diào)試成功的,表示無語~~~

mark下
  1.     #include <reg52.h>  
  2.     #include "MY51.H"  
  3.       
  4.     void showKey(uint8 num); //靜態(tài)顯示  
  5.     void keyScan();  
  6.     void main()      
  7.     {     
  8.         showKey(18);    //初始顯示的是6個負號  
  9.         while(1)  
  10.         {   //循環(huán)檢測  
  11.             keyScan();  
  12.         }  
  13.     }  
  14.       
  15.     void showKey(uint8 num)  
  16.     {  
  17.         P0=0xc0;        //11000000 打開6個數(shù)碼管  
  18.         wela=open;  
  19.         wela=lock;  
  20.          
  21.         P0=table[num];  
  22.         dula=1;  
  23.         dula=0;  
  24.     }  
  25.     void keyScan()  
  26.     {  
  27.         uint8 num=0;                 //定義顯示的數(shù)字  
  28.         uint8 temp=0;                //P3口回讀信息  
  29.         uint8 i=0;                      //定義矩陣鍵盤行號索引      
  30.         for(i=0; i<4;i++)           //共4行  
  31.         {  
  32.             P3=_crol_(0xfe,i);      //掃描的行索引號,從第0行到第3行  
  33.             temp=P3;                  //讀取P3口  
  34.             temp=temp&0xf0;         //提取高4位  
  35.             if(temp!=0xf0)          //按鍵了  
  36.             {  
  37.                 delayms(5);          //消抖  
  38.                 temp=P3;  
  39.                 temp=temp&0xf0;  
  40.                 if(temp!=0xf0)     //真的按鍵了  
  41.                 {  
  42.                     switch(temp)  
  43.                     {  
  44.                         case  0xe0:         //1110 0000  
  45.                         {  
  46.                             num=0+4*i;  
  47.                             break;  
  48.                         }  
  49.                         case  0xd0:         //1101 0000  
  50.                         {  
  51.                             num=1+4*i;  
  52.                             break;  
  53.                         }  
  54.                         case  0xb0:         //1011 0000  
  55.                         {  
  56.                             num=2+4*i;  
  57.                             break;  
  58.                         }  
  59.                         case  0x70:         //0111 0000  
  60.                         {  
  61.                             num=3+4*i;  
  62.                             break;  
  63.                         }           
  64.                         default:  
  65.                         {  
  66.                             num=18;         //18號索引是負號  
  67.                             led7=0;           // 按了不該按的指示燈  
  68.                             break;  
  69.                         }  
  70.       
  71.                     }  
  72.                     while(1)    //松開按鍵檢測  
  73.                     {  
  74.                         temp=P3;               //讀取P3口  
  75.                         temp=temp&0xf0;   //提取高4位  
  76.                         if(temp==0xf0)      //松開按鍵了  
  77.                         {  
  78.                             delayms(5);  
  79.                             temp=P3;  
  80.                             temp=temp&0xf0;  
  81.                             if(temp==0xf0)  //真的松開鍵盤了  
  82.                             {  
  83.                                 break;  
  84.                             }  
  85.                         }  
  86.                     }  
  87.                     showKey(num);   //靜態(tài)顯示按鍵  
  88.                 }  
  89.             }  
  90.         }     
  91.     }  
  92.     void T0_Work()  //T0定時器調(diào)用的工作函數(shù)  
  93.     {   
  94.       
  95.     }  
復(fù)制代碼


  1.     #ifndef _MY51_H_  
  2.     #define _MY51_H_  
  3.     #include <math.h>  
  4.     #include <intrins.h>  
  5.       
  6.     typedef int                 int16  ;  
  7.     typedef int                 INT16  ;  
  8.     typedef unsigned int    uint16 ;  
  9.     typedef unsigned int    UINT16 ;  
  10.     typedef unsigned short  uint ;  
  11.     typedef unsigned short  UINT ;  
  12.     typedef unsigned short  word ;  
  13.     typedef unsigned short  WORD ;  
  14.     typedef unsigned long   uint32 ;  
  15.     typedef unsigned long   UINT32 ;  
  16.     typedef unsigned long   DWORD ;  
  17.     typedef unsigned long   dword ;  
  18.     typedef signed long    int32     ;  
  19.     typedef signed long    INT32  ;  
  20.     typedef float                   float32  ;  
  21.     typedef double              double64  ;  
  22.     typedef signed char     int8 ;  
  23.     typedef signed char         INT8 ;  
  24.     typedef unsigned char   byte ;  
  25.     typedef unsigned char    BYTE    ;      //WINDOWS的windef.h里面是這么定義的  
  26.     typedef unsigned char   uchar ;  
  27.     typedef unsigned char   UCHAR ;  
  28.     typedef unsigned char   UINT8 ;  
  29.     typedef unsigned char   uint8 ;  
  30.     typedef unsigned char   BOOL     ;      //windows中定義BOOL為int  
  31.     typedef unsigned char   bool     ;          //bool是c++的內(nèi)置類型  
  32.       
  33.     #define TRUE     1  
  34.     #define true     1  
  35.     #define FALSE    0  
  36.     #define false    0  
  37.       
  38.     #define open     1    //open和close用于 標志打開和關(guān)閉狀態(tài)  
  39.     #define OPEN     1  
  40.     #define close    0  
  41.     #define CLOSE    0  
  42.     #define lock     0  
  43.     #define start    1  
  44.     #define START    1  
  45.     #define stop     0  
  46.     #define STOP     0  
  47.     #define keyDown  0  
  48.     #define keyUp    1  
  49.       
  50.     sbit dula =P2^6;  //段選鎖存器控制  控制筆段  
  51.     sbit wela =P2^7;  //位選鎖存器控制  控制位置  
  52.       
  53.     #define led P1    //燈總線控制  
  54.     sbit led0=P1^0;   //8個led燈,陰極送低電平點亮  
  55.     sbit led1=P1^1;  
  56.     sbit led2=P1^2;  
  57.     sbit led3=P1^3;  
  58.     sbit led4=P1^4;  
  59.     sbit led5=P1^5;  
  60.     sbit led6=P1^6;  
  61.     sbit led7=P1^7;  
  62.       
  63.     sbit keyS2=P3^4;    //4個獨立按鍵  
  64.     sbit keyS3=P3^5;  
  65.     sbit keyS4=P3^6;  
  66.     sbit keyS5=P3^7;  
  67.       
  68.     void displaySMG(uint8 one,uint8 two,uint8 three,uint8 four,uint8 five,uint8 six,uint8 dot);   
  69.     void delayms(uint16 ms);  
  70.     void T0_Work();  
  71.       
  72.     void delayms(uint16 ms)  //軟延時函數(shù)  
  73.     {  
  74.         uint16 i,j;  
  75.         for(i=ms;i>0;i--)  
  76.         {  
  77.             for(j=113;j>0;j--)  
  78.             {}  
  79.         }  
  80.     }  
  81.     ///////////////////////////////////////////////////////////////////////////  
  82.     #define dark    0x11  //在段中,0x11是第17號元素,為0是低電平,數(shù)碼管不亮  
  83.     #define dotDark 0xff //小數(shù)點全暗時  
  84.     uint8 code table[]= {           //0~F外加小數(shù)點和空輸出的數(shù)碼管編碼  
  85.      0x3f , 0x06 , 0x5b , 0x4f , // 0 1 2 3  
  86.      0x66 , 0x6d , 0x7d , 0x07 , // 4 5 6 7  
  87.      0x7f , 0x6f , 0x77 , 0x7c , // 8 9 A B  
  88.      0x39 , 0x5e , 0x79 , 0x71 , // C D E F  
  89.      0x80 , 0x00 ,0x40              // . 空  負號      空時是第0x11號也就是第17號元素  
  90.      };  
  91.       
  92.     /////////////////////////////////////////////////////////////////////////////  
  93.     uint8   TH0Cout=0 ;     //初值      
  94.     uint8   TL0Cout=0 ;      
  95.     uint16  T0IntCout=0;     //中斷計數(shù)  
  96.     uint16  T0IntCountAll=0; //(N-1)/65536+1;  //總中斷次數(shù)  
  97.     bool    bT0Delay=false;  //使用延時函數(shù)標志,初始未用  
  98.     bool    bT0Over=false;   //中斷處理函數(shù)執(zhí)行結(jié)果之一  
  99.       
  100.     void startT0(uint32 ms)  //開啟定時器  
  101.     {     
  102.         float32     t=ms/1000.0;                 //定時時間  
  103.         double64    fox =11.0592*(pow(10,6));   //晶振頻率  
  104.         uint32      N=(t*fox)/12 ;               //定時器總計數(shù)值  
  105.       
  106.         TH0Cout =(65536-N%65536)/256;        //裝入計時值零頭計數(shù)初值  
  107.         TL0Cout =(65536-N%65536)%256;  
  108.         T0IntCountAll=(N-1)/65536+1;             //總中斷次數(shù)  
  109.         TMOD=TMOD | 0x01;                        //設(shè)置定時器0的工作方式為1  
  110.          
  111.         EA =open;   //打開總中斷  
  112.         ET0=open;   //打開定時器中斷  
  113.       
  114.         TH0=TH0Cout;  //定時器裝入初值  
  115.         TL0=TL0Cout;  
  116.         TR0=start;   //啟動定時器  
  117.     }  
  118.       
  119.     void delayT0(uint32 ms)     //硬延時函數(shù),自己亂寫的不好用,求指點  
  120.     {  
  121.         startT0(ms);                //啟動定時器  
  122.         bT0Delay=true;          //告訴T0定時器,起用延時模式  
  123.         while(bT0Over==false);  //時間沒到的話繼續(xù)檢測  
  124.         bT0Over=false;              //時間到了,讓標志復(fù)位  
  125.     }  
  126.       
  127.     void T0_times() interrupt 1 //T0定時器中斷函數(shù)  
  128.     {  
  129.         T0IntCout++;  
  130.         if(T0IntCout==T0IntCountAll)  //達到總中斷次數(shù)值  
  131.         {     
  132.             T0IntCout=0;         //中斷次數(shù)清零,重新計時  
  133.             bT0Over=true;     //時間真的到了  
  134.             if(bT0Delay)        //本次中斷是用來延時的嗎  
  135.             {  
  136.                 TR0=stop;        //如果是由延時函數(shù)開啟T0的話,關(guān)閉T0  
  137.                 return;  
  138.             }  
  139.       
  140.             TH0=TH0Cout;        //循環(huán)定時的話要重裝初值,每次定時1秒,重裝一次  
  141.             TL0=TL0Cout;  
  142.             T0_Work();          //工作函數(shù)  
  143.         }  
  144.     }  
  145.       
  146.     ////////////////////////////////////////////////////////////////////////////////  
  147.     void displaySMG(uint8 oneWela,uint8 twoWela,uint8 threeWela,uint8 fourWela,uint8 fiveWela,uint8 sixWela,uint8 dot)  
  148.     {       //控制6位數(shù)碼管顯示函數(shù),不顯示的位用參數(shù) dark  
  149.             P0=0;  
  150.             dula=1;  
  151.             dula=0;  //段選數(shù)據(jù)清空并鎖定  
  152.     //////////////////////////  
  153.             P0=0xff; //送位數(shù)據(jù)前關(guān)閉所有顯示  
  154.             wela=1;  
  155.             P0=0xfe;  
  156.             wela=0;  
  157.       
  158.             P0=0;   //低電平輸?shù)綌?shù)碼管陽極,避免數(shù)碼管吳亮  
  159.           dula=1;  
  160.             P0=table[oneWela]|((0x01&dot)?0x00:0x80);   //送段數(shù)據(jù),使用小數(shù)點顯示標志  
  161.             dula=0;  
  162.             delayms(2);  
  163.     /////////////////////////  
  164.             P0=0xff;  
  165.             wela=1;  
  166.             P0=0xfd;  
  167.             wela=0;  
  168.       
  169.             P0=0;  
  170.             dula=1;  
  171.             P0=table[twoWela]|((0x02&dot)?0x00:0x80);  
  172.             dula=0;  
  173.             delayms(2);  
  174.     /////////////////////////  
  175.             P0=0xff;  
  176.             wela=1;  
  177.             P0=0xfb;  
  178.             wela=0;  
  179.             P0=0;  
  180.             dula=1;  
  181.             P0=table[threeWela]|((0x04&dot)?0x00:0x80);  
  182.             dula=0;  
  183.             delayms(2);  
  184.     /////////////////////////  
  185.             P0=0xff;  
  186.             wela=1;  
  187.             P0=0xf7;  
  188.             wela=0;  
  189.       
  190.             P0=0;  
  191.             dula=1;  
  192.             P0=table[fourWela]|((0x08&dot)?0x00:0x80);  
  193.             dula=0;  
  194.             delayms(2);  
  195.     /////////////////////////  
  196.             P0=0xff;  
  197.             wela=1;  
  198.             P0=0xef;  
  199.             wela=0;  
  200.       
  201.             P0=0;  
  202.             dula=1;  
  203.             P0=table[fiveWela]|((0x10&dot)?0x00:0x80);  
  204.             dula=0;  
  205.             delayms(2);  
  206.     /////////////////////////  
  207.             P0=0xff;  
  208.             wela=1;  
  209.             P0=0xdf;  
  210.             wela=0;  
  211.       
  212.             P0=0;  
  213.             dula=1;  
  214.             P0=table[sixWela]|((0x20&dot)?0x00:0x80);  
  215.             dula=0;  
  216.             delayms(2);  
  217.     }  
  218.       
  219.     #endif  
復(fù)制代碼




相關(guān)帖子

回復(fù)

使用道具 舉報

ID:161768 發(fā)表于 2017-2-9 22:21 | 顯示全部樓層
51單片機學(xué)習(xí)筆記:可對時電子鐘
本篇是對上一篇的改進,昨天學(xué)習(xí)了第4章 中的獨立鍵盤的使用
獨立鍵盤擁有自己獨有的IO口,所以比較簡單,我上一篇寫的電子鐘程序只能燒程序?qū)r,
不能手動按鍵對時,這肯定是最差勁的做法,所以學(xué)習(xí)了按鍵之后,就立馬動手改進我的電子鐘了
同時改進了數(shù)碼管小數(shù)點的顯示,消除了疊影

使用芯片STC89C52RC, 2個鎖存器
6個帶小數(shù)點共陰極數(shù)碼管顯示一個24時制時鐘
沒有時鐘芯片,所以掉電后時間會復(fù)位
原理圖為TX-1C開發(fā)板

==============================
最終顯示的<時.分.秒>是 16.31.37  形式

使用3個按鍵,  S2  S3   S5
其中S2和S3是加減數(shù)值,S5是切換對時狀態(tài),
  1.     #include <reg52.h>  
  2.     #include "MY51.H"  
  3.       
  4.     void show();  
  5.     int8  shi=22;   //初識時間22:45:00  按S5鍵進入對時模式  
  6.     int8  fen=45;  
  7.     int8  miao=0;  
  8.     uint8  timeFlag=0;//0計時模式,1校對時鐘,2校對分鐘,3校對秒鐘  
  9.     void main()      
  10.     {  
  11.         startT0(1000);  //開始定時器  
  12.         while(1)  
  13.         {         
  14.             show();     //送入數(shù)碼管顯示  
  15.             if(keyS5==keyDown) //按下S5鍵  
  16.             {  
  17.                 delayms(5);//消抖處理  
  18.                 if(keyS5==keyDown)  
  19.                 {  
  20.                     while(1)  
  21.                     {  
  22.                         show();  
  23.                         if(keyS5==keyUp)//放開按鈕  
  24.                         {  
  25.                             delayms(5); //消抖處理  
  26.                             if(keyS5==keyUp)  
  27.                             {  
  28.                                 break;  
  29.                             }  
  30.                         }  
  31.                     }  
  32.                     timeFlag=(++timeFlag)%4; //按S5鍵進行狀態(tài)切換     
  33.                     while(timeFlag)  
  34.                     {  
  35.                         if(timeFlag==1)  
  36.                         {  
  37.                             led=0xff;  
  38.                             led7=0;       //進入對時鐘模式,且打開7號指示燈                  
  39.                         }  
  40.                         else if(timeFlag==2)  
  41.                         {  
  42.                              led=0xff;  
  43.                              led5=0;     //進入校對分鐘模式,且打開5號指示燈  
  44.                         }  
  45.                         else if(timeFlag==3)  
  46.                         {  
  47.                              led=0xff;  
  48.                              led3=0;     //進入校對秒鐘模式,且打開3號指示燈  
  49.                         }  
  50.          
  51.                         show();         //刷新數(shù)碼管  
  52.                         if(keyS2==keyDown)//S2和S3用于調(diào)整數(shù)值,加減運算  
  53.                         {  
  54.                             delayms(5);//消抖處理  
  55.                             if(keyS2==keyDown)  
  56.                             {  
  57.                                 if(timeFlag==1)  
  58.                                 {  
  59.                                     shi--;  
  60.                                     if(shi<0)   
  61.                                     {  
  62.                                         shi=23;  
  63.                                     }                          
  64.                                 }  
  65.                                 else if(timeFlag==2)  
  66.                                 {  
  67.                                     fen--;  
  68.                                     if(fen<0)  
  69.                                     {  
  70.                                         fen=59;  
  71.                                     }  
  72.                                 }  
  73.                                 else if(timeFlag==3)  
  74.                                 {  
  75.                                     miao--;  
  76.                                     if(miao<0)  
  77.                                     {  
  78.                                         miao=59;  
  79.                                     }  
  80.                                 }  
  81.                                 while(1)  
  82.                                 {  
  83.                                     show(); //就算S2鍵被按著,也要刷新數(shù)碼管  
  84.                                     if(keyS2==keyUp)  
  85.                                     {  
  86.                                         delayms(10);  
  87.                                         if(keyS2==keyUp)  
  88.                                         {  
  89.                                             break;  
  90.                                         }  
  91.                                     }  
  92.                                 }  
  93.       
  94.                             }     
  95.                         }  
  96.                           
  97.                         if(keyS3==keyDown)  
  98.                         {  
  99.                             delayms(5);//消抖處理  
  100.                             if(keyS3==keyDown)  
  101.                             {  
  102.                                 if(timeFlag==1)  
  103.                                 {  
  104.                                     shi++;  
  105.                                     if(shi>23)  
  106.                                     {  
  107.                                         shi=0;  
  108.                                     }                           
  109.                                 }  
  110.                                 else if(timeFlag==2)  
  111.                                 {  
  112.                                     fen++;  
  113.                                     if(fen>59)  
  114.                                     {  
  115.                                         fen=0;  
  116.                                     }  
  117.                                 }  
  118.                                 else if(timeFlag==3)  
  119.                                 {  
  120.                                     miao++;  
  121.                                     if(miao>59)  
  122.                                     {  
  123.                                         miao=0;  
  124.                                     }  
  125.                                 }  
  126.                                 while(1)  
  127.                                 {  
  128.                                     show();  
  129.                                     if(keyS3==keyUp)  
  130.                                     {  
  131.                                         delayms(5);  
  132.                                         if(keyS3==keyUp)  
  133.                                         {  
  134.                                             break;  
  135.                                         }  
  136.                                     }  
  137.                                 }  
  138.       
  139.                             }     
  140.                         }     
  141.                           
  142.                         if(keyS5==keyDown)  
  143.                         {  
  144.                             delayms(5);//消抖處理  
  145.                             if(keyS5==keyDown)  
  146.                             {  
  147.                                 timeFlag=(++timeFlag)%4;//按S5鍵切換狀態(tài)  
  148.                                 while(1)  
  149.                                 {  
  150.                                     show();  
  151.                                     if(keyS5==keyUp)  
  152.                                     {  
  153.                                         delayms(5);  
  154.                                         if(keyS5==keyUp)  
  155.                                         {  
  156.                                             break;  
  157.                                         }  
  158.                                     }  
  159.                                 }  
  160.                             }     
  161.                         }     
  162.                     }  
  163.                     led=0xff;  //對時結(jié)束,指示燈滅  
  164.                 }     
  165.             }  
  166.         }  
  167.     }  
  168.       
  169.       
  170.     void show()  //顯示時鐘  
  171.     {  
  172.         uint8 oneWela,twoWela,threeWela,foreWela,fiveWela,sixWela; //oneWela是最左邊的數(shù)碼管  
  173.         sixWela =miao%10;  
  174.         fiveWela=miao/10;     
  175.         foreWela=fen%10;  
  176.         threeWela=fen/10;  
  177.         twoWela=shi%10;  
  178.         oneWela=shi/10;  
  179.         displaySMG(oneWela,twoWela,threeWela,foreWela,fiveWela,sixWela,0xf5); //0xf5是小數(shù)點的位置  
  180.     }  
  181.       
  182.     void T0_Work()  //T0定時器調(diào)用的工作函數(shù)  
  183.     {   
  184.        miao++;  
  185.         if(miao>59)  
  186.         {  
  187.             miao=0;  
  188.             fen++;  
  189.         }  
  190.       
  191.         if(fen>59)  
  192.         {  
  193.             fen=0;  
  194.             shi++;  
  195.         }   
  196.          
  197.         if(shi>23)  
  198.         {  
  199.             shi=0;  
  200.         }  
  201.     }  
復(fù)制代碼


  1. #ifndef _MY51_H_  
  2. #define _MY51_H_  
  3. #include <math.h>  
  4. #include <intrins.h>  
  5.   
  6. typedef int                 int16  ;  
  7. typedef int                 INT16  ;  
  8. typedef unsigned int    uint16 ;  
  9. typedef unsigned int    UINT16 ;  
  10. typedef unsigned short  uint ;  
  11. typedef unsigned short  UINT ;  
  12. typedef unsigned short  word ;  
  13. typedef unsigned short  WORD ;  
  14. typedef unsigned long   uint32 ;  
  15. typedef unsigned long   UINT32 ;  
  16. typedef unsigned long   DWORD ;  
  17. typedef unsigned long   dword ;  
  18. typedef signed long    int32     ;  
  19. typedef signed long    INT32  ;  
  20. typedef float                   float32  ;  
  21. typedef double              double64  ;  
  22. typedef signed char     int8 ;  
  23. typedef signed char         INT8 ;  
  24. typedef unsigned char   byte ;  
  25. typedef unsigned char    BYTE    ;      //WINDOWS的windef.h里面是這么定義的  
  26. typedef unsigned char   uchar ;  
  27. typedef unsigned char   UCHAR ;  
  28. typedef unsigned char   UINT8 ;  
  29. typedef unsigned char   uint8 ;  
  30. typedef unsigned char   BOOL     ;      //windows中定義BOOL為int  
  31. typedef unsigned char   bool     ;          //bool是c++的內(nèi)置類型  
  32.   
  33. #define TRUE     1  
  34. #define true     1  
  35. #define FALSE    0  
  36. #define false    0  
  37.   
  38. #define open     1    //open和close用于 標志打開和關(guān)閉狀態(tài)  
  39. #define OPEN     1  
  40. #define close    0  
  41. #define CLOSE    0  
  42. #define lock     0  
  43. #define start    1  
  44. #define START    1  
  45. #define stop     0  
  46. #define STOP     0  
  47. #define keyDown  0  
  48. #define keyUp    1  
  49.   
  50. sbit dula =P2^6;  //段選鎖存器控制  控制筆段  
  51. sbit wela =P2^7;  //位選鎖存器控制  控制位置  
  52.   
  53. #define led P1    //燈總線控制  
  54. sbit led0=P1^0;   //8個led燈,陰極送低電平點亮  
  55. sbit led1=P1^1;  
  56. sbit led2=P1^2;  
  57. sbit led3=P1^3;  
  58. sbit led4=P1^4;  
  59. sbit led5=P1^5;  
  60. sbit led6=P1^6;  
  61. sbit led7=P1^7;  
  62.   
  63. sbit keyS2=P3^4;    //4個獨立按鍵  
  64. sbit keyS3=P3^5;  
  65. sbit keyS4=P3^6;  
  66. sbit keyS5=P3^7;  
  67.   
  68. void displaySMG(uint8 one,uint8 two,uint8 three,uint8 four,uint8 five,uint8 six,uint8 dot);   
  69. void delayms(uint16 ms);  
  70. void T0_Work();  
  71.   
  72. void delayms(uint16 ms)  //軟延時函數(shù)  
  73. {  
  74.     uint16 i,j;  
  75.     for(i=ms;i>0;i--)  
  76.     {  
  77.         for(j=113;j>0;j--)  
  78.         {}  
  79.     }  
  80. }  
  81. ///////////////////////////////////////////////////////////////////////////  
  82. #define dark    0x11  //在段中,0x11是第17號元素,為0是低電平,數(shù)碼管不亮  
  83. #define dotDark 0xff //小數(shù)點全暗時  
  84. uint8 code table[]= {           //0~F外加小數(shù)點和空輸出的數(shù)碼管編碼  
  85. 0x3f , 0x06 , 0x5b , 0x4f , // 0 1 2 3  
  86. 0x66 , 0x6d , 0x7d , 0x07 , // 4 5 6 7  
  87. 0x7f , 0x6f , 0x77 , 0x7c , // 8 9 A B  
  88. 0x39 , 0x5e , 0x79 , 0x71 , // C D E F  
  89. 0x80 , 0x00                 // . 空     空時是第0x11號也就是第17號元素  
  90. };  
  91.   
  92. /////////////////////////////////////////////////////////////////////////////  
  93. uint8   TH0Cout=0 ;     //初值      
  94. uint8   TL0Cout=0 ;      
  95. uint16  T0IntCout=0;     //中斷計數(shù)  
  96. uint16  T0IntCountAll=0; //(N-1)/65536+1;  //總中斷次數(shù)  
  97. bool    bT0Delay=false;  //使用延時函數(shù)標志,初始未用  
  98. bool    bT0Over=false;   //中斷處理函數(shù)執(zhí)行結(jié)果之一  
  99.   
  100. void startT0(uint32 ms)  //開啟定時器  
  101. {     
  102.     float32     t=ms/1000.0;                 //定時時間  
  103.     double64    fox =11.0592*(pow(10,6));   //晶振頻率  
  104.     uint32      N=(t*fox)/12 ;               //定時器總計數(shù)值  
  105.   
  106.     TH0Cout =(65536-N%65536)/256;        //裝入計時值零頭計數(shù)初值  
  107.     TL0Cout =(65536-N%65536)%256;  
  108.     T0IntCountAll=(N-1)/65536+1;             //總中斷次數(shù)  
  109.     TMOD=TMOD | 0x01;                        //設(shè)置定時器0的工作方式為1  
  110.       
  111.     EA =open;   //打開總中斷  
  112.     ET0=open;   //打開定時器中斷  
  113.   
  114.     TH0=TH0Cout;  //定時器裝入初值  
  115.     TL0=TL0Cout;  
  116.     TR0=start;   //啟動定時器  
  117. }  
  118.   
  119. void delayT0(uint32 ms)     //硬延時函數(shù),自己亂寫的不好用,求指點  
  120. {  
  121.     startT0(ms);                //啟動定時器  
  122.     bT0Delay=true;          //告訴T0定時器,起用延時模式  
  123.     while(bT0Over==false);  //時間沒到的話繼續(xù)檢測  
  124.     bT0Over=false;              //時間到了,讓標志復(fù)位  
  125. }  
  126.   
  127. void T0_times() interrupt 1 //T0定時器中斷函數(shù)  
  128. {  
  129.     T0IntCout++;  
  130.     if(T0IntCout==T0IntCountAll)  //達到總中斷次數(shù)值  
  131.     {     
  132.         T0IntCout=0;         //中斷次數(shù)清零,重新計時  
  133.         bT0Over=true;     //時間真的到了  
  134.         if(bT0Delay)        //本次中斷是用來延時的嗎  
  135.         {  
  136.             TR0=stop;        //如果是由延時函數(shù)開啟T0的話,關(guān)閉T0  
  137.             return;  
  138.         }  
  139.   
  140.         TH0=TH0Cout;        //循環(huán)定時的話要重裝初值,每次定時1秒,重裝一次  
  141.         TL0=TL0Cout;  
  142.         T0_Work();          //工作函數(shù)  
  143.     }  
  144. }  
  145.   
  146. ////////////////////////////////////////////////////////////////////////////////  
  147. void displaySMG(uint8 oneWela,uint8 twoWela,uint8 threeWela,uint8 fourWela,uint8 fiveWela,uint8 sixWela,uint8 dot)  
  148. {       //控制6位數(shù)碼管顯示函數(shù),不顯示的位用參數(shù) dark  
  149.         P0=0;  
  150.         dula=1;  
  151.         dula=0;  //段選數(shù)據(jù)清空并鎖定  
  152. //////////////////////////  
  153.         P0=0xff; //送位數(shù)據(jù)前關(guān)閉所有顯示  
  154.         wela=1;  
  155.         P0=0xfe;  
  156.         wela=0;  
  157.   
  158.         P0=0;   //低電平輸?shù)綌?shù)碼管陽極,避免數(shù)碼管吳亮  
  159.       dula=1;  
  160.         P0=table[oneWela]|((0x01&dot)?0x00:0x80);   //送段數(shù)據(jù),小數(shù)點可選顯示      dula=0;  
  161.         delayms(2);  
  162. /////////////////////////  
  163.         P0=0xff;  
  164.         wela=1;  
  165.         P0=0xfd;  
  166.         wela=0;  
  167.   
  168.         P0=0;  
  169.         dula=1;  
  170.         P0=table[twoWela]|((0x02&dot)?0x00:0x80);  
  171.         dula=0;  
  172.         delayms(2);  
  173. /////////////////////////  
  174.         P0=0xff;  
  175.         wela=1;  
  176.         P0=0xfb;  
  177.         wela=0;  
  178.         P0=0;  
  179.         dula=1;  
  180.         P0=table[threeWela]|((0x04&dot)?0x00:0x80);  
  181.         dula=0;  
  182.         delayms(2);  
  183. /////////////////////////  
  184.         P0=0xff;  
  185.         wela=1;  
  186.         P0=0xf7;  
  187.         wela=0;  
  188.   
  189.         P0=0;  
  190.         dula=1;  
  191.         P0=table[fourWela]|((0x08&dot)?0x00:0x80);  
  192.         dula=0;  
  193.         delayms(2);  
  194. /////////////////////////  
  195.         P0=0xff;  
  196.         wela=1;  
  197.         P0=0xef;  
  198.         wela=0;  
  199.   
  200.         P0=0;  
  201.         dula=1;  
  202.         P0=table[fiveWela]|((0x10&dot)?0x00:0x80);  
  203.         dula=0;  
  204.         delayms(2);  
  205. /////////////////////////  
  206.         P0=0xff;  
  207.         wela=1;  
  208.         P0=0xdf;  
  209.         wela=0;  
  210.   
  211.         P0=0;  
  212.         dula=1;  
  213.         P0=table[sixWela]|((0x20&dot)?0x00:0x80);  
  214.         dula=0;  
  215.         delayms(2);  
  216. }  
  217.   
  218. #endif
復(fù)制代碼





回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表