清翔电子开源社区

 找回密码
 立即注册

微信扫码 , 快速开始

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 889|回复: 1

问数码管为什么有弱光

[复制链接]

1

主题

1

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2022-10-15 17:49:11 | 显示全部楼层 |阅读模式
我写的是按相应按键亮加相应的数字,但是个位显示好好的,一到了十位开始就显示不清楚,别的数码管也会微弱地亮起来

第一张图是8;
第二张图是8+9即17;

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

3

主题

14

帖子

592

积分

超级版主

Rank: 8Rank: 8

积分
592
发表于 2022-10-16 11:48:17 | 显示全部楼层
本帖最后由 Anywaydebug 于 2022-10-16 12:00 编辑

很可能是因为你数码管动态扫描用的delay这种占用延时,按键检测去抖动和松手也使用了delay这种占用延时,当执行按键检测程序的时候数码管就无法得到动态扫描,才导致这样的显示效果。
给你提供一种解决方法:数码管的动态扫描放在定时器中断里面去执行

下面这个简单的代码,测试数码管动态显示独立键盘的值
  1. #include <reg52.h>
  2. #define CFG_SYSFEQ 11059200
  3. sbit DIGIT = P2^6;//数码管段选
  4. sbit SEG = P2^7;//数码管位选
  5. sbit KEY_S2 = P3^0;
  6. sbit KEY_S3 = P3^1;
  7. sbit KEY_S4 = P3^2;
  8. sbit KEY_S5 = P3^3;
  9. static volatile unsigned int idata KEY_CODE;
  10. /*System ticks*/
  11. static unsigned int code g_timer0_init_val = 65536 - (CFG_SYSFEQ/12/1000);
  12. void time_Initialization(void)
  13. {
  14.         /*Time0 at 16-bit timer mode.*/
  15.         TMOD =(TMOD & 0xf0u) | 0x01u;
  16.         TL0 = g_timer0_init_val & 0xff;
  17.         TH0 = g_timer0_init_val >> 8;
  18.         ET0 = 1; //Enable timer0 interrupt
  19.         TR0 = 1; //Start running
  20. }
  21. //毫秒级延时函数定义
  22. void delay(unsigned int z)
  23. {
  24.         unsigned int x,y;
  25.         for(x = z; x > 0; x--)
  26.                 for(y = 114; y > 0 ; y--);                 
  27. }
  28. #define SEG7_DIGIT_NUM        4
  29. void display(unsigned int val)
  30. {        
  31.         const char code digitMaps[]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
  32.         const unsigned char code segMaps[] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef};
  33.         unsigned char q, b, s, g;
  34.         static unsigned char segment;
  35.         q = val / 1000;
  36.         b = val % 1000 / 100;
  37.         s = val % 100 / 10;
  38.         g = val % 10;               
  39.         P0 = 0x00;//清除断码
  40.         switch(segment)
  41.         {
  42.                 case 0: DIGIT = 1; P0 = digitMaps[q];                DIGIT = 0; break;
  43.                 case 1: DIGIT = 1; P0 = digitMaps[b];         DIGIT = 0; break;        
  44.                 case 2: DIGIT = 1; P0 = digitMaps[s];         DIGIT = 0; break;
  45.                 case 3: DIGIT = 1; P0 = digitMaps[g];         DIGIT = 0; break;               
  46.         }
  47.         P0 = 0xff;//清除位码
  48.         SEG = 1;//打开位选锁存器
  49.         P0 = segMaps[segment];
  50.         SEG = 0;//锁存位选数据
  51.         segment++;
  52.         if(segment == SEG7_DIGIT_NUM)
  53.                 segment = 0;
  54. }
  55. #define KEYPORT P3
  56. void scanKeyCode(void)
  57. {
  58.         /*stand-alone keys*/
  59.         KEYPORT = 0xffu;
  60.         if(KEY_S2 == 0)//判断S2是否被按下
  61.                 {
  62.                         delay(20);//按键消抖
  63.                         if(KEY_S2 == 0)
  64.                         {
  65.                                 while(!KEY_S2);//松手检测
  66.                                 KEY_CODE = 1;
  67.                         }        
  68.                 }
  69.         else if(KEY_S3 == 0)//判断S3是否被按下
  70.         {
  71.                 delay(20);//按键消抖
  72.                 if(KEY_S3 == 0)
  73.                 {
  74.                         while(!KEY_S3);//松手检测
  75.                         KEY_CODE = 10;
  76.                 }        
  77.         }
  78.         else if(KEY_S4 == 0)//判断S4是否被按下
  79.         {
  80.                 delay(20);//按键消抖
  81.                 if(KEY_S4 == 0)
  82.                 {
  83.                         while(!KEY_S4);//松手检测
  84.                         KEY_CODE = 100;
  85.                 }        
  86.         }
  87.         else if(KEY_S5 == 0)//判断S5是否被按下
  88.         {
  89.                 delay(20);//按键消抖
  90.                 if(KEY_S5 == 0)
  91.                 {
  92.                         while(!KEY_S5);//松手检测
  93.                         KEY_CODE = 1000;
  94.                 }        
  95.         }
  96.         
  97. }
  98. void main(void)
  99. {
  100.         time_Initialization();
  101.         EA = 1;
  102.         while(1)
  103.         {
  104.                 scanKeyCode();
  105.         }
  106. }
  107. /*Timer0 as system tick timer. 1KHZ*/
  108. void timer0_ISR(void) interrupt 1
  109. {
  110.         TL0 = g_timer0_init_val & 0xff;
  111.         TH0 = g_timer0_init_val >> 8;
  112.         display(KEY_CODE);
  113. }
复制代码

回复

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|小黑屋|清翔电子开源社区 ( 蜀ICP备20007201号-3 )

GMT+8, 2024-9-20 07:18 , Processed in 0.094029 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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