5步掌握Mirth Connect医疗数据集成平台
2026/6/11 15:32:09
这个时钟实现了以下功能:
时:分:秒,区分设置模式(SET)和运行模式(RUN);加/减调整时间、确认切换设置项 / 退出设置、重置恢复初始时间;电路图核心模块如下:
所有按键采用上拉输入(接地式),对应引脚:
代码基于 Keil C51 编写,采用模块化设计,核心模块解析如下:
负责 LCD 的初始化、写指令、写数据,是显示功能的基础:
// 写LCD指令(控制显示模式、光标等) void write_com(uchar com) { P0 = com; RS=0; RW=0; EN=1; // RS=0表示写指令 delay(1); EN=0; // 拉低EN完成写入 } // 写LCD数据(显示字符) void write_dat(uchar dat) { P0 = dat; RS=1; RW=0; EN=1; // RS=1表示写数据 delay(1); EN=0; } // LCD初始化:8位数据、2行显示、5*7点阵 void lcd_init() { write_com(0x38); write_com(0x0C); // 开显示、关光标 write_com(0x06); // 写数据后光标右移 write_com(0x01); // 清屏 }利用定时器 0 实现1ms 基准延时,累计到 1 秒后更新时间,同时支持走时校准:
void timer0_init() { TMOD |= 0x01; // 定时器0工作在16位模式 TH0 = 0xDB; // 11.0592MHz下1ms初值:TH0=0xDB, TL0=0xF8 TL0 = 0xF8; ET0 = 1; // 使能定时器0中断 TR0 = 1; // 启动定时器 EA = 1; // 开总中断 } // 定时器0中断服务函数(1ms触发一次) void timer0_isr() interrupt 1 { static uint cnt = 0; uint target_cnt = 100 - calib_comp; // 校准后1秒的计数阈值(基准100次=1秒) TH0 = 0xDB; TL0 = 0xF8; // 重装初值 target_cnt = (target_cnt <80?80:(target_cnt>120?120:target_cnt)); // 限制校准范围 if(++cnt >= target_cnt) { cnt = 0; if(!set_flag) { // 仅运行模式更新时间 if(++second >=60) {second=0; if(++minute>=60){minute=0; if(++hour>=24)hour=0;}} } } }calib_comp调整target_cnt(比如calib_comp=-2时,target_cnt=102,实际 1 秒≈1.02ms,抵消晶振偏慢问题)。采用延时消抖解决按键机械抖动问题,实现时间设置逻辑:
// 按键消抖(以加按键为例) uchar add_key_debounce() { if(KEY_ADD == 0) { delay_us(20000); // 20ms消抖延时 if(KEY_ADD == 0) { while(!KEY_ADD); // 等待按键松开 return 1; } } return 0; } // 时间设置逻辑 void time_set() { if(add_key_debounce()) { // 加按键:调整当前设置项 switch(set_step){case0:hour=(hour+1)%24;case1:minute=(minute+1)%60;case2:second=(second+1)%60;} } if(sub_key_debounce()) { // 减按键:调整当前设置项 switch(set_step){case0:hour=hour?hour-1:23;case1:minute=minute?minute-1:59;case2:second=second?second-1:59;} } if(confirm_key_debounce()) { // 确认按键:切换设置项/退出设置 if(++set_step>=3){set_step=0; set_flag=0;} } }[SET]),默认时间00:00:00,提示设置HOUR;加/减调整小时→按确认切换到分钟设置→再确认切换到秒→再确认进入运行模式(显示[RUN]);calib_comp值(比如+3加快走时、-2减慢走时);重置,时间恢复00:00:00并回到设置模式。现象:按加 / 减 / 确认键,时间无变化、模式不切换;原因 & 解决方案:
DEBOUNCE_DELAY(推荐 20000~50000,对应 20~50ms);#sbit定义;通过网盘分享的文件:LCD.zip 提取码: 5a3x