找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
#include <reg52.h>
#include <intrins.h>

#define uint unsigned int
#define uchar unsigned char

// ???????(P3.0-P3.2)
sbit WEI1 = P3^0;  // ?1?
sbit WEI2 = P3^1;  // ?2?
sbit WEI3 = P3^2;  // ?3?

// ????????(0-9)
uchar code seg_table[] = {
    0x3F, 0x06, 0x5B, 0x4F, 0x66,  // 0-4
    0x6D, 0x7D, 0x07, 0x7F, 0x6F   // 5-9
};

uint key, key_num;  // ?????

/*********************** ??????? ************************/
void delay_1ms(uint x)
{
    TMOD = 0x01;    // ???0??1
    TR0 = 1;        // ?????
    while(x--)
    {
        TH0 = 0xFC; // 1ms????
        TL0 = 0x18;
        while(!TF0); // ????
        TF0 = 0;
    }
    TR0 = 0;        // ?????
}

/*********************** ????????? ********************/
void display(uint num)
{
    static uchar pos = 0; // ??????
    uchar digits[3];      // ?????????

    // ?????
    digits[0] = num / 100;         // ??
    digits[1] = (num / 10) % 10;   // ??
    digits[2] = num % 10;           // ??

    // ??????
    WEI1 = WEI2 = WEI3 = 1;

    // ??????
    switch(pos)
    {
        case 0:
            P2 = seg_table[digits[0]];
            WEI1 = 0;
            break;
        case 1:
            P2 = seg_table[digits[1]];
            WEI2 = 0;
            break;
        case 2:
            P2 = seg_table[digits[2]];
            WEI3 = 0;
            break;
    }

    pos = (pos+1) % 3;  // ????
    delay_1ms(2);       // ?????2ms
}

/*********************** ?????? *************************/
uchar keyscan()
{
    uchar i, j, key_value = 0xFF;
    P1 = 0xF0; // ?4???0,?4???1
    if(P1 != 0xF0) { // ?????????
        delay_1ms(10); // ??
        if(P1 != 0xF0) {
            // ???
            for(i = 0; i < 4; i++) {
                P1 = ~(0x01 << i); // ???????
                for(j = 0; j < 4; j++) {
                    if(!(P1 & (0x10 << j))) { // ???
                        key_value = i * 4 + j; // ????
                        while(P1 != 0xF0); // ??????
                        return key_value;
                    }
                }
            }
        }
    }
    return key_value;
}

/*********************** ?????? *************************/
void keynum()
{
    uchar i, j;
    uchar code tab[4][4] = {
        {'7', '8', '9', '/'},
        {'4', '5', '6', '*'},
        {'1', '2', '3', '-'},
        {'C', '0', '=', '+'}
    };

    key = keyscan();
    if(key != 0xFF)
    {
        i = key / 4;  // ??
        j = key % 4;  // ??
        key_num = tab[i][j] - '0'; // ???????0-9
    }
}

/************************ ??? ****************************/
void main()
{
    uint square_value = 0;
    P3 = 0xFF;  // ?????

    while(1)
    {
        keynum();  // ????
        if(key != 0xFF)
        {
            if(key_num >= 0 && key_num <= 9) {
                square_value = key_num * key_num;  // ?????
            }
        }
        display(square_value);  // ??????
    }
}

屏幕截图 2025-05-15 215332.png (76.24 KB, 下载次数: 0)

仿真图

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

使用道具 举报

沙发
ID:712097 发表于 2025-5-16 15:03 | 只看该作者
硬件电路不对,MCU端口不足以驱动4位数码。需要加三极管/MOS/反相器/缓冲器/专用数码管驱动IC等。
回复

使用道具 举报

板凳
ID:996773 发表于 2025-5-16 15:32 | 只看该作者
位选1234要用四个三极管扩流供电,52的单片机io口上拉电流很弱,楼主的模电很弱所以不理解,还得多修炼
回复

使用道具 举报

地板
ID:1109793 发表于 2025-5-16 15:44 | 只看该作者
数码管驱动是可以的,前提是把IO设置推挽模式,另外段码脚要加个限流电阻的。但是你这标准C51可能不行。
矩阵按键不是有个反转法吗?论坛里搜一下
回复

使用道具 举报

5#
ID:1150590 发表于 2025-5-17 10:21 | 只看该作者
chxelc 发表于 2025-5-16 15:03
硬件电路不对,MCU端口不足以驱动4位数码。需要加三极管/MOS/反相器/缓冲器/专用数码管驱动IC等。

好的,谢谢
回复

使用道具 举报

6#
ID:1150590 发表于 2025-5-17 10:22 | 只看该作者
hi等你 发表于 2025-5-16 15:32
位选1234要用四个三极管扩流供电,52的单片机io口上拉电流很弱,楼主的模电很弱所以不理解,还得多修炼

好的,谢谢
回复

使用道具 举报

7#
ID:1150590 发表于 2025-5-17 10:22 | 只看该作者
xiaobendan001 发表于 2025-5-16 15:44
数码管驱动是可以的,前提是把IO设置推挽模式,另外段码脚要加个限流电阻的。但是你这标准C51可能不行。
...

好的,谢谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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