uint8 led_zimo[11] =
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF};
//--------------------------------------------------------------------------------------------------------//
/*
按键为 4 个,定义及键码分别为:(不可改,否则按键处理时
对不上号)
切换/确认键:EKB_OK = 1 ,用来切换设置状态和显示状态 加键:EKB_ADD = 2 ,焦点数字加 1 减健:EKB_SUB = 4 ,焦点数字减 1
显示模式切换键:EKB_MODE = 8 ,手动切换 时间显示 和
“1234”显示
//--*/ #define EKB_OK 1 #define EKB_ADD 2 #define EKB_SUB 4 #define EKB_MODE 8 //按键信息结构 typedef struct {
uint8 io_s; //按键状态【更新前为上
一次状态,更新后为当前状态】
uint8 io_n; //按键状态连续持续
ticks个数记录
uint8 kb_s; //当前键盘状态【0 - 未
按下;1 - 按下】
uint8 kb_chg; //键盘状态变位标识【1 |
0,读清零,1 时不产生新的状态以等待程序处理】
} T_KB;
//按键状态宏定义 - 按键按下 #define _KBS_PRESS 1 //按键动作宏定义 #define _KBS_FREE 0 //按键未按
下
#define _KBS_DOWN 1 //按键按下 //按键去抖时间(_KB_DITHERT × 5ms = 去抖时间,可根
据实际情况修改。数字越大,按键越不灵敏)
#define _KB_DITHERT 10 //按键状态缓存 T_KB t_kb[4];
//--------------------------------------------------------------------------------------------------------//
11
//当前页面序号(0 - 正常页面,时间和“1234”切换;1 - 时
间设置页面)
uint8 scr_cur = 0;
//当前页面序号备份(上一次的值,用于判断页面切换) uint8 scr_curc = 1;
//自动换屏的定时常数定义(单位:毫秒)- 可根据实际情况
修改,如需要 5秒 自动换屏,则 改为 5000
#define _SCR_AUTOTIME 3000 //闪烁时焦点熄灭的时间定义(单位:毫秒; 显示时间则为 1000
- _SCR_FLASH_HIDETIME)
#define _SCR_FLASH_HIDETIME 300
//闪烁时led不显示任何值(即熄灭)的值的宏定义(在 码表
里 该值 表示 led灯全灭)【该值可改,但建议别改】
#define _LED_KC_BLANK 10
//--------------------------------------------------------------------------------------------------------//
//秒计时器(作为当前时间) uint16 value=0,tmr_sec = 0;
//毫秒计时器(累计计时,一直累加) uint16 tmr_ms = 0;
//毫秒计时器(进位计时,用于 分钟的累计) uint16 tmr_ms2 = 0;
//时间变化值宏定义(1 - 时间增加,正计时;-1 - 时间减
小,倒计时,单位:秒。如果要 正计时 的话,改成 1)
uint8
flag=0,flag_2=0,alm1,alm2,flag_10=0,flag_7=0,flag_6=0,num=0;
#define _TMR_CHG -1
//定时器超时定时值(固定为 5ms,所以需要一个 5ms 的定时
器。若你的定时器为 10ms的循环定时器,则将其改为 10)
#define _TMR_TICKTIME 5
void tmr_isr(void); void led_display(void);
//----------------------------------------------------------------------------------------------------//
void delayms(uint8 value) {
uint8 i=0,j=0;
for(j=0;j void t0_int() 12 { TMOD=0x11; TH0=(65536-5000)>>8; TL0=(65536-5000); TH1=(65536-50000)>>8; TL1=(65536-50000); ET1=1; ET0=1; EA=1; TR0=1; } void time0() interrupt 1 { TH0=(65536-5000)>>8; TL0=(65536-5000); TF0=0; tmr_isr(); led_display(); } void time1() interrupt 3 { TH1=(65536-50000)>>8; TL1=(65536-50000); TF1=0; num++; } /***************************************************** **************************************************** ** 函数名称 : expend16u ** 输 入 : 起始值,结束值 ** 输 出 : 差值 ** 功能描述 : 计算两个数据的线性差值(uint16): 用计算 值的备份值计算,不会因为值的随即变化而影响计算结果 ****************************************************** ****************************************************/ uint16 expend16u(uint16 istart,uint16 iend) { if (iend >= istart) 13 return (iend - istart); else return (iend + ((uint16)0xFFFF - istart) + 1); } //--------------------------------------------------------------------------------------------------------// /***************************************************** **************************************************** ** 函数名称 : led_output ** 输 入 : 预显示数据数组首地址 ** 输 出 : 无 ** 功能描述 : led数据准备(数据固定为 4 个字符) ****************************************************** ****************************************************/ void led_output(uint8 *pdat) { uint8 i; for (i = 0; i < 4; i ++) { if ((pdat[i] <= 9) || (pdat[i] == _LED_KC_BLANK)) leds[i] = pdat[i]; //将需要显示的 数据拷贝到显示缓冲区 else leds[i] = _LED_KC_BLANK; } /* if(num==0) { for (i = 0; i < 4; i ++) { if ((pdat[i] <= 9) || (pdat[i] == _LED_KC_BLANK)) leds[i] = pdat[i]; //将需要显示的 数据拷贝到显示缓冲区 else leds[i] = _LED_KC_BLANK; } } else { 14 switch(flag_1) { case 1: leds[0] = pdat[0];leds[1] = 10;leds[2] = 10;leds[3] = 10;break; case 2: leds[0] = 10;leds[1] = pdat[1];leds[2] = 10;leds[3] = 10; break; case 3: leds[0] = pdat[0];leds[1] = pdat[1];leds[2] = 10;leds[3] = 10; break; } } */ } /***************************************************** **************************************************** ** 函数名称 : led_display ** 输 入 : 无 ** 输 出 : 无 ** 功能描述 : led数据打印(数据固定为 4 个字符)【即 led输出驱动。。。】 ****************************************************** ****************************************************/ void led_display(void) { //在这里把 leds[] 里的数据分别显示到 4 个led上。。。 //leds[0] 为 分钟的十位;leds[1] 为 分钟的个位 //leds[2] 为 秒的十位;leds[3] 为 秒的个位 //leds[?] 里的数为 0-9 时,显示为对应的数字,为 _LED_KC_BLANK(默认为 10) 时,对应的那一位led段码管不亮 uint8 i=0; static uint8 iled = 0; iled = (iled + 1) % 4; P0 = 0xFF; switch(iled) { case 3: P1_3=0; P1_2=1; P1_1=1; P1_0=1; break; case 0: P1_3=1; 15