找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索

求大神幫我看看顯示板的控制

查看數(shù): 925 | 評(píng)論數(shù): 1 | 收藏 0
關(guān)燈 | 提示:支持鍵盤翻頁(yè)<-左 右->
    組圖打開(kāi)中,請(qǐng)稍候......
發(fā)布時(shí)間: 2024-8-22 20:25

正文摘要:

3個(gè)數(shù)碼管顯示這些玩意兒,但是我現(xiàn)在沒(méi)有什么思路,請(qǐng)大神幫我搭個(gè)框架,謝謝你們

回復(fù)

ID:404160 發(fā)表于 2024-8-23 11:14
#include <REGX51.H>

#define uchar unsigned char
#define uint unsigned int

// 數(shù)碼管顯示數(shù)字的編碼
uchar code num_table[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};

// 假設(shè)數(shù)碼管的段選連接到P0口,位選連接到P2口
sbit DIGIT1 = P0;
sbit DIGIT2 = P2;

// 按鍵定義
sbit KEY_SET = P3^0; // 設(shè)置鍵
sbit KEY_PLUS = P3^1; // 加鍵
sbit KEY_MINUS = P3^2; // 減鍵
sbit KEY_START = P3^3; // 開(kāi)始鍵

// 全局變量
uchar timeSet = 5; // 設(shè)置的時(shí)間,默認(rèn)5分鐘
uchar degreeSet = 4; // 設(shè)置的焦度,默認(rèn)4檔
uchar timeCount = 0; // 計(jì)時(shí)器變量
bit isTimerRunning = 0; // 計(jì)時(shí)器運(yùn)行狀態(tài)

// 延時(shí)函數(shù)
void DelayMs(uint ms) {
    uint i, j;
    for (i = ms; i > 0; i--)
        for (j = 110; j > 0; j--);
}

// 數(shù)碼管顯示函數(shù)
void DisplayDigit(uchar pos, uchar num) {
    if (pos == 1) {
        DIGIT1 = 0xFF; // 關(guān)閉所有數(shù)碼管
        DIGIT2 = num_table[num]; // 顯示數(shù)字
    } else {
        DIGIT2 = 0xFF; // 關(guān)閉所有數(shù)碼管
        DIGIT1 = num_table[num]; // 顯示數(shù)字
    }
}

// 更新時(shí)間顯示
void UpdateTimeDisplay() {
    uchar minutes = timeSet / 10;
    uchar seconds = timeSet % 10;
    DisplayDigit(1, minutes); // 分鐘十位
    DisplayDigit(2, seconds); // 分鐘個(gè)位
}

// 更新焦度顯示
void UpdateDegreeDisplay() {
    DisplayDigit(3, degreeSet); // 焦度
}

// 按鍵掃描函數(shù)
void KeyScan() {
    if (KEY_SET == 0) { // 設(shè)置模式
        // 進(jìn)入設(shè)置模式,可能需要額外的邏輯來(lái)設(shè)置時(shí)間和焦度
        while (KEY_SET == 0); // 等待按鍵釋放
    }
    if (KEY_PLUS == 0) { // 增加時(shí)間或焦度
        if (isTimerRunning) {
            timeSet++;
            if (timeSet > 59) timeSet = 59; // 時(shí)間限制為0-59分鐘
        } else {
            degreeSet++;
            if (degreeSet > 8) degreeSet = 8; // 焦度限制為1-8檔
        }
        while (KEY_PLUS == 0); // 等待按鍵釋放
    }
    if (KEY_MINUS == 0) { // 減少時(shí)間或焦度
        if (isTimerRunning) {
            timeSet--;
            if (timeSet < 1) timeSet = 1; // 時(shí)間限制為1-59分鐘
        } else {
            degreeSet--;
            if (degreeSet < 1) degreeSet = 1; // 焦度限制為1-8檔
        }
        while (KEY_MINUS == 0); // 等待按鍵釋放
    }
    if (KEY_START == 0) { // 開(kāi)始計(jì)時(shí)
        isTimerRunning = !isTimerRunning;
        timeCount = timeSet; // 重置計(jì)時(shí)器
        while (KEY_START == 0); // 等待按鍵釋放
    }
}

// 定時(shí)器中斷服務(wù)程序
void Timer0_isr() interrupt 1 {
    TH0 = (65536 - 500) / 256; // 重新加載定時(shí)器初值
    TL0 = (65536 - 500) % 256;
    if (isTimerRunning) {
        timeCount--;
        if (timeCount == 0) {
            isTimerRunning = 0; // 停止計(jì)時(shí)器
            // 可以添加代碼來(lái)處理計(jì)時(shí)結(jié)束的事件
        }
    }
}

void main() {
    TMOD = 0x01; // 設(shè)置定時(shí)器模式
    TH0 = (65536 - 500) / 256; // 定時(shí)器初值設(shè)置
    TL0 = (65536 - 500) % 256; // 定時(shí)器初值設(shè)置
    ET0 = 1; // 開(kāi)啟定時(shí)器0中斷
    EA = 1; // 開(kāi)啟全局中斷
    TR0 = 1; // 啟動(dòng)定時(shí)器

    while (1) {
        KeyScan(); // 掃描按鍵
        UpdateTimeDisplay(); // 更新時(shí)間顯示
        UpdateDegreeDisplay(); // 更新焦度顯示

        // 可以添加其他功能,如翻面提醒等
    }
}
程序包括了以下功能:

數(shù)碼管顯示時(shí)間和焦度。
按鍵控制時(shí)間和焦度的設(shè)置。
定時(shí)器中斷用于計(jì)時(shí)功能。
開(kāi)始/停止計(jì)時(shí)器的功能。

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

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

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