📄 timer.c
字号:
/*---------------------------------------------------------------
modify date: 2005-01-03
modify context: 1. add a input pin to check cover close
any timer if cover opened,cut off power
2. change key locate
run key-->add key
add key-->sub key
sub key-->run key
----------------------------------------------------------------*/
/*--------------modify note---------------------------------
modify by : lcc
modify date: 2005-01-24
modify context: change timer unit from 1 minute to 0.1 minute
-------------------------------------------------------------*/
#include <12f629.h> //包含头文件
#use delay(clock=32768) //使用晶振32.768kHz
#fuses NOWDT,XT, PUT, PROTECT //不使用看门狗,使用外部晶振,代码保护
#define TIME_LOAD 178 //256-(10000/128) 10mS 定时器装载时间为10mS
/*
#define KEY_CS PIN_A2
#define DIGIT0 PIN_A0
#define DIGIT1 PIN_A1
#define POWERCTRL PIN_A3
#define COVER_CLOSE PIN_A4 */
#define LED PIN_A0
#define MOTOR_Control PIN_A1
#define SPRING_SWITCH PIN_A2
//#define POWERCTRL PIN_A3
//#define COVER_CLOSE PIN_A4
/*
#define KEY_STOP 0x02
#define KEY_ADD 0x04
#define KEY_SUB 0x08
#define KEY_RUN 0x01 */
/*
// data address in eeprom
#define FLAG_ADDR 0x01
#define DATA_ADDR 0x02 */
/*
#define IDLE 0
#define RUN 1
#define SET 2
#define poweron output_low(POWERCTRL)
#define poweroff output_high(POWERCTRL)
*/
byte sys10mscnt,sys1scnt,sys1mincnt,last01mincnt,sys01mincnt;
/*
byte digit,timer_set,worktime;
byte keycode,lastkey,keyage;
byte sys_status;
byte cover_status;
byte const LED_TBL[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; */
#int_rtcc //Timer0 溢出
isr(){
byte keytemp;
set_timer0(TIME_LOAD); //重装载Timer0 的值
if(--sys10mscnt==0){ //sys10mscnt自减后为0吗?为0,则将100送给sys10mscnt
sys10mscnt=100; //执行到此,则为1秒
if(++sys1scnt>=6){ //sys1scnt自动加1后为6吗?为6,则将sys1scnt清0
sys1scnt=0; //执行到此,则为1分钟
if(++sys01mincnt>=6){//sys01mincnt自动加1后为6吗? 为6,则将sys01mincnt清0
//sys01mincnt++; //sys01mincnt自动加1,指示当前的分钟值
sys01mincnt=0;
output_high(MOTOR_Control);//马达转动;
}
}
}
}
void main()
{
unsigned char temp;
unsigned char inpcnt = 0;
disable_interrupts(GLOBAL);
digit = 0;
keycode = 0xff;
lastkey = 0xff;
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_128);
sys_status = IDLE;
set_timer0(TIME_LOAD);
#use delay(clock=4000000)
delay_ms(10);
temp=read_EEPROM(FLAG_ADDR);
if(temp!=0xaa){
write_EEPROM(FLAG_ADDR,0xaa);
write_EEPROM(DATA_ADDR,0x00);
}
// READ SET TIMER
timer_set=read_EEPROM(DATA_ADDR);
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);
set_tris_a(0x14);
set_tris_b(0);
output_a(0x10);
poweroff;
sys_status=IDLE;
cover_status = 0;
sys10mscnt=100;
while(1){
if (keycode!=0xff){
//have key press,then key handle
if(keycode&KEY_STOP){
if(sys_status==SET){
disable_interrupts(GLOBAL);
write_EEPROM(DATA_ADDR,timer_set);
enable_interrupts(GLOBAL);
}
sys_status=IDLE;
//OFF POWER
poweroff;
}
else if(sys_status!=RUN){
if (keycode&KEY_RUN){
if(sys_status==SET){
disable_interrupts(GLOBAL);
write_EEPROM(DATA_ADDR,timer_set);
enable_interrupts(GLOBAL);
}
if (cover_status){
sys10mscnt = 100;
sys1scnt=0;
//sys1mincnt=0;
sys01mincnt=0;
// sys1mincnt =0;
last01mincnt = 0;
worktime=0;
sys_status=RUN;
poweron;
}
}
else if (keycode&KEY_ADD){
if(timer_set<99){
timer_set++;
sys_status=SET;
}
}
else if (keycode&KEY_SUB){
if(timer_set>0){
timer_set--;
sys_status=SET ;
}
}
}
keycode = 0xff;
}
if(sys_status==RUN){
if(sys01mincnt!=last01mincnt){
last01mincnt=sys01mincnt;
if(sys01mincnt>=timer_set){
sys_status=IDLE;
//OFF POWER
poweroff;
}
}
else{poweron;}
}
//cover status check
if (cover_status){
if(!input(COVER_CLOSE)){
if(++inpcnt>100){
cover_status=0;
if(sys_status==RUN){
sys_status=IDLE;
//OFF POWER
poweroff;
}
inpcnt=0;
}
}
else
inpcnt=0;
}
else{
if(input(COVER_CLOSE)){
if(++inpcnt>100){
cover_status=1;
inpcnt=0;
}
}
else
inpcnt=0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -