找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 109|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

請問為什么我這個仿真圖的數(shù)碼管無論按哪個按鍵,都只顯示初始值呢

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1150590 發(fā)表于 2025-5-15 21:55 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
#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, 下載次數(shù): 0)

仿真圖

仿真圖
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:712097 發(fā)表于 2025-5-16 15:03 | 只看該作者
硬件電路不對,MCU端口不足以驅(qū)動4位數(shù)碼。需要加三極管/MOS/反相器/緩沖器/專用數(shù)碼管驅(qū)動IC等。
回復(fù)

使用道具 舉報

板凳
ID:996773 發(fā)表于 2025-5-16 15:32 | 只看該作者
位選1234要用四個三極管擴流供電,52的單片機io口上拉電流很弱,樓主的模電很弱所以不理解,還得多修煉
回復(fù)

使用道具 舉報

地板
ID:1109793 發(fā)表于 2025-5-16 15:44 | 只看該作者
數(shù)碼管驅(qū)動是可以的,前提是把IO設(shè)置推挽模式,另外段碼腳要加個限流電阻的。但是你這標準C51可能不行。
矩陣按鍵不是有個反轉(zhuǎn)法嗎?論壇里搜一下
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表