找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
请问为什么我这个仿真图的数码管改了还是无论按哪个按键,都只显示初始值呢

屏幕截图 2025-05-18 214314.png (89.76 KB, 下载次数: 0)

仿真图

仿真图

屏幕截图 2025-05-18 221038.png (71.92 KB, 下载次数: 0)

屏幕截图 2025-05-18 221038.png

屏幕截图 2025-05-18 221027.png (75.59 KB, 下载次数: 0)

屏幕截图 2025-05-18 221027.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1003945 发表于 2025-5-19 10:25 | 只看该作者
8051的P0口是开漏输出,必须外接上拉电阻(排阻RP1)才能驱动数码管。请确认排阻RESPACK-8的阻值(推荐1KΩ-10KΩ)且接线正确,排阻公共端接VCC,另一端接P0口。
回复

使用道具 举报

板凳
ID:1091344 发表于 2025-5-19 10:36 | 只看该作者
KEYSCAN按键扫描程序的KEY_port需要根据按键状态更新,没有看见更新的程序
回复

使用道具 举报

地板
ID:844772 发表于 2025-5-19 11:32 | 只看该作者
不变化只能是键盘程序问题,而这就是个反转法的矩阵键盘,在proteus上用也没啥问题,实际用18行后要延时,而且你延时程序不对,不过这些问题都跟模拟无关啊,楼主搞明白也发个信呗。
回复

使用道具 举报

5#
ID:1150930 发表于 2025-5-19 13:19 | 只看该作者
仿真要加上拉电阻,使用LCD1602的时候也会这样
回复

使用道具 举报

6#
ID:275826 发表于 2025-5-19 14:04 | 只看该作者
因为释放键后都返回255
回复

使用道具 举报

7#
ID:1150590 发表于 2025-5-19 21:03 | 只看该作者
tyrl800 发表于 2025-5-19 14:04
因为释放键后都返回255

返回其他值得时候也是这样的
回复

使用道具 举报

8#
ID:1150590 发表于 2025-5-19 21:04 | 只看该作者
会飞的鱼KKK 发表于 2025-5-19 10:36
KEYSCAN按键扫描程序的KEY_port需要根据按键状态更新,没有看见更新的程序

我好像也试过加了状态更新的代码,但是也是一样的效果
回复

使用道具 举报

9#
ID:1150590 发表于 2025-5-19 21:07 | 只看该作者
刘伟无敌厉害 发表于 2025-5-19 13:19
仿真要加上拉电阻,使用LCD1602的时候也会这样

我RP1接的那个不是上拉电阻吗
回复

使用道具 举报

10#
ID:1151026 发表于 2025-5-20 00:28 | 只看该作者
加一个上拉电阻试试看
回复

使用道具 举报

11#
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. }
复制代码




回复

使用道具 举报

12#
ID:1150590 发表于 2025-5-23 21:52 | 只看该作者

我也试过这种连法,但是还是显示没变化,所以请问是我的代码的问题吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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