找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2923|回复: 1
收起左侧

51单片机学习:4*4矩阵键盘与可对时电子钟

[复制链接]
ID:161768 发表于 2017-2-9 22:19 | 显示全部楼层 |阅读模式
今天学习了下矩阵键盘,
4*4,  分别代表0~F这16个数字
我们按了哪个键就显示到数码管上

看完郭老师讲解原理后就自己动手写了,郁闷的是
在keil软件中,我在switch-case语句中 少了个冒号,竟然编译通过!
结果当然不正确了,然后我再keil中调试代码,那更郁闷了,P3口在扫描到第2行键盘时就
会复位成0xff,怎么赋值都没用,其实是没写冒号啊!

调了半天都不行,最后不得不将STC89C52RC换上仿真芯片SST89E516,在线调试后才发现的错误,
然后参考书上的代码才调试成功的,表示无语~~~

mark下
  1.     #include <reg52.h>  
  2.     #include "MY51.H"  
  3.       
  4.     void showKey(uint8 num); //静态显示  
  5.     void keyScan();  
  6.     void main()      
  7.     {     
  8.         showKey(18);    //初始显示的是6个负号  
  9.         while(1)  
  10.         {   //循环检测  
  11.             keyScan();  
  12.         }  
  13.     }  
  14.       
  15.     void showKey(uint8 num)  
  16.     {  
  17.         P0=0xc0;        //11000000 打开6个数码管  
  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;                 //定义显示的数字  
  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);   //静态显示按键  
  88.                 }  
  89.             }  
  90.         }     
  91.     }  
  92.     void T0_Work()  //T0定时器调用的工作函数  
  93.     {   
  94.       
  95.     }  
复制代码


  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++的内置类型  
  32.       
  33.     #define TRUE     1  
  34.     #define true     1  
  35.     #define FALSE    0  
  36.     #define false    0  
  37.       
  38.     #define open     1    //open和close用于 标志打开和关闭状态  
  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)  //软延时函数  
  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是低电平,数码管不亮  
  83.     #define dotDark 0xff //小数点全暗时  
  84.     uint8 code table[]= {           //0~F外加小数点和空输出的数码管编码  
  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;     //中断计数  
  96.     uint16  T0IntCountAll=0; //(N-1)/65536+1;  //总中断次数  
  97.     bool    bT0Delay=false;  //使用延时函数标志,初始未用  
  98.     bool    bT0Over=false;   //中断处理函数执行结果之一  
  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 ;               //定时器总计数值  
  105.       
  106.         TH0Cout =(65536-N%65536)/256;        //装入计时值零头计数初值  
  107.         TL0Cout =(65536-N%65536)%256;  
  108.         T0IntCountAll=(N-1)/65536+1;             //总中断次数  
  109.         TMOD=TMOD | 0x01;                        //设置定时器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)     //硬延时函数,自己乱写的不好用,求指点  
  120.     {  
  121.         startT0(ms);                //启动定时器  
  122.         bT0Delay=true;          //告诉T0定时器,起用延时模式  
  123.         while(bT0Over==false);  //时间没到的话继续检测  
  124.         bT0Over=false;              //时间到了,让标志复位  
  125.     }  
  126.       
  127.     void T0_times() interrupt 1 //T0定时器中断函数  
  128.     {  
  129.         T0IntCout++;  
  130.         if(T0IntCout==T0IntCountAll)  //达到总中断次数值  
  131.         {     
  132.             T0IntCout=0;         //中断次数清零,重新计时  
  133.             bT0Over=true;     //时间真的到了  
  134.             if(bT0Delay)        //本次中断是用来延时的吗  
  135.             {  
  136.                 TR0=stop;        //如果是由延时函数开启T0的话,关闭T0  
  137.                 return;  
  138.             }  
  139.       
  140.             TH0=TH0Cout;        //循环定时的话要重装初值,每次定时1秒,重装一次  
  141.             TL0=TL0Cout;  
  142.             T0_Work();          //工作函数  
  143.         }  
  144.     }  
  145.       
  146.     ////////////////////////////////////////////////////////////////////////////////  
  147.     void displaySMG(uint8 oneWela,uint8 twoWela,uint8 threeWela,uint8 fourWela,uint8 fiveWela,uint8 sixWela,uint8 dot)  
  148.     {       //控制6位数码管显示函数,不显示的位用参数 dark  
  149.             P0=0;  
  150.             dula=1;  
  151.             dula=0;  //段选数据清空并锁定  
  152.     //////////////////////////  
  153.             P0=0xff; //送位数据前关闭所有显示  
  154.             wela=1;  
  155.             P0=0xfe;  
  156.             wela=0;  
  157.       
  158.             P0=0;   //低电平输到数码管阳极,避免数码管吴亮  
  159.           dula=1;  
  160.             P0=table[oneWela]|((0x01&dot)?0x00:0x80);   //送段数据,使用小数点显示标志  
  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  
复制代码




回复

使用道具 举报

ID:161768 发表于 2017-2-9 22:21 | 显示全部楼层
51单片机学习笔记:可对时电子钟
本篇是对上一篇的改进,昨天学习了第4章 中的独立键盘的使用
独立键盘拥有自己独有的IO口,所以比较简单,我上一篇写的电子钟程序只能烧程序对时,
不能手动按键对时,这肯定是最差劲的做法,所以学习了按键之后,就立马动手改进我的电子钟了
同时改进了数码管小数点的显示,消除了叠影

使用芯片STC89C52RC, 2个锁存器
6个带小数点共阴极数码管显示一个24时制时钟
没有时钟芯片,所以掉电后时间会复位
原理图为TX-1C开发板

==============================
最终显示的<时.分.秒>是 16.31.37  形式

使用3个按键,  S2  S3   S5
其中S2和S3是加减数值,S5是切换对时状态,
  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();     //送入数码管显示  
  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键进行状态切换     
  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();         //刷新数码管  
  52.                         if(keyS2==keyDown)//S2和S3用于调整数值,加减运算  
  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键被按着,也要刷新数码管  
  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键切换状态  
  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;  //对时结束,指示灯灭  
  164.                 }     
  165.             }  
  166.         }  
  167.     }  
  168.       
  169.       
  170.     void show()  //显示时钟  
  171.     {  
  172.         uint8 oneWela,twoWela,threeWela,foreWela,fiveWela,sixWela; //oneWela是最左边的数码管  
  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是小数点的位置  
  180.     }  
  181.       
  182.     void T0_Work()  //T0定时器调用的工作函数  
  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.     }  
复制代码


  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++的内置类型  
  32.   
  33. #define TRUE     1  
  34. #define true     1  
  35. #define FALSE    0  
  36. #define false    0  
  37.   
  38. #define open     1    //open和close用于 标志打开和关闭状态  
  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)  //软延时函数  
  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是低电平,数码管不亮  
  83. #define dotDark 0xff //小数点全暗时  
  84. uint8 code table[]= {           //0~F外加小数点和空输出的数码管编码  
  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;     //中断计数  
  96. uint16  T0IntCountAll=0; //(N-1)/65536+1;  //总中断次数  
  97. bool    bT0Delay=false;  //使用延时函数标志,初始未用  
  98. bool    bT0Over=false;   //中断处理函数执行结果之一  
  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 ;               //定时器总计数值  
  105.   
  106.     TH0Cout =(65536-N%65536)/256;        //装入计时值零头计数初值  
  107.     TL0Cout =(65536-N%65536)%256;  
  108.     T0IntCountAll=(N-1)/65536+1;             //总中断次数  
  109.     TMOD=TMOD | 0x01;                        //设置定时器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)     //硬延时函数,自己乱写的不好用,求指点  
  120. {  
  121.     startT0(ms);                //启动定时器  
  122.     bT0Delay=true;          //告诉T0定时器,起用延时模式  
  123.     while(bT0Over==false);  //时间没到的话继续检测  
  124.     bT0Over=false;              //时间到了,让标志复位  
  125. }  
  126.   
  127. void T0_times() interrupt 1 //T0定时器中断函数  
  128. {  
  129.     T0IntCout++;  
  130.     if(T0IntCout==T0IntCountAll)  //达到总中断次数值  
  131.     {     
  132.         T0IntCout=0;         //中断次数清零,重新计时  
  133.         bT0Over=true;     //时间真的到了  
  134.         if(bT0Delay)        //本次中断是用来延时的吗  
  135.         {  
  136.             TR0=stop;        //如果是由延时函数开启T0的话,关闭T0  
  137.             return;  
  138.         }  
  139.   
  140.         TH0=TH0Cout;        //循环定时的话要重装初值,每次定时1秒,重装一次  
  141.         TL0=TL0Cout;  
  142.         T0_Work();          //工作函数  
  143.     }  
  144. }  
  145.   
  146. ////////////////////////////////////////////////////////////////////////////////  
  147. void displaySMG(uint8 oneWela,uint8 twoWela,uint8 threeWela,uint8 fourWela,uint8 fiveWela,uint8 sixWela,uint8 dot)  
  148. {       //控制6位数码管显示函数,不显示的位用参数 dark  
  149.         P0=0;  
  150.         dula=1;  
  151.         dula=0;  //段选数据清空并锁定  
  152. //////////////////////////  
  153.         P0=0xff; //送位数据前关闭所有显示  
  154.         wela=1;  
  155.         P0=0xfe;  
  156.         wela=0;  
  157.   
  158.         P0=0;   //低电平输到数码管阳极,避免数码管吴亮  
  159.       dula=1;  
  160.         P0=table[oneWela]|((0x01&dot)?0x00:0x80);   //送段数据,小数点可选显示      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
复制代码





回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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