亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1490|回復: 8
打印 上一主題 下一主題
收起左側

求助數碼管顯示問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:1156030 發表于 2025-7-5 14:30 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
用51單片機實現籃球計分器,有加1/2分、減1/2分、清零功能,分數范圍為00-99。實物已經連接出來并實現功能,但是仿真不知道為何兩個一位數碼管一直顯示88,按鍵按下可以正常加減數,但是松開按鍵又是88


#include <REGX52.H>
// 共陰數碼管段碼表(0-9)
unsigned char code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned int count = 0; // 用unsigned int避免負數問題

// 延時消抖函數
void delay_ms(unsigned int ms) {
    unsigned int i, j;
    for(i=0; i<ms; i++)
        for(j=0; j<112; j++); // 12MHz晶振,約1ms
}

// 動態顯示函數
void display() {
    unsigned char shi, ge;
    shi = count / 10;    // 十位
    ge = count % 10;     // 個位
    // 十位顯示(P2口)
    P2 = table[shi];
    delay_ms(1);
    // 個位顯示(P0口)
    P0 = table[ge];
    delay_ms(1);
}

void main() {
    P0 = 0x00;
    P2 = 0x00;
    while(1) {
        display();

        // 加1(P1.0)
        if(P1_0 == 0) {
            delay_ms(10); // 消抖
            if(P1_0 == 0) {
                if(count < 99) count++;
                while(P1_0 == 0) display(); // 等待釋放時刷新顯示
            }
        }

        // 加2(P1.1)
        if(P1_1 == 0) {
            delay_ms(10);
            if(P1_1 == 0) {
                if(count <= 97) count += 2;
                                                                else if(count == 98) count = 99; // 兼容count=98時加2到99
                while(P1_1 == 0) display();
            }
        }

        // 減1(P1.2)
        if(P1_2 == 0) {
            delay_ms(10);
            if(P1_2 == 0) {
                if(count > 0) count--;
                while(P1_2 == 0) display();
            }
        }

        // 減2(P1.3)
        if(P1_3 == 0) {
            delay_ms(10);
            if(P1_3 == 0) {
                if(count >= 2) count -= 2;
                else if(count == 1) count = 0; // 兼容count=1時減2到0
                while(P1_3 == 0) display();
            }
        }

        // 清零(P1.4)
        if(P1_4 == 0) {
            delay_ms(10);
            if(P1_4 == 0) {
                count = 0;
                while(P1_4 == 0) display();
            }
        }
                                
    }
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:332444 發表于 2025-7-5 16:59 | 只看該作者
這種情況通常是數碼管無消隱處理代碼導致。
回復

使用道具 舉報

板凳
ID:1089588 發表于 2025-7-5 17:24 | 只看該作者
display() 里面先清0再賦值試試
回復

使用道具 舉報

地板
ID:1133081 發表于 2025-7-5 21:25 | 只看該作者

程序寫的不算好,但顯示沒有問題。


回復

使用道具 舉報

5#
ID:1137639 發表于 2025-7-6 00:22 | 只看該作者
### 問題分析   籃球計分器在按鍵操作時能正常計數,但松開后數碼管顯示固定為“88”,這是動態顯示刷新機制不足導致的典型問題。在仿真環境中,由于缺乏實際硬件的電荷保持特性(如電容濾波、余暉效應),若動態掃描頻率不足,數碼管會因無法持續獲取正確數據而顯示異常。當前代碼中`display()`函數僅在按鍵處理時被調用,主循環未實現高頻掃描,導致非按鍵狀態下數碼管輸出默認異常值。  ### 解決方案   修改后的代碼通過優化動態顯示邏輯與按鍵處理流程,確保數碼管高頻刷新:   在動態顯示部分,增加靜態變量`position`實現十位與個位的交替掃描,通過`P0=0x00; P2=0x00;`進行消隱處理以避免殘影,并縮短單次顯示延時來提升掃描頻率。按鍵處理上,將檢測邏輯封裝為獨立函數`key_scan()`,通過`key_pressed`標志位標記按鍵狀態,在按鍵釋放循環中持續調用`display()`以實時同步計數變化。主循環采用“先顯示后按鍵”的結構,確保每輪循環都強制刷新數碼管,避免因按鍵處理阻塞顯示更新。  ### 關鍵改進說明   優化后的顯示機制通過`position`變量實現分時掃描,配合消隱操作消除鬼影,使十位(P2口)與個位(P0口)的段碼輸出更穩定。針對仿真環境無硬件保持特性的特點,通過軟件高頻刷新確保`count`變量的實時值同步到數碼管。若數碼管仍顯示異常,需檢查仿真配置(如數碼管是否為共陰類型、端口連接是否正確),或降低仿真速度以匹配軟件掃描頻率。該方案通過動態掃描頻率優化,有效解決了仿真環境下的顯示同步問題。
回復

使用道具 舉報

6#
ID:1156030 發表于 2025-7-6 12:31 | 只看該作者
xianfajushi 發表于 2025-7-5 16:59
這種情況通常是數碼管無消隱處理代碼導致。

好像是的,謝謝大佬
回復

使用道具 舉報

7#
ID:1156030 發表于 2025-7-6 12:33 | 只看該作者
WL0123 發表于 2025-7-5 21:25
程序寫的不算好,但顯示沒有問題。

可能是我別的地方有問題,你這個為什么不用搭最小系統嗎
回復

使用道具 舉報

8#
ID:1133081 發表于 2025-7-6 15:51 | 只看該作者
多情不自作 發表于 2025-7-6 12:33
可能是我別的地方有問題,你這個為什么不用搭最小系統嗎

只要在MCU屬性里設置晶振頻率即可,VCC和RST都是系統默認的,不需要畫出來。
回復

使用道具 舉報

9#
ID:1152291 發表于 2025-7-11 13:39 | 只看該作者
還不如整一個二位一體的數碼該管。這樣兩個單在一起的數碼管在一起確實是不太好寫,而且書寫籃球比賽計分器的同時我們是需要往更高級的方向進行描述的。我們也是需要向往更高級的代碼進行分析的,而且你這點錯誤如果解決不了的話我們確實是可以自己去網上尋找點AI的幫助的哦這樣確實是可以對你代碼進行分析的哦。
回復

使用道具 舉報

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

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表