/* 2010/2/4 PIC-16F819 Idea from JA0BAS. LED_Lingtype Display BY M.Kikuchi Last Mod 2010/2/10 */ char LC1,LC2,LC3,Icnt,ITEMP; char LED0,LED1,LED2,TIME_SEC; unsigned int TIME_M; char to_7LED(char S_Data) { //数から7セグメントLED Dataへ switch (S_Data & 0x0F) { case 0: return(0x3f);break; case 1: return(0x06);break; case 2: return(0x5b);break; case 3: return(0x4f);break; case 4: return(0x66);break; case 5: return(0x6d);break; case 6: return(0x7d);break; case 7: return(0x07);break; case 8: return(0x7f);break; case 9: return(0x6f); } } void interrupt() { //0.5mSecで割り込み表示 if(PIR1.TMR2IF==1) PIR1.TMR2IF=0; Icnt++; TIME_M++; TRISA.F3=1; //dp off PORTB=0xFF; //LED all off switch(Icnt) { case 1: //Bit0 set ITEMP=LED0; if(ITEMP.F0==1) ITEMP.F7=1; TRISB = (~ITEMP & 0b11111110); PORTB=0b11111110; break; case 2: //Bit1 set ITEMP=LED1; if(ITEMP.F1==1) ITEMP.F7=1; TRISB = (~ITEMP & 0b11111101); PORTB=0b11111101; break; case 3: //Bit2 set Icnt=0; ITEMP=LED2; if ((TIME_SEC & 1)==0){ //dp set TRISA.F3=0; //output PORTA.F3=1; } if(ITEMP.F2==1) ITEMP.F7=1; TRISB = (~ITEMP & 0b11111011); PORTB=0b11111011; } //以下桁上げ処理 0.5mS if(TIME_M==974){ //M=976.5 ICにより調整 TIME_M=0; TIME_SEC++; if(TIME_SEC==120){ //0.5*120=1Sec TIME_SEC=0; LC1++; if(LC1==10){ LC1=0; LC2++; if(LC2==6){ LC2=0; LC3++; if(LC3==10) LC3=0; LED2=to_7LED(LC3); } LED1=to_7LED(LC2); } LED0=to_7LED(LC1); } } } void main() { OSCCON=0x60; //4MHz // CMCON =0x07; //for PIC16F88 // ANSEL =0; //for PIC16F88 TRISA =0b00000111; TRISB =0; INTCON.PEIE=1; T2CON=0x0C; //1/2*256 0.5mS PIE1.TMR2IE=1; //Pre=1/1 Post=1/1 // LED DATA LC1=0; LC2=0; LC3=0; LED0=0x3F; LED1=0; LED2=0; TIME_M=0; TIME_SEC=0; Icnt=0; INTCON.GIE=1; //Interrupt ON while(1){ //Loop } }