找回密码
 立即注册

QQ登录

只需一步,快速开始

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

在用单片机外部中断控制数码管增减时按键按下数码管会闪烁,各位大佬为什么?

[复制链接]
跳转到指定楼层
楼主
ID:973385 发表于 2021-10-19 17:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include <STC89C5xRC.H>
  2. void Delay20us()        //@11.0592MHz
  3. {
  4.     unsigned char i;
  5.     i = 52;
  6.     while (--i);
  7. }

  8. void Delay10ms()        //@11.0592MHz
  9. {
  10.     unsigned char i, j;
  11.     i = 108;
  12.     j = 145;
  13.     do
  14.     {
  15.         while (--j);
  16.     } while (--i);
  17. }

  18. int i, k=1, t, j, sum;

  19. const unsigned char seg_code[] = {    0x3F,/*0*/ 0x06,/*1*/ 0x5B,/*2*/ 0x4F,/*3*/ 0x66,/*4*/ 0x6D,/*5*/ 0x7D,/*6*/ 0x07,/*7*/    0x7F,/*8*/ 0x6F,/*9*/};

  20. void main(){
  21. IT0 = 1;
  22. EX0 = 1;
  23. IT1 = 1;
  24. EX1 = 1;
  25. EA = 1;
  26. while(1){
  27. j=sum;
  28. for(k=1;j>=10;k++){
  29. j/=10;
  30. }
  31. t=sum;
  32. for(i = 0;i < k;i++){
  33.         P2 = i<<2;
  34.         P0 = seg_code[t%10];
  35.         Delay20us();
  36.         P0 = 0x00;
  37.         t/=10;
  38.         }
  39.     }
  40. }

  41. void int0() interrupt 0{
  42. Delay10ms();
  43. if(P32 == 0){
  44. sum++;
  45. if(sum>9999)sum=0;
  46.     }
  47. }

  48. void int1() interrupt 2{
  49. Delay10ms();
  50. if(P33 == 0){
  51. sum--;
  52. if(sum<0)sum=9999;
  53.     }
  54. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:313048 发表于 2021-10-19 18:02 | 只看该作者
中断里面不应该放置 while,它会将main函数中的while打断,导致你的扫描中断
回复

使用道具 举报

板凳
ID:466505 发表于 2021-10-19 18:02 | 只看该作者
按键后延时导致的吧
回复

使用道具 举报

地板
ID:130230 发表于 2021-10-19 18:02 | 只看该作者
外部中断里面不要放延时函数,程序响应外部中断的过程中无法刷新数码管。如果非得用延时,可以把数码管刷新放定时器中断里面,然后把定时器中断的优先级调高。
回复

使用道具 举报

5#
ID:57657 发表于 2021-10-19 20:58 | 只看该作者
无论是什么程序,至少开启一个定时器中断
按键消抖、流水灯、数码管动态扫描、延时任意毫秒什么的, 全部交给定时器中断去处理。

软件延时少用或不用
回复

使用道具 举报

6#
ID:973385 发表于 2021-10-19 21:59 | 只看该作者
谢谢各位,不过我还没学定时器,不过我改了一下,这样也能比较好的解决,等我学到了应该就可以看懂吧
void int0() interrupt 0{
if(P32 == 0)
Delay5ms();
if(P32 == 0){
sum++;
if(sum>9999)sum=0;
        }
}

void int1() interrupt 2{
if(P33 == 0)
Delay5ms();
if(P33 == 0){
sum--;
if(sum<0)sum=9999;
        }
}
回复

使用道具 举报

7#
ID:161164 发表于 2021-10-20 11:09 | 只看该作者
只是按键增减显示数值
没必要用中断吧?
只不过是显示代码写的不好
长期占用系统资源
才不得不用中断来补救吧

推荐这种按键扫描代码:
  1. void key_Proc()
  2. {
  3.         static unsigned char Delay_XD=0;
  4.         if(P32 == 0 || P33 == 0)
  5.         {
  6.                 if(Delay_XD<0xFF)Delay_XD++;
  7.                 if(Delay_XD==250)//按反应减少
  8.                 {
  9.                         if(P32 == 0)
  10.                         {
  11.                                 sum++;
  12.                                 if(sum>9999)sum=0;
  13.                         }
  14.                         if(P33 == 0)
  15.                         {
  16.                                 sum--;
  17.                                 if(sum<0)sum=9999;
  18.                         }
  19.                 }
  20.         }
  21.         else
  22.         {
  23.                 Delay_XD = 0;
  24.         }
  25. }
复制代码

关掉中断,把key_Proc();放到for(k=1;j>=10;k++){}里
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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