找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机数码管外部中断动态扫描程序,亮度不一,按键也又有时灵有时不灵

[复制链接]
跳转到指定楼层
楼主
ID:1001733 发表于 2022-4-22 10:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
数码管动态扫描,仿真上可以运行,实物上就亮度不一,按键也又有时灵有时不灵
51单片机,型号是89C52,感谢大家,查了好多资料也看不明白,可能跟本人智商有关嘿嘿
可能消隐没消好,我也搞不明白

单片机源程序如下:
#include <REGX52.H>//头文件
#include "Delay.h"
int duan[]={
                0xC0,  //"0"
                0xF9,  //"1"
                0xA4,  //"2"
                0xB0,  //"3"
                0x99,  //"4"
                0x92,  //"5"
                0x82,  //"6"
                0xF8,  //"7"
                0x80,  //"8"
                0x90,  };  //段选
int wei[]={0x08,0x04,0x02,0x01};
int number=1000;//初始值
char qian,bai,shi,ge;

void INT0_inti()//外部中断初始化
{
    EA=1;
    IT0=1;
    EX0=1;
}
void INT2_inti()//外部中断初始化
{
    EA=1;
    IT1=1;
    EX1=1;
}
void jisuan()//计算子程序
{
    qian=number/1000;
    bai=number%1000/100;
    shi=number%1000%100/10;
    ge=number%1000%100%10;

    P2=0x01;
    P0=duan[qian];
    Delay(5);
  P2=0x00;

    P2=0x02;
    P0=duan[bai];
    Delay(5);
    P2=0x00;

    P2=0x04;
    P0=duan[shi];
    Delay(5);
    P2=0x00;

    P2=0x08;
    P0=duan[ge];
    Delay(5);
    P2=0x00;
}

void main()
{
      INT0_inti();//中断初始化
      INT2_inti();//中断初始化

      P3_4=0;//键盘是矩阵的,所以给了3-4低电位,用的是P3-2,P3-3
        while(1)
        {

                jisuan();//数码管
        }                    



}
void IWT0_ISR() interrupt 0//进入中断
{
    number=number+1;
    if(number==10000)
        number=0;
    if(number==-1)
        number=9999;
}
void IWT2_ISR() interrupt 2//进入中断
{
    number=number-1;
    if(number==10000)
        number=0;
    if(number==-1)
        number=9999;
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:301191 发表于 2022-4-22 19:55 | 只看该作者
顶一下
回复

使用道具 举报

板凳
ID:213173 发表于 2022-4-22 21:56 | 只看该作者
不要轻易使用外部中断做按键输入这种简单任务,既不易消抖,也占用有限资源。数码管亮度不一排除硬件因素后多为消隐不良和动态扫描周期不均衡。给你改了,你试试。
  1. #include <REGX52.H>//头文件
  2. //#include "Delay.h"

  3. //unsigned char sec_s=0,min_s=0;//秒、分设置变量
  4. //void Cnt10ms=0;       //中断计时变量
  5. unsigned char code duan[]={
  6.                 0xC0,  //"0"
  7.                 0xF9,  //"1"
  8.                 0xA4,  //"2"
  9.                 0xB0,  //"3"
  10.                 0x99,  //"4"
  11.                 0x92,  //"5"
  12.                 0x82,  //"6"
  13.                 0xF8,  //"7"
  14.                 0x80,  //"8"
  15.                 0x90,  };  //段选
  16. unsigned char code wei[]={0x01,0x02,0x04,0x08};
  17. unsigned char cache[4];
  18. unsigned int number=1000;//初始值
  19. //unsigned char qian,bai,shi,ge;
  20. unsigned char count=0;
  21. bit sign=0;
  22. unsigned char num=0;

  23. void Delay(unsigned int t)
  24. {
  25.         unsigned int i,j;
  26.         for(i=t;i>0;i--)
  27.                 for(j=120;j>0;j--);
  28. }
  29. /*
  30. void INT0_inti()//外部中断初始化
  31. {
  32.         EA=1;
  33.         IT0=1;
  34.         EX0=1;
  35. }
  36. void INT2_inti()//外部中断初始化
  37. {
  38.     EA=1;
  39.     IT1=1;
  40.     EX1=1;
  41. }*/
  42. void jisuan()//计算子程序
  43. {//分解数据,保存入缓存
  44.         cache[0]=duan[number/1000%10];
  45.         cache[1]=duan[number/100%10];
  46.         cache[2]=duan[number/10%10];
  47.         cache[3]=duan[number%10];
  48.        
  49.         P2=0x00;//消隐
  50.         P0=cache[num];//送段码
  51.         P2=wei[num];//送位码
  52.         Delay(1);//延时
  53.         num=++num%4;//循环计数
  54. }

  55. void main()
  56. {

  57. //        INT0_inti();//中断初始化
  58. //        INT2_inti();//中断初始化       
  59.         P3_4=0;//键盘是矩阵的,所以给了3-4低电位,用的是P3-2,P3-3
  60.         while(1)
  61.         {
  62.                 if(!P3_2||!P3_3)
  63.                 {
  64.                         if(++count>=10 && sign==0)//消抖
  65.                         {
  66.                                 sign=1;
  67.                                 if(!P3_2)
  68.                                 {
  69.                                         if(number<9999)number++;
  70.                                 }
  71.                                 if(!P3_3)
  72.                                 {
  73.                                         if(number>0)number--;
  74.                                 }
  75.                         }
  76.                 }
  77.                 else
  78.                 {
  79.                         count=0;
  80.                         sign=0;
  81.                 }

  82.                 jisuan();//数码管
  83.         }                    
  84. }
  85. /*
  86. void IWT0_ISR() interrupt 0//进入中断
  87. {
  88.     number=number+1;
  89.     if(number==10000)
  90.         number=0;
  91.     if(number==-1)
  92.         number=9999;
  93. }
  94. void IWT2_ISR() interrupt 2//进入中断
  95. {
  96.     number=number-1;
  97.     if(number==10000)
  98.         number=0;
  99.     if(number==-1)
  100.         number=9999;
  101. }*/
复制代码
回复

使用道具 举报

地板
ID:1001733 发表于 2022-4-23 16:33 | 只看该作者
wulin 发表于 2022-4-22 21:56
不要轻易使用外部中断做按键输入这种简单任务,既不易消抖,也占用有限资源。数码管亮度不一排除硬件因素后 ...

真的牛
回复

使用道具 举报

5#
ID:1040201 发表于 2022-8-17 10:42 | 只看该作者
一个完整的代码,是不是要有主循环函数?根据标志位在主循环里面处理,我之 前自己做了个小车,红外遥控也是反应迟钝,时灵时不灵,一直有这个困惑。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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