|
基于单片机的摇摇棒 状态迁移图
原理图:
单片机源程序如下:
- //--------------------------------------------------------
- // 项目:摇摇棒
- // 模块:主程序
- // 说明:
- // 设计:张俊(版权所有,引用者请保留原作者姓名)
- //--------------------------------------------------------
- /*
- 版本说明:
- 2006-08-07 v01.01
- 测试版本
- ACLK = TACLK = 32768Hz, MCLK = SMCLK = default DCO
- 每2S中断一次,对P1.0~P1.6口输出取反
- 2006-08-07 v01.02
- 测试版本
- 改变计时器计数模式
- 2006-08-08 v01.03
- 测试版本
- 2006-08-11 v01.04
- 测试版本
- 已经可以显示时间了,并且时间也可以运行了
- 但是时间还不可调节
- 2006-08-12 v01.05
- 增加按键和蜂鸣器功能(按键与LED口复用IO口)
- 2006-08-14 v01.06
- 增加工作模式,不同模式下显示和按键内容不同
-
- 2006-08-16 v01.07
- 修改部分BUG
- 2006-08-20 v01.08
- 1.完成整点报时功能,每次整点鸣叫2声
- 2.取消分钟提示功能(因为程序空间不够了)
- 3.完善秒表功能
- 4.增加一个延时自动退出功能,60秒内未按键,也未触发惯性开关,则返回模式0
- 5.当无键计时>60秒,则禁止按键唤醒,必须通过惯性开关唤醒
- 经过这样改动后,待机电流由16UA下降到了6UA.
- */
- //--------------------------------------------------------
- //插入文件包
- //--------------------------------------------------------
- #include
- //--------------------------------------------------------
- //--------------------------------------------------------
- //重新命名数据类型
- //--------------------------------------------------------
- typedef unsigned char tU08; //unsigned 8 bit definition
- typedef unsigned char tU8; //unsigned 8 bit definition
- typedef unsigned int tU16; //unsigned 16 bit definition
- typedef unsigned long tU32; //unsigned 32 bit definition
- typedef signed char tS08; //signed 8 bit definition
- typedef signed char tS8; //signed 8 bit definition
- typedef signed int tS16; //signed 16 bit definition
- typedef signed long tS32; //signed 32 bit definition
- typedef float tF32;
- typedef double tF64;
- //--------------------------------------------------------
- //显示段码表(A类代码)
- //--------------------------------------------------------
- const tU08 LCD_TAB_A[]=
- { //编号 字符
- 0x3E, 0x41, 0x41, 0x41, 0x3E, //0 0
- 0x00, 0x42, 0x7F, 0x40, 0x00, //1 1
- 0x42, 0x61, 0x51, 0x49, 0x46, //2 2
- 0x21, 0x41, 0x45, 0x4B, 0x31, //3 3
- 0x18, 0x14, 0x12, 0x7F, 0x10, //4 4
- 0x27, 0x45, 0x45, 0x45, 0x39, //5 5
- 0x3C, 0x4A, 0x49, 0x49, 0x30, //6 6
- 0x01, 0x01, 0x71, 0x0D, 0x03, //7 7
- 0x36, 0x49, 0x49, 0x49, 0x36, //8 8
- 0x06, 0x49, 0x49, 0x29, 0x1E, //9 9
- 0x7C, 0x12, 0x11, 0x12, 0x7C, //10 A
- 0x7F, 0x49, 0x49, 0x49, 0x36, //11 B
- 0x3E, 0x41, 0x41, 0x41, 0x22, //12 C
- 0x7F, 0x41, 0x41, 0x22, 0x1C, //13 D
- 0x7F, 0x49, 0x49, 0x49, 0x41, //14 E
- 0x7F, 0x09, 0x09, 0x09, 0x01, //15 F
- 0x3E, 0x41, 0x49, 0x49, 0x3A, //16 G
- 0x7F, 0x08, 0x08, 0x08, 0x7F, //17 H
- 0x00, 0x41, 0x7F, 0x41, 0x00, //18 I
- 0x00, 0x21, 0x41, 0x3F, 0x01, //19 J
- 0x7F, 0x08, 0x14, 0x22, 0x41, //20 K
- 0x7F, 0x40, 0x40, 0x40, 0x40, //21 L
- 0x7F, 0x02, 0x0C, 0x02, 0x7F, //22 M
- 0x7F, 0x04, 0x08, 0x10, 0x7F, //23 N
- 0x3E, 0x41, 0x41, 0x41, 0x3E, //24 O
- 0x7F, 0x09, 0x09, 0x09, 0x06, //25 P
- 0x3E, 0x41, 0x51, 0x21, 0x5E, //26 Q
- 0x7F, 0x09, 0x19, 0x29, 0x46, //27 R
- 0x26, 0x49, 0x49, 0x49, 0x32, //28 S
- 0x01, 0x01, 0x7F, 0x01, 0x01, //29 T
- 0x3F, 0x40, 0x40, 0x40, 0x3F, //30 U
- 0x1F, 0x20, 0x40, 0x20, 0x1F, //31 V
- 0x3F, 0x40, 0x30, 0x40, 0x3F, //32 W
- 0x63, 0x14, 0x08, 0x14, 0x63, //33 X
- 0x03, 0x04, 0x78, 0x04, 0x03, //34 Y
- 0x61, 0x51, 0x49, 0x45, 0x43, //35 Z
- 0x00, 0x00, 0x00, 0x00, 0x00, //36 空格
- 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, //37 全亮▉
- 0x00, 0x00, 0x36, 0x00, 0x00, //38 冒号:
- 0x00, 0x08, 0x1C, 0x08, 0x00, //39 点.
- 0x08, 0x08, 0x08, 0x08, 0x08 //40 中划线-
- //0x01, 0x3C, 0x42, 0x42, 0x24, //39 摄氏度符号C
- //0x40, 0x40, 0x40, 0x40, 0x40, //40 下划线_
- //0x08, 0x08, 0x3E, 0x08, 0x08, //41 加号+
- //0x22, 0x14, 0x08, 0x14, 0x22, //43 乘号*
- //0x08, 0x08, 0x2A, 0x08, 0x08, //44 除号/
- //0x14, 0x14, 0x14, 0x14, 0x14, //45 等号=
- };
- //显缓区
- #define disp_queue_sum 8 //待显示字符串队列长度
- tU08 disp_queue[disp_queue_sum]; //待显示字符串队列
- //时间系统
- //tU08 TIME_Y; //当前时间"年"(00~99)
- //tU08 TIME_MO; //当前时间"月"(1~12)
- //tU08 TIME_D; //当前时间"日"(1~31)
- //tU08 TIME_W; //当前时间"星期几"(1~7)
- tU08 TIME_H; //当前时间"时"(0~23)
- tU08 TIME_M; //当前时间"分"(0~59)
- tU08 TIME_S; //当前时间"秒"(0~59)
- //无键计时器
- tU08 NOKEY_JSQ; //无键计时器(每秒+1)
- //秒表系统
- tU08 RUN_H; //秒表时间"时"(0~99)
- tU08 RUN_M; //秒表时间"分"(0~59)
- tU08 RUN_S; //秒表时间"秒"(0~59)
- tU08 RUN_MD; //秒表状态(0=停止,1=运行)
- //定时系统
- tU08 TIMER_H; //定时时间"时"(0~23)
- tU08 TIMER_M; //定时时间"分"(0~59)
- tU08 SP_M; //蜂鸣器鸣叫时间设置值(0~99分)(说明:0=定时关闭)
- tU08 SP_RUN; //蜂鸣器鸣叫时间运行值(0~99分)(说明:0=定时关闭)
- //工作模式
- tU08 WK_MODE; //工作模式
- //温度系统
- //tU08 TEMP; //当前温度
- //附加功能
- tU08 FUN_ZDBS; //整点报时(0=禁止,1=使能)
- //tU08 FUN_FZTS; //分钟提示(0=禁止,1=使能)
- /*
- //--------------------------------------------------------
- //延时程序
- //--------------------------------------------------------
- void delay()
- {
- unsigned short i;
- for(i=500; i>0; i--)
- {
- asm ("nop");
- }
- }
- */
- //--------------------------------------------------------
- //延时若干时间
- //入口: 延时时间=i*基本时间
- //--------------------------------------------------------
- void delay_n(tU16 i)
- {
- for ( ; i!=0 ; i-- )
- {
- asm ("nop");
- }
- }
- /*
- //--------------------------------------------------------
- //显示当前时间年
- //--------------------------------------------------------
- void display_TIME_Y()
- {
- disp_queue[0] = TIME_Y / 10; //年
- disp_queue[1] = TIME_Y % 10;
- }
- //--------------------------------------------------------
- //显示当前时间月
- //--------------------------------------------------------
- void display_TIME_MO()
- {
- disp_queue[3] = TIME_MO / 10; //月
- disp_queue[4] = TIME_MO % 10;
- }
- //--------------------------------------------------------
- //显示当前时间日
- //--------------------------------------------------------
- void display_TIME_D()
- {
- disp_queue[6] = TIME_D / 10; //日
- disp_queue[7] = TIME_D % 10;
- }
- */
-
- //--------------------------------------------------------
- //显示当前时间时
- //--------------------------------------------------------
- void display_TIME_H()
- {
- disp_queue[0] = TIME_H / 10; //时
- disp_queue[1] = TIME_H % 10;
- }
- //--------------------------------------------------------
- //显示当前时间分
- //--------------------------------------------------------
- void display_TIME_M()
- {
- disp_queue[3] = TIME_M / 10; //分
- disp_queue[4] = TIME_M % 10;
- }
- //--------------------------------------------------------
- //显示当前时间秒
- //--------------------------------------------------------
- void display_TIME_S()
- {
- disp_queue[6] = TIME_S / 10; //秒
- disp_queue[7] = TIME_S % 10;
- }
- //--------------------------------------------------------
- //显示闹钟TM
- //--------------------------------------------------------
- void display_TM()
- {
- disp_queue[0] = 29; //"T"
- disp_queue[1] = 22; //"M"
- }
- //--------------------------------------------------------
- //显示闹钟时
- //--------------------------------------------------------
- void display_TIMER_H()
- {
- disp_queue[3] = TIMER_H / 10; //时
- disp_queue[4] = TIMER_H % 10;
- }
- //--------------------------------------------------------
- //显示闹钟分
- //--------------------------------------------------------
- void display_TIMER_M()
- {
- disp_queue[6] = TIMER_M / 10; //分
- disp_queue[7] = TIMER_M % 10;
- }
- //--------------------------------------------------------
- //显示闹钟"▉▉"
- //--------------------------------------------------------
- void display_ALL1()
- {
- disp_queue[0] = 37; //"▉"
- disp_queue[1] = 37; //"▉"
- }
- //--------------------------------------------------------
- //显示闹钟"▉▉"
- //--------------------------------------------------------
- void display_ALL2()
- {
- disp_queue[3] = 37; //"▉"
- disp_queue[4] = 37; //"▉"
- }
- //--------------------------------------------------------
- //显示闹钟"▉▉"
- //--------------------------------------------------------
- void display_ALL3()
- {
- disp_queue[6] = 37; //"▉"
- disp_queue[7] = 37; //"▉"
- }
- //--------------------------------------------------------
- //显示分隔符号": :"
- //--------------------------------------------------------
- void display_COL()
- {
- disp_queue[2] = 38; //":"
- disp_queue[5] = 38; //":"
- }
- //--------------------------------------------------------
- //显示分隔符号"- -"
- //--------------------------------------------------------
- void display_LINE()
- {
- disp_queue[2] = 40; //"-"
- disp_queue[5] = 40; //"-"
- }
- //--------------------------------------------------------
- //显示"SET -O"
- //--------------------------------------------------------
- void display_SET()
- {
- disp_queue[0] = 28; //"S"
- disp_queue[1] = 14; //"E"
- disp_queue[2] = 29; //"T"
- disp_queue[4] = 40; //"-"
- disp_queue[5] = 24; //"O"
- }
- //--------------------------------------------------------
- //刷新待显示字符串
- //出口: disp_queue[]=待显示字符串队列
- //--------------------------------------------------------
- void new_display()
- {
- //====根据工作模式判断
- switch( WK_MODE ) //根据工作模式判断
- {
- //case 0: //显示当前时间
- // display_TIME_H(); //时
- // display_TIME_M(); //分
- // display_TIME_S(); //秒
- // display_COL(); //": :"
- // break;
- /*
- case 1: //显示当前日期
- display_TIME_Y(); //年
- display_TIME_MO(); //月
- display_TIME_D(); //日
- display_LINE(); //"- -"
- break;
- case 2: //显示星期几
- disp_queue[0] = 36; //" "
- disp_queue[1] = 32; //"W"
- disp_queue[2] = 14; //"E"
- disp_queue[3] = 14; //"E"
- disp_queue[4] = 20; //"K"
- disp_queue[5] = 36; //" "
- disp_queue[6] = TIME_W % 10; //星期几
- disp_queue[7] = 36; //" "
- break;
- case 3: //显示温度
- disp_queue[0] = 29; //"T"
- disp_queue[1] = 14; //"E"
- disp_queue[2] = 22; //"M"
- disp_queue[3] = 25; //"P"
- disp_queue[4] = 36; //" "
- disp_queue[5] = TEMP / 10; //当前温度
- disp_queue[6] = TEMP % 10;
- disp_queue[7] = 39; //"摄氏度符号C"
- break;
- */
- case 4: //显示闹钟时间
- display_TM(); //"TM"
- disp_queue[2] = 36; //" "
- display_TIMER_H(); //"定时时间"时""
- disp_queue[5] = 38; //":"
- display_TIMER_M(); //定时时间"分"
- break;
- case 5: //显示秒表时间
- disp_queue[0] = RUN_H / 10; //时
- disp_queue[1] = RUN_H % 10;
- disp_queue[2] = 39; //"."
- disp_queue[3] = RUN_M / 10; //分
- disp_queue[4] = RUN_M % 10;
- disp_queue[5] = 39; //"."
- disp_queue[6] = RUN_S / 10; //秒
- disp_queue[7] = RUN_S % 10;
- break;
- case 6: //显示作者信息"zhangjun"
- disp_queue[0] = 35; //"Z"
- disp_queue[1] = 17; //"H"
- disp_queue[2] = 10; //"A"
- disp_queue[3] = 23; //"N"
- disp_queue[4] = 16; //"G"
- disp_queue[5] = 19; //"J"
- disp_queue[6] = 30; //"U"
- disp_queue[7] = 23; //"N"
- break;
- case 7: //显示当前时间"时"
- display_TIME_H(); //时
- display_ALL2(); //"▉▉"
- display_ALL3(); //"▉▉"
- display_COL(); //": :"
- break;
- case 8: //显示当前时间"分""秒"
- display_ALL1(); //"▉▉"
- display_TIME_M(); //分
- display_TIME_S(); //秒
- display_COL(); //": :"
- break;
- /*
- case 9: //显示当前时间"年"
- display_TIME_Y(); //年
- display_ALL2(); //"▉▉"
- display_ALL3(); //"▉▉"
- display_LINE(); //"- -"
- break;
- case 10: //显示当前时间"月"
- display_ALL1(); //"▉▉"
- display_TIME_MO(); //月
- display_ALL3(); //"▉▉"
- display_LINE(); //"- -"
- break;
- case 11: //显示当前时间"日"
- display_ALL1(); //"▉▉"
- display_ALL2(); //"▉▉"
- display_TIME_D(); //日
- display_LINE(); //"- -"
- break;
- */
- case 12: //显示定时时间"时"
- display_TM(); //"TM"
- disp_queue[2] = 36; //" "
- display_TIMER_H(); //"定时时间"时""
- disp_queue[5] = 38; //":"
- display_ALL3(); //"▉▉"
- break;
- case 13: //显示定时时间"分"
- display_TM(); //"TM"
- disp_queue[2] = 36; //" "
- display_ALL2(); //"▉▉"
- disp_queue[5] = 38; //":"
- display_TIMER_M(); //定时时间"分"
- break;
- case 14: //显示蜂鸣器鸣叫时间
- display_TM(); //"TM"
- disp_queue[2] = 36; //" "
- disp_queue[3] = 28; //"S"
- disp_queue[4] = 25; //"P"
- disp_queue[5] = 38; //":"
- disp_queue[6] = SP_M / 10; //蜂鸣器鸣叫时间
- disp_queue[7] = SP_M % 10;
- break;
- case 15: //显示整点报时功能
- display_SET(); //"SET -O"
- disp_queue[3] = 1; //"1"
- if ( FUN_ZDBS != 0 )
- {
- disp_queue[6] = 23; //"N"
- disp_queue[7] = 36; //" "
- }
- else
- {
- disp_queue[6] = 15; //"F"
- disp_queue[7] = 15; //"F"
- }
- break;
- /*
- case 16: //显示分钟提示功能
- display_SET(); //"SET -O"
- disp_queue[3] = 2; //"2"
- if ( FUN_FZTS != 0 )
- {
- disp_queue[6] = 23; //"N"
- disp_queue[7] = 36; //" "
- }
- else
- {
- disp_queue[6] = 15; //"F"
- disp_queue[7] = 15; //"F"
- }
- break;
- */
- default: //以上条件都不满足时,显示当前时间
- display_TIME_H(); //时
- display_TIME_M(); //分
- display_TIME_S(); //秒
- display_COL(); //": :"
- break;
- }
-
- }
- //--------------------------------------------------------
- //显示扫描程序
- //入口: disp_queue[]=待显示字符串队列
- //--------------------------------------------------------
- void display_cnt()
- {
- tU08 i;
- tU08 j;
- //====延时等待
- P1OUT &= 0x80; //清除显示
- delay_n(15000);
-
- //====扫描显示队列中的字符
- for (i=0; i {
- //====显示当前字符
- for (j=0; j<5; j++) //j=列号(0~4)
- {
- P1OUT |= LCD_TAB_A[ disp_queue[i] * 5 + j ]; //送显当前字符的当前列
- delay_n(150); //列显示延时
- P1OUT &= 0x80; //清除显示
- delay_n(10); //列间隔延时
- }
- //====字符间隔延时
- delay_n(250);
- }
- }
- //--------------------------------------------------------
- //IO初始化程序(复用口配置给key)
- //--------------------------------------------------------
- void IO_init_key()
- {
- if (NOKEY_JSQ >= 60) //当无键计时>60秒,则禁止按键唤醒,必须通过惯性开关唤醒
- {
- P1OUT = 0x10; //P1口输出状态
- P1DIR = 0xEF; //P1口IO状态(0=输入,1=输出)
- //P1REN = 0x00; //P1口上拉使能(0=禁止,1=使能)
-
- P1IE |= 0x10; // P14 中断使能
-
- }
- else
- {
- P1OUT = 0x70; //P1口输出状态
- P1DIR = 0x8F; //P1口IO状态(0=输入,1=输出)
- //P1REN = 0x00; //P1口上拉使能(0=禁止,1=使能)
-
- P1IE |= 0x70; // P16~P14 中断使能
- }
- P1IES |= 0x00; // P1口触发边沿选择 (0=上升沿有效,1=下降沿有效)
- P1IFG = 0x00; // IFG cleared
- }
- //--------------------------------------------------------
- //IO初始化程序(复用口配置给led)
- //--------------------------------------------------------
- void IO_init_led()
- {
- P1OUT = 0x00; //P1口输出状态
- P1DIR = 0xFF; //P1口IO状态(0=输入,1=输出)
- //P1REN = 0x00; //P1口上拉使能(0=禁止,1=使能)
- //P1IE |= 0x00; // P16~P14 中断禁止
- //P1IES |= 0x00; // P1口触发边沿选择 (0=上升沿有效,1=下降沿有效)
- //P1IFG = 0x00; // IFG cleared
- }
- //--------------------------------------------------------
- //参数初始化程序
- //--------------------------------------------------------
- void parameter_init()
- {
- //TIME_Y = 6; //当前时间"年"(00~99)
- //TIME_MO =1; //当前时间"月"(1~12)
- //TIME_D =1; //当前时间"日"(1~31)
- TIME_H =12; //当前时间"时"(0~23)
- TIME_M = 0; //当前时间"分"(0~59)
- TIME_S = 0; //当前时间"秒"(0~119)
- RUN_H = 0; //秒表时间"时"(0~23)
- RUN_M = 0; //秒表时间"分"(0~59)
- RUN_S = 0; //秒表时间"秒"(0~119)
- RUN_MD = 0; //秒表状态(0=停止,1=运行)
-
- TIMER_H = 7; //定时时间"时"(0~23)
- TIMER_M = 15; //定时时间"分"(0~59)
- SP_M = 10; //蜂鸣器鸣叫时间设置值(0~99分)(说明:0=定时关闭)
- //SP_RUN = 0; //蜂鸣器鸣叫时间运行值
-
- WK_MODE = 0; //工作模式
- FUN_ZDBS = 1; //整点报时(0=禁止,1=使能)
- //FUN_FZTS = 0; //分钟提示(0=禁止,1=使能)
- }
- //--------------------------------------------------------
- //初始化程序
- //--------------------------------------------------------
- void init()
- {
- WDTCTL = WDTPW + WDTHOLD; //停止WDT
-
- IO_init_key(); //IO初始化程序(复用口配置给key)
- parameter_init(); //参数初始化程序
- //定时器中断设置
- CCTL0 = CCIE; //CCR0 中断使能
- CCR0 = 32768-1; //定时器计数上限
- TACTL = TASSEL_1 + MC_1; //ACLK, contmode
- //定时器A时钟源选择: 1 - ACLK
- //定时器A计数模式: 1 - Up to CCR0
- }
- //--------------------------------------------------------
- //主程序
- //--------------------------------------------------------
- void main(void)
- {
-
- init(); //====初始化
-
- _BIS_SR(LPM3_bits + GIE); //Enter LPM3 w/ interrupt
- /*
- //====循环主体
- while (1) // Loop
- {
- //asm ( "nop" ) ;
- if (0x80 & P1IN) //如果P1.7=1
- {
- P1OUT &= 0x80; //清除显示
- }
- else //否则
- {
- new_display(); //刷新待显示字符串
- display_cnt(); //显示扫描程序
-
- }
- }
- */
-
- }
- //--------------------------------------------------------
- //蜂鸣器控制程序
- //--------------------------------------------------------
- void SP_CNT()
- {
- P1OUT |= 0x80; //开蜂鸣器
- delay_n(20000); //鸣叫延时
- P1OUT &= 0x7F; //关蜂鸣器
- }
- //--------------------------------------------------------
- //Timer_A3 Interrupt Vector (TAIV) handler
- //Timer_A3 中断服务程序
- //说明: 根据TAIV寄存器判断,执行不同的中断响应
- //中断频率=32768/(32768) = 1Hz
- //--------------------------------------------------------
- // Timer A0 interrupt service routine
- #pragma vector=TIMERA0_VECTOR
- __interrupt void Timer_A (void)
- {
- //时钟系统计时
- TIME_S ++;
- if ( TIME_S > 59 )
- {
- TIME_S = 0 ;
- //蜂鸣器鸣叫时间运行值!=0时,运行值-1
- if ( SP_RUN !=0 )
- {
- SP_RUN--;
- }
- TIME_M ++ ;
- if ( TIME_M > 59 )
- {
- TIME_M = 0 ;
-
- if ( FUN_ZDBS != 0 ) //整点报时功能
- {
- //SP_RUN = SP_RUN + 1; //鸣叫一分钟
- SP_CNT(); //鸣叫一声
- delay_n(60000); //鸣叫延时
- SP_CNT(); //鸣叫一声
- }
- TIME_H ++ ;
- if ( TIME_H > 23 )
- {
- TIME_H = 0 ;
-
- /*
- TIME_D ++ ;
- if ( TIME_D > 31)
- {
- TIME_D = 1 ;
- TIME_MO ++ ;
- if ( TIME_MO > 12 )
- {
- TIME_MO = 1 ;
- TIME_Y ++ ;
- if ( TIME_Y > 99 )
- {
- TIME_Y = 0 ;
- }
- }
- }
- */
-
- }
- }
- }
- //当当前时间=定时时间时,开始鸣叫
- if (( TIME_H == TIMER_H ) && (TIME_M == TIMER_M) && ( TIME_S < 10))
- {
- SP_RUN = SP_M;
- }
- //蜂鸣器鸣叫时间运行值!=0时,鸣叫
- if ( SP_RUN != 0 )
- {
- SP_CNT(); //鸣叫一声
- //delay_n(40000); //鸣叫延时
- //SP_CNT(); //鸣叫一声
- }
- //秒表系统计时
- if (RUN_MD != 0 )
- {
- RUN_S ++;
- if ( RUN_S > 59 )
- {
- RUN_S = 0 ;
- RUN_M ++ ;
- if ( RUN_M > 59 )
- {
- RUN_M = 0 ;
- RUN_H ++ ;
- if ( RUN_H > 99 )
- {
- RUN_H = 0 ;
- }
- }
- }
- }
- //无键计时
- if (NOKEY_JSQ >= 60) //当无键计时>60秒,则执行
- {
- WK_MODE = 0 ; //切换工作模式
-
- }
- else
- {
- NOKEY_JSQ ++ ; //无键计时器(每秒+1)
- }
-
-
- //
- IO_init_key(); //IO初始化程序(复用口配置给key)
- }
- //--------------------------------------------------------
- //位置信号处理功能
- //--------------------------------------------------------
- void wz_fun()
- {
- SP_RUN = 0; //蜂鸣器鸣叫时间运行值=0,取消鸣叫
- NOKEY_JSQ = 0 ; //无键计时器=0
- IO_init_led(); //IO初始化程序(复用口配置给led)
- new_display(); //刷新待显示字符串
- display_cnt(); //显示扫描程序
- }
-
- //--------------------------------------------------------
- //按键A信号处理功能
- //--------------------------------------------------------
- void key_a_fun()
- {
- SP_CNT(); //鸣叫一声
- NOKEY_JSQ = 0 ; //无键计时器=0
- //====根据工作模式判断
- switch( WK_MODE ) //根据工作模式判断
- {
- case 0: //显示当前时间
- WK_MODE = 4 ; //切换工作模式
- break;
- /*
- case 1: //显示当前日期
- WK_MODE = 2 ; //切换工作模式
- break;
- case 2: //显示星期几
- WK_MODE = 3 ; //切换工作模式
- break;
- case 3: //显示温度
- WK_MODE = 4 ; //切换工作模式
- break;
- case 4: //显示闹钟时间
- RUN_S = 0 ; //秒表时间"秒"(0~59)
- RUN_M = 0 ; //秒表时间"分"(0~59)
- RUN_H = 0 ; //秒表时间"时"(0~23)
- WK_MODE = 5 ; //切换工作模式
- break;
- case 5: //显示秒表时间
- WK_MODE = 6 ; //切换工作模式
- break;
- */
- case 6: //显示作者信息
- WK_MODE = 0 ; //切换工作模式
- break;
- case 7: //显示当前时间"时"
- if ( TIME_H < 23 ) //时+1(0~23)
- {
- TIME_H ++ ;
- }
- else
- {
- TIME_H = 0 ;
- }
- break;
- case 8: //显示当前时间"分""秒"
- TIME_S = 0; //秒=0
- if ( TIME_M < 59 ) //分+1(0~59)
- {
- TIME_M ++ ;
- }
- else
- {
- TIME_M = 0 ;
- }
- break;
- /*
- case 9: //显示当前时间"年"
- if ( TIME_Y < 99 ) //年+1(0~99)
- {
- TIME_Y ++ ;
- }
- else
- {
- TIME_Y = 0 ;
- }
- break;
- case 10: //显示当前时间"月"
- if ( TIME_MO < 12 ) //月+1(1~12)
- {
- TIME_MO ++ ;
- }
- else
- {
- TIME_MO = 1 ;
- }
- break;
- case 11: //显示当前时间"日"
- if ( TIME_D < 31 ) //日+1(1~31)
- {
- TIME_D ++ ;
- }
- else
- {
- TIME_D = 1 ;
- }
- break;
- */
- case 12: //显示定时时间"时"
- if ( TIMER_H < 23 ) //时+1(0~23)
- {
- TIMER_H ++ ;
- }
- else
- {
- TIMER_H = 0 ;
- }
- break;
- case 13: //显示定时时间"分"
- if ( TIMER_M < 59 ) //分+1(0~59)
- {
- TIMER_M ++ ;
- }
- else
- {
- TIMER_M = 0 ;
- }
- break;
- case 14: //显示蜂鸣器鸣叫时间
- if ( SP_M < 99 ) //蜂鸣器鸣叫时间+1(0~59)
- {
- SP_M ++ ;
- }
- else
- {
- SP_M = 0 ;
- }
- break;
- case 15: //显示整点报时功能
- FUN_ZDBS ^= 0x01; //整点报时功能取反
- FUN_ZDBS &= 0X01;
- break;
- /*
- case 16: //显示分钟提示功能
- FUN_FZTS ^= 0x01; //分钟提示功能取反
- FUN_FZTS &= 0X01;
- break;
- */
- default: //以上条件都不满足时,显示当前时间
- WK_MODE ++ ; //切换工作模式
- break;
- }
- }
- //--------------------------------------------------------
- //按键B信号处理功能
- //--------------------------------------------------------
- void key_b_fun()
- {
- SP_CNT(); //鸣叫一声
- NOKEY_JSQ = 0 ; //无键计时器=0
- //====根据工作模式判断
- switch( WK_MODE ) //根据工作模式判断
- {
- case 0: //显示当前时间
- WK_MODE = 7 ; //切换工作模式
- break;
- /*
- case 1: //显示当前日期
- WK_MODE = 9 ; //切换工作模式
- break;
- case 2: //显示星期几
- break;
- case 3: //显示温度
- TEMP ++ ; //当前温度+1
- break;
- */
- case 4: //显示闹钟时间
- WK_MODE = 12 ; //切换工作模式
- break;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
http://www.51hei.com/bbs/dpj-88797-1.html
|
|