找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

请问为什么我这个仿真图的数码管改了还是无论按哪个按键,都只显示初始值呢

查看数: 610 | 评论数: 11 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2025-5-18 22:21

正文摘要:

请问为什么我这个仿真图的数码管改了还是无论按哪个按键,都只显示初始值呢

回复

ID:1150590 发表于 2025-5-23 21:52

我也试过这种连法,但是还是显示没变化,所以请问是我的代码的问题吗
ID:1133081 发表于 2025-5-20 10:04


  1. #include <reg51.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char

  4. uchar code table[]={//0~FLP
  5.                 0xc0,0xf9,0xa4,0xb0,
  6.                 0x99,0x92,0x82,0xf8,
  7.                 0x80,0x90,0x88,0x83,
  8.                 0xc6,0xa1,0x86,0x8e,0xc7,0x8c};

  9. void Delay_ms(uint t)
  10. {
  11.         uint i,j;
  12.         for(i=t;i>0;i--)
  13.                 for(j=120;j>0;j--);
  14. }

  15. uchar keyscan()                                        //按键扫描程序
  16. {
  17.         static uint count=0;
  18.         static bit sign=0;
  19.         uchar KeyValue=0;
  20.         P3=0xf0;                                        //赋值P3 1111 0000
  21.         if(P3!=0xf0)                                //检测有按键按下
  22.         {
  23.                 if(++count>10 && !sign)//消抖计数10,判断按键自锁
  24.                 {                       
  25.                         sign=1;                        //按键自锁标志置1
  26.                         switch(P3)
  27.                         {
  28.                                 case(0Xe0):KeyValue=0;break;
  29.                                 case(0Xd0):KeyValue=1;break;
  30.                                 case(0Xb0):KeyValue=2;break;
  31.                                 case(0X70):KeyValue=3;break;
  32.                         }
  33.                         P3=0x0f;                        //赋值P3 0000 1111
  34.                         switch(P3)
  35.                         {
  36.                                 case(0X0e):KeyValue=KeyValue+1;break;
  37.                                 case(0X0d):KeyValue=KeyValue+5;break;
  38.                                 case(0X0b):KeyValue=KeyValue+9;break;
  39.                                 case(0X07):KeyValue=KeyValue+13;break;
  40.                         }
  41.                         return KeyValue;
  42.                 }
  43.         }
  44.         else                                                //键抬起
  45.         {
  46.                 sign=0;                                //按键自锁标志清0
  47.                 count=0;                                //消抖计数清0
  48.                 return 0;
  49.         }
  50. }

  51. void display(uchar i)                                        //数码管显示程序
  52. {
  53.         static uchar a=0,t=0;
  54.         if(i>0)a=i;
  55.         P0=0xff;                                //消隐
  56.         P2&=0xf0;                        //位清0
  57.         P2|=0x01<<t;                //赋位码
  58.         switch(t)                        //赋段码
  59.         {
  60.                 case 0:P0=table[16];break;//L
  61.                 case 1:P0=table[a/10];break;
  62.                 case 2:P0=table[a%10];break;
  63.                 case 3:P0=table[17];break;//P
  64.         }
  65.         t=++t%4;//循环计数
  66. }

  67. void main()                                                //主函数
  68. {
  69.         while(1)
  70.         {
  71.                 display(keyscan());//数码管显示键值1~16
  72.                 Delay_ms(1);       //控制循环周期约1ms
  73.         }
  74. }
复制代码




ID:1151026 发表于 2025-5-20 00:28
加一个上拉电阻试试看
ID:1150590 发表于 2025-5-19 21:07
刘伟无敌厉害 发表于 2025-5-19 13:19
仿真要加上拉电阻,使用LCD1602的时候也会这样

我RP1接的那个不是上拉电阻吗
ID:1150590 发表于 2025-5-19 21:04
会飞的鱼KKK 发表于 2025-5-19 10:36
KEYSCAN按键扫描程序的KEY_port需要根据按键状态更新,没有看见更新的程序

我好像也试过加了状态更新的代码,但是也是一样的效果
ID:1150590 发表于 2025-5-19 21:03
tyrl800 发表于 2025-5-19 14:04
因为释放键后都返回255

返回其他值得时候也是这样的
ID:275826 发表于 2025-5-19 14:04
因为释放键后都返回255
ID:1150930 发表于 2025-5-19 13:19
仿真要加上拉电阻,使用LCD1602的时候也会这样
ID:844772 发表于 2025-5-19 11:32
不变化只能是键盘程序问题,而这就是个反转法的矩阵键盘,在proteus上用也没啥问题,实际用18行后要延时,而且你延时程序不对,不过这些问题都跟模拟无关啊,楼主搞明白也发个信呗。
ID:1091344 发表于 2025-5-19 10:36
KEYSCAN按键扫描程序的KEY_port需要根据按键状态更新,没有看见更新的程序
ID:1003945 发表于 2025-5-19 10:25
8051的P0口是开漏输出,必须外接上拉电阻(排阻RP1)才能驱动数码管。请确认排阻RESPACK-8的阻值(推荐1KΩ-10KΩ)且接线正确,排阻公共端接VCC,另一端接P0口。

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

Powered by 单片机教程网

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