找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求大神帮我看看显示板的控制

[复制链接]
跳转到指定楼层
楼主

3个数码管显示这些玩意儿,但是我现在没有什么思路,请大神帮我搭个框架,谢谢你们

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

使用道具 举报

沙发
ID:404160 发表于 2024-8-23 11:14 | 只看该作者
#include <REGX51.H>

#define uchar unsigned char
#define uint unsigned int

// 数码管显示数字的编码
uchar code num_table[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};

// 假设数码管的段选连接到P0口,位选连接到P2口
sbit DIGIT1 = P0;
sbit DIGIT2 = P2;

// 按键定义
sbit KEY_SET = P3^0; // 设置键
sbit KEY_PLUS = P3^1; // 加键
sbit KEY_MINUS = P3^2; // 减键
sbit KEY_START = P3^3; // 开始键

// 全局变量
uchar timeSet = 5; // 设置的时间,默认5分钟
uchar degreeSet = 4; // 设置的焦度,默认4档
uchar timeCount = 0; // 计时器变量
bit isTimerRunning = 0; // 计时器运行状态

// 延时函数
void DelayMs(uint ms) {
    uint i, j;
    for (i = ms; i > 0; i--)
        for (j = 110; j > 0; j--);
}

// 数码管显示函数
void DisplayDigit(uchar pos, uchar num) {
    if (pos == 1) {
        DIGIT1 = 0xFF; // 关闭所有数码管
        DIGIT2 = num_table[num]; // 显示数字
    } else {
        DIGIT2 = 0xFF; // 关闭所有数码管
        DIGIT1 = num_table[num]; // 显示数字
    }
}

// 更新时间显示
void UpdateTimeDisplay() {
    uchar minutes = timeSet / 10;
    uchar seconds = timeSet % 10;
    DisplayDigit(1, minutes); // 分钟十位
    DisplayDigit(2, seconds); // 分钟个位
}

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

// 按键扫描函数
void KeyScan() {
    if (KEY_SET == 0) { // 设置模式
        // 进入设置模式,可能需要额外的逻辑来设置时间和焦度
        while (KEY_SET == 0); // 等待按键释放
    }
    if (KEY_PLUS == 0) { // 增加时间或焦度
        if (isTimerRunning) {
            timeSet++;
            if (timeSet > 59) timeSet = 59; // 时间限制为0-59分钟
        } else {
            degreeSet++;
            if (degreeSet > 8) degreeSet = 8; // 焦度限制为1-8档
        }
        while (KEY_PLUS == 0); // 等待按键释放
    }
    if (KEY_MINUS == 0) { // 减少时间或焦度
        if (isTimerRunning) {
            timeSet--;
            if (timeSet < 1) timeSet = 1; // 时间限制为1-59分钟
        } else {
            degreeSet--;
            if (degreeSet < 1) degreeSet = 1; // 焦度限制为1-8档
        }
        while (KEY_MINUS == 0); // 等待按键释放
    }
    if (KEY_START == 0) { // 开始计时
        isTimerRunning = !isTimerRunning;
        timeCount = timeSet; // 重置计时器
        while (KEY_START == 0); // 等待按键释放
    }
}

// 定时器中断服务程序
void Timer0_isr() interrupt 1 {
    TH0 = (65536 - 500) / 256; // 重新加载定时器初值
    TL0 = (65536 - 500) % 256;
    if (isTimerRunning) {
        timeCount--;
        if (timeCount == 0) {
            isTimerRunning = 0; // 停止计时器
            // 可以添加代码来处理计时结束的事件
        }
    }
}

void main() {
    TMOD = 0x01; // 设置定时器模式
    TH0 = (65536 - 500) / 256; // 定时器初值设置
    TL0 = (65536 - 500) % 256; // 定时器初值设置
    ET0 = 1; // 开启定时器0中断
    EA = 1; // 开启全局中断
    TR0 = 1; // 启动定时器

    while (1) {
        KeyScan(); // 扫描按键
        UpdateTimeDisplay(); // 更新时间显示
        UpdateDegreeDisplay(); // 更新焦度显示

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

数码管显示时间和焦度。
按键控制时间和焦度的设置。
定时器中断用于计时功能。
开始/停止计时器的功能。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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