![]() |
#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(); // 更新焦度显示 // 可以添加其他功能,如翻面提醒等 } } 程序包括了以下功能: 数码管显示时间和焦度。 按键控制时间和焦度的设置。 定时器中断用于计时功能。 开始/停止计时器的功能。 |