找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6036|回复: 0
打印 上一主题 下一主题
收起左侧

单片机中断扫描数码管显示程序

[复制链接]
跳转到指定楼层
楼主
ID:224465 发表于 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. }
复制代码


评分

参与人数 1黑币 +1 收起 理由
心中 + 1 赞一个!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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