找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求助:数码管消影问题

[复制链接]
跳转到指定楼层
楼主
ID:1059305 发表于 2023-1-6 10:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
目的:通过按下按键作为外部的中断输入信号,通过数码管显示中断次数。
问题:目前在PROTEUS仿真上能正常实现功能,但在实物上出现类似不能消影的问题,当按下按键后,数码管全亮(会一直显示8888),计数功能也出现问题,按下按键后数码管4位同时改变(在显示8888时,可以勉强观察到数字有在变化)。


  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4.        
  5. //P0为SA-SH      P1为C0-C3

  6. sbit K1=P3^2;
  7. uchar  dis_code[11]={0xc0,0xf9,0xa4,0xb0,        // 0, 1, 2, 3
  8.                                                     0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};                // 4, 5, 6, 7, 8, 9, off
  9. uchar  buf[4];
  10. uint cnt=0;
  11.                                                                
  12. void delay(uchar ms)
  13. {
  14.         while(ms--)
  15.                 ;
  16. }


  17. void initial()
  18. {
  19.         IT0=1;
  20.         EX0=1;
  21.         EA=1;
  22. }



  23. int main()
  24. {
  25.         initial();
  26.         P0=0xff;
  27.         P1=0;
  28.         buf[0]=dis_code[0];
  29.         buf[1]=dis_code[0];
  30.         buf[2]=dis_code[0];
  31.         buf[3]=dis_code[0];
  32.        
  33.         while(1)
  34.         {
  35.                 P0=buf[3];//显示千位
  36.                 P1=0x01;
  37.                 delay(5);
  38.                 P0=0xff;
  39.                
  40.                 P0=buf[2];//显示百位
  41.                 P1=0x02;
  42.                 delay(5);
  43.                 P0=0xff;
  44.                
  45.                 P0=buf[1];//显示十位
  46.                 P1=0x04;
  47.                 delay(5);
  48.                 P0=0xff;
  49.                
  50.                 P0=buf[0];//显示个位
  51.                 P1=0x08;
  52.                 delay(5);
  53.                 P0=0xff;
  54.                
  55.         }
  56.        
  57. }

  58. void init0() interrupt 0

  59. {
  60.         EX0=0;
  61. if(K1==0)
  62. {
  63.                 cnt++;
  64.                 if(cnt>9999)
  65.                 {
  66.                         cnt=0;
  67.                 }
  68.         }
  69.        
  70.         buf[3]=dis_code[cnt/1000];  //千位
  71.         buf[2]=dis_code[cnt%1000/100];//百位
  72.         buf[1]=dis_code[cnt%100/10];//十位
  73.         buf[0]=dis_code[cnt%10];//个位
  74.         EX0=1;
  75.        
  76. }
复制代码



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

使用道具 举报

沙发
ID:680980 发表于 2023-1-6 16:00 | 只看该作者
加入P0消隐试试
if(k1==0)
{
P0=0XFF;
}
回复

使用道具 举报

板凳
ID:213173 发表于 2023-1-6 16:37 | 只看该作者
用外部中断读取按键信号,消抖是个问题。仿真按键不会抖动,如果用简单的延时消抖方法会导致动态数码管显示停顿。实际电路会因为按键抖动,cnt会加不确定的值。给你程序修改了,你试试。
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int      
  4. //P0为SA-SH      P1为C0-C3
  5. sbit K1=P3^2;
  6. uchar  dis_code[11]={0xc0,0xf9,0xa4,0xb0, // 0, 1, 2, 3
  7. 0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};     // 4, 5, 6, 7, 8, 9, off

  8. uchar  buf[4];
  9. uint cnt=0;
  10.                                                                
  11. void delay(uint ms)
  12. {
  13.          while(ms--);               
  14. }
  15. void initial()
  16. {
  17.         IT0 = 1;
  18.         EX0 = 1;
  19.         EA = 1;
  20. }
  21. void main()
  22. {
  23.         uchar i;
  24.         initial();      
  25.         while(1)
  26.         {
  27.                 buf[0]=dis_code[cnt/1000%10];  //千位
  28.                 buf[1]=dis_code[cnt/100%10];//百位
  29.                 buf[2]=dis_code[cnt/10%10];//十位
  30.                 buf[3]=dis_code[cnt%10];//个位
  31.                 P1&=0xf0;
  32.                 P0=buf[i];
  33.                 P1|=0x01<<i;
  34.                 if(++i>3)
  35.                         i=0;
  36.                 delay(100);
  37.         }
  38. }

  39. void init0() interrupt 0
  40. {
  41.         cnt++;
  42.         if(cnt>9999)
  43.         {
  44.                 cnt=0;
  45.         }
  46. }
复制代码



回复

使用道具 举报

地板
ID:1059305 发表于 2023-1-6 17:06 | 只看该作者
景生2020 发表于 2023-1-6 16:00
加入P0消隐试试
if(k1==0)
{

还是不行,我想应该不是消影的问题,如果是消影的问题的话,当我触发中断时数码管的千百十应该是不变的,只有个位的会出现问题,但现在当我触发中断时,数码管的千百十个位都出现同样的数字(数码管还是显示8888)只能勉强通过亮暗观察到数码管的数字发生变化。
回复

使用道具 举报

5#
ID:142045 发表于 2023-1-6 19:31 | 只看该作者
数码管动态显示有闪烁主要是由于延时时间选择不当造成的 主要检查延时方面的语句
回复

使用道具 举报

6#
ID:1060541 发表于 2023-1-6 21:22 | 只看该作者
每次显示完后,加个1us延迟试试呢
回复

使用道具 举报

7#
ID:624769 发表于 2023-1-6 22:17 来自手机 | 只看该作者
你消了个寂寞,把所有的p0=0xff,都改成p1=0x00才是消影。
回复

使用道具 举报

8#
ID:1059305 发表于 2023-1-9 09:42 | 只看该作者
wulin 发表于 2023-1-6 16:37
用外部中断读取按键信号,消抖是个问题。仿真按键不会抖动,如果用简单的延时消抖方法会导致动态数码管显示 ...

十分感谢,代码成功运行,目前还在学习消化中
回复

使用道具 举报

9#
ID:1059305 发表于 2023-1-9 09:48 | 只看该作者
上善-若水 发表于 2023-1-6 19:31
数码管动态显示有闪烁主要是由于延时时间选择不当造成的 主要检查延时方面的语句

嗯嗯,但我现在试了之前的代码发现又可以了,导致现在验证不了
回复

使用道具 举报

10#
ID:1059305 发表于 2023-1-9 09:48 | 只看该作者
huazhaojiu 发表于 2023-1-6 21:22
每次显示完后,加个1us延迟试试呢

嗯嗯,但我现在试了之前的代码发现又可以了,导致现在验证不了
回复

使用道具 举报

11#
ID:1059305 发表于 2023-1-9 09:52 | 只看该作者
188610329 发表于 2023-1-6 22:17
你消了个寂寞,把所有的p0=0xff,都改成p1=0x00才是消影。

我选用的是共阳极数码管,P0是段选   所以我觉得P0=0xff  是消影没错
回复

使用道具 举报

12#
ID:384109 发表于 2023-1-9 11:18 | 只看该作者
缺电路图,所以不好说,数码管的显示最好放在定时器中断里
回复

使用道具 举报

13#
ID:161164 发表于 2023-1-9 11:40 | 只看该作者
LLL2022 发表于 2023-1-9 09:52
我选用的是共阳极数码管,P0是段选   所以我觉得P0=0xff  是消影没错

P0=0xff 是可以消影,没错
但代码次序错了
你现在是
段选消影->段选显示->位选改变

正确次序应该是
段选消影->位选改变->段选显示
回复

使用道具 举报

14#
ID:1059305 发表于 2023-1-9 14:06 | 只看该作者
人中狼 发表于 2023-1-9 11:18
缺电路图,所以不好说,数码管的显示最好放在定时器中断里

嗯嗯,我之后会去尝试的
回复

使用道具 举报

15#
ID:1059305 发表于 2023-1-9 14:08 | 只看该作者
lkc8210 发表于 2023-1-9 11:40
P0=0xff 是可以消影,没错
但代码次序错了
你现在是

嗯嗯,谢谢,我发现我改不改次序最终效果都可以实现,因此我还是有点懵,但我之后会注意次序这方面的问题。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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