标题: 单片机中断扫描数码管显示程序 [打印本页]

作者: 506282027    时间: 2017-8-5 15:55
标题: 单片机中断扫描数码管显示程序
  1. /*
  2. 按下S2数码管数值加1,按下S3数码管数值减1
  3. 且长按数字会累加或累减
  4. 与软件延时方式去做数码管动态扫描的区别:
  5. 软件延时扫描,当按下按键时数码管只会显示1位数
  6. 中断方式扫描,当按下按键时不影响数码管应显示的位数
  7. */
  8. #include <reg52.h>


  9. #define uchar unsigned char
  10. #define uint  unsigned int


  11. sbit we = P2^7;        //位定义数码管位选锁存器接口
  12. sbit du = P2^6;         //位定义数码管位选锁存器接口
  13. sbit key_s2 = P3^0;//S2按键位定义
  14. sbit key_s3 = P3^1;//S3按键位定义


  15. uchar i;//数码管显示位选变量
  16. uchar num[] = {0, 0, 0, 0}; //百十个位,总数暂存数组
  17. //数码管0~9段选表
  18. uchar code leddata[]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
  19. //数码管1~3位选表
  20. uchar code DPY[]={0xfe, 0xfd, 0xfb};


  21. //毫秒级延时函数
  22. void delay(uint z)
  23. {
  24.         uint x,y;
  25.         for(x = z; x > 0; x--)
  26.                 for(y = 114; y > 0 ; y--);
  27. }
  28. //中断服务特殊功能寄存器配置
  29. void init()
  30. {
  31.         
  32.         TMOD = 0x01;  //定时器16为计数工作模式
  33.         TH0 =0xED;
  34.         TL0 =0xFF; //5ms
  35.         ET0 = 1; //开定时器0中断
  36.         TR0 = 1;//启动定时器0
  37.         EA = 1;        //开总中断
  38. }


  39. void main()
  40. {
  41.         init();//初始化定时器0
  42.         while(1)
  43.         {
  44.                 if(key_s2 == 0)//判断S2是否按键
  45.                 {
  46.                         delay(5);//软件延时
  47.                         if(key_s2 == 0)
  48.                         {
  49.                                 if(num[3] == 999)num[3]=0;//当等于255时不再加1
  50.                                 delay(300);//软件延时
  51.                                 num[3]++; //加1
  52.                         }
  53.                 //        while(!key_s2);        //松手检测
  54.                 }
  55.                 if(key_s3 == 0)//判断S3是否按键
  56.                 {
  57.                         delay(5);//软件延时
  58.                         if(key_s3 == 0)
  59.                         {
  60.                                 if(num[3] != 0)        //当等于0时,不再减1
  61.                      delay(300);//软件延时
  62.                                 num[3]--; //减1
  63.                         }
  64.                         //while(!key_s3);        //松手检测
  65.                 }
  66.         }
  67. }


  68. //定时器0中断服务程序  做数码管动态扫描,不用软件延时
  69. void timer0() interrupt 1
  70. {
  71.         TH0 =0xED;
  72.         TL0 =0xFF; //5ms  模式1非自动重装需要手动重装


  73.          if(i < 3)
  74.         {
  75.                 num[0] = num[3] / 100; //计算百位
  76.                 num[1] = num[3] % 100 / 10;        //计算十位
  77.                 num[2] = num[3] % 10;//计算个位
  78.                 P0 = 0xff; //清除断码
  79.                 we = 1;//打开位选
  80.                 P0 = DPY[ i];                we = 0;        //关闭位选                        P0 = 0xff; //清除断码                du = 1;        //打开段选                P0 = leddata[num[ i]];                du = 0;        //关闭段选                i++;//显示下一位        }        else        {                i = 0;        }

  81. }
复制代码







欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1