ソース
//3dig Timer
//sw2:start/stop
//sw3: inc time
//sw4: dec time
#include <16f873a.h>
#fuses HS,NOWDT,NOLVP,NOPROTECT,NOCPD,NOBROWNOUT,
#use delay(CLOCK=20000000) //クロック20MHz
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#ROM 0x2100 = {60,0}
//#ROM 0x2110 = {"999 timer"}
int dgt,count;
long st2;
int st1,st0,ptn;
int swa,swb;
int seg_data[]={0x7E,0x0C,0xB6,0x9E,0xCC,0xDA,
0xFA,0xE,0xFE,0xCE};
long uptime;
long val;
int prd;
int ontime,secLed;
int bsw2,bsw3,bsw4;
long ms10;
long loopinc,loopdec;
#int_rtcc
void rtcc_isr()
{
ms10++;
if(ms10 % 100 == 0) secLed=!secLed;
if(ms10==600){//6sec
uptime--;
ms10=0;
if(uptime==0) {
ontime=0;
//
}
}
set_timer0(prd);
}
void setLED(int pat);
void clrLED();
void buzzer();
void main()
{
val=0;
count=0;
ms10=0;
bsw2=bsw3=bsw4=0;
set_tris_a(0b000000);
set_tris_b(0b11000000);
set_tris_c(0b11111000);
output_bit(pin_b5,0);//HC174 clock
//タイマ0のモード設定
setup_counters(RTCC_INTERNAL,RTCC_DIV_256);
ontime=0;
loopdec=loopinc=0;
//uptime = read_eeprom(1)*256+read_eeprom(0);//last time
uptime=60;
//prd=60;//195*51.2=10,000 255-195=60
enable_interrupts(GLOBAL);
while(1){
//read sw
port_b_pullups(true);
output_bit(pin_a1,0);//set HC174
output_bit(pin_a0,1);
output_bit(pin_b5,1);//clock Hc174
output_bit(pin_b5,0);
swa = input_b();
port_b_pullups(true);
output_bit(pin_a1,1);//set HC174
output_bit(pin_a0,0);
output_bit(pin_b5,1);//clock Hc174
output_bit(pin_b5,0);
swb = input_b();
if(uptime>999) uptime=100;
val=uptime;
//valを桁に分解
if(count==0){
st2 = val/100;
st1 = val/10-st2*10;
st0 = val%10;
//val++;
}
for(dgt=0;dgt<4;dgt++){
if(dgt==0) {
ptn=seg_data[st0];
setLed(ptn);
output_bit(pin_c0,1);
}
if(dgt==1) {
ptn=seg_data[st1];
bit_set(ptn,0);//dp
setLed(ptn);
output_bit(pin_c1,1);
}
if(dgt==2) {
ptn=seg_data[st2];
setLed(ptn);
output_bit(pin_c2,1);
}
if(dgt==3) {
ptn=0;//LED clear
if(!bit_test(swa,7)){
bit_set(ptn,4);
if(bsw4) {
uptime --;
bsw4=0;
loopdec=0;
};
loopdec++;
if(loopdec>100){
if(loopdec % 2 == 0 && uptime >5 ) uptime--;
}
}
else {
bit_clear(ptn,4);//sw4 setLED4
bsw4=1;
loopdec=0;
};
if(!bit_test(swa,6) ){//check sw3,4
bit_set(ptn,3);
if(bsw3) {
uptime += 1;
bsw3=0;
loopinc=0;
};
loopinc++;
if(loopinc>100){
if(loopinc % 2 == 0) uptime++;
if(uptime>999) uptime=999;
};
}
else {
bit_clear(ptn,3);//sw3 setLED3
bsw3=1;
loopinc=0;
}
if(!bit_test(swb,7) ){//check sw1
bit_set(ptn,2);
if(bsw2){
ontime=!ontime;
if(ontime){//タイマースタート
set_timer0(prd);
write_eeprom(0x2100,make8(uptime,0));
write_eeprom(0x2101,make8(uptime,1));
write_eeprom(0x2110,0x77);
enable_interrupts(INT_TIMER0);
}
else {
disable_interrupts(INT_TIMER0);
};
bsw2=0;
};
}
else {
bit_clear(ptn,2);//sw2 setLED2
bsw2=1;
};
if(secLed) bit_set(ptn,5);
else bit_clear(ptn,5);
setLed(ptn);
output_bit(pin_a4,1);
}
delay_ms(4);
clrLED();
output_bit(pin_c0,0);
output_bit(pin_c1,0);
output_bit(pin_c2,0);
output_bit(pin_a4,0);
//output_bit(pin_a5,0);
//delay_ms(1);
}//for
if(uptime==0) {
disable_interrupts(INT_TIMER0);
buzzer();
buzzer();
buzzer();
uptime = read_eeprom(0x2101)*256+read_eeprom(0x2100);
//uptime=70;
}
//count++;
//if(count ==10) count=0;
}//while
}
void setLED(int pat){
output_bit(pin_b0,bit_test(pat,1));//a,led1
output_bit(pin_b1,bit_test(pat,2));//b,led2
output_bit(pin_b2,bit_test(pat,3));//c,led3
output_bit(pin_b3,bit_test(pat,4));//d,led4
output_bit(pin_a0,bit_test(pat,5));//e,led5
output_bit(pin_a1,bit_test(pat,6));//f,led6
output_bit(pin_a2,bit_test(pat,7));//g,led7
output_bit(pin_a3,bit_test(pat,0));//dp,led8
return;
}
void clrLED(){
output_bit(pin_b0,0);
output_bit(pin_b1,0);
output_bit(pin_b2,0);
output_bit(pin_b3,0);
output_bit(pin_a0,0);
output_bit(pin_a1,0);
output_bit(pin_a2,0);
output_bit(pin_a3,0);
}
void buzzer(){
output_bit(pin_b3,1);//Set Buzzer
output_bit(pin_b5,1);//clock Hc174
output_bit(pin_b5,0);
delay_ms(500);
output_bit(pin_b3,0);//Set Buzzer
output_bit(pin_b5,1);//clock Hc174
output_bit(pin_b5,0);
delay_ms(300);
}