森狼藤野 2024-08-13 18:08 采纳率: 66.7%
浏览 18
已结题

51单片机数码管显示有问题

51单片机数码管显示有问题
#include <REGX52.H>
#include  "LCD1602.h"
#include  "key.h"
#include  "Delay.h"
 unsigned char K,n;
 unsigned char chr[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
 void test(unsigned char location,unsigned char number)
 {
     
     switch(location)  //位选
     {
         case 0: P2_4=1;P2_3=1;P2_2=1;break; //7
         case 1: P2_4=1;P2_3=1;P2_2=0;break;  //6
         case 2: P2_4=1;P2_3=0;P2_2=1;break;//5
         case 3: P2_4=1;P2_3=0;P2_2=0;break;  //4
         case 4: P2_4=0;P2_3=1;P2_2=1;break;//3
         case 5: P2_4=0;P2_3=1;P2_2=0;break;//2
         case 6: P2_4=0;P2_3=0;P2_2=1;break;//1
         case 7: P2_4=0;P2_3=0;P2_2=0;break;//0
     }
     P0=chr[number]; //段选
 }
 
  
void main()
{
     
    test(0,0);
    while(1)
    {
        K=key(); //返回按键
        if(K)
        {
            
            test(1,K);  //数码管显示数字     如果是(0,K),第一个数码管会随按键变化而变化,换成其他数码管则不能正常显示,比如(1,K)
       
        }
    }    
    
}

如果位选为0,第一个数码管随段选的变化而变化,但是当位选为1到7时,段选变化,数码管抽风
实在不知道怎么解决,不知道是硬件的问题,还是代码的问题
我想要的结果和为什么
test (x,K), x可以为0到7.是静态扫描,数码管上数随K的变化而变化。每次位选都是固定的,段选在变化
##

unsigned char key()
{
.if(.........){return 1;};//按下键1
if(.........){return 2;};//按下键2
if(.........){return 3;};//按下键3
if(.........){return 4;};//按下键4
}


  • 写回答

22条回答 默认 最新

  • 阿里嘎多学长 2024-08-13 19:05
    关注
    获得0.45元问题酬金

    以下内容由AIGC及阿里嘎多学长共同生成、有用望采纳:


    您好!根据您提供的代码和描述,我注意到几个可能的问题点,以及相应的解决方案。

    问题分析

    1. 位选逻辑:在您的代码中,位选逻辑使用了三个引脚P2_4P2_3P2_2来控制数码管的显示位置。但是,您在设置位选状态时,使用了=1=0,这可能不是正确的操作。通常,我们需要将这些引脚设置为低电平来选中对应的数码管。

    2. 段选逻辑:您使用了chr数组来存储数码管的段选码,这是正确的。但是,您需要确保P0端口的输出与数码管的连接方式相匹配。

    3. 按键响应:您的代码中使用了key()函数来获取按键值,但没有提供这个函数的实现。如果按键值获取不正确,将影响数码管的显示。

    4. 循环显示逻辑:您的代码目前只更新了第二个数码管的显示。如果您希望所有数码管都能显示按键值,需要修改循环逻辑。

    解决方案

    1. 修正位选逻辑:将位选逻辑中的=1=0改为对应的位操作,确保只有选中的数码管被激活。

    2. 检查key()函数:确保key()函数能够正确读取按键状态,并返回相应的按键值。

    3. 修改循环逻辑:添加一个循环变量来控制数码管的显示位置,并在按键响应时更新这个变量。

    修改后的代码示例

    以下是根据您的需求修改后的代码示例,实现了按键按下时依次在所有数码管上显示按键对应的数字:

    #include <REGX52.H>
    #include "LCD1602.h"
    #include "key.h"
    #include "Delay.h"
    
    unsigned char K, n; // n用于控制数码管的显示位置
    unsigned char chr[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
    
    void test(unsigned char location, unsigned char number) {
        // 位选控制,确保只有选中的数码管被激活
        P2 = ~(1 << location); // 使用按位取反和左移操作来选中对应的数码管
        // 段选控制
        P0 = chr[number];
    }
    
    void main() {
        n = 0; // 初始化数码管位置
        while (1) {
            K = key(); // 返回按键值
            if (K) {
                test(n, K); // 在当前位置的数码管上显示按键值
                n = (n + 1) % 8; // 更新数码管位置,循环显示
                DelayMs(500); // 延时,以便观察数码管的显示效果
            }
        }
    }
    

    注意事项

    • 确保key()函数能够正确返回按键值。
    • 检查数码管和按键的硬件连接是否正确。
    • 如果数码管显示仍然不正确,可能需要检查数码管的规格和接线方式,确保与代码中的逻辑匹配。

    希望这些修改能够帮助您解决问题。如果您还有其他问题或需要进一步的帮助,请随时告诉我。

    评论

报告相同问题?

问题事件

  • 系统已结题 8月21日
  • 修改了问题 8月14日
  • 修改了问题 8月14日
  • 修改了问题 8月14日
  • 展开全部

悬赏问题

  • ¥15 软件供应链安全是跟可靠性有关还是跟安全性有关?
  • ¥15 电脑蓝屏logfilessrtsrttrail问题
  • ¥20 关于wordpress建站遇到的问题!(语言-php)(相关搜索:云服务器)
  • ¥15 【求职】怎么找到一个周围人素质都很高不会欺负他人,并且未来月薪能够达到一万以上(技术岗)的工作?希望可以收到写有具体,可靠,已经实践过了的路径的回答?
  • ¥15 Java+vue部署版本反编译
  • ¥100 对反编译和ai熟悉的开发者。
  • ¥15 带序列特征的多输出预测模型
  • ¥15 Python 如何安装 distutils模块
  • ¥15 关于#网络#的问题:网络是从楼上引一根网线下来,接了2台傻瓜交换机,也更换了ip还是不行
  • ¥15 资源泄露软件闪退怎么解决?