#include <16F628A.h> #FUSES NOWDT //No Watch Dog Timer #FUSES INTRC_IO //Internal RC Osc, no CLKOUT #FUSES PUT //Power Up Timer #FUSES NOPROTECT //Code not protected from reading #FUSES NOBROWNOUT //No brownout reset #FUSES NOMCLR //Master Clear pin used for I/O #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O #FUSES NOCPD //No EE protection #use delay(clock=4000000) #byte INTCON = 0x0b // Так мне привычнее - напрямую с регистрами работать #byte PORTA = 0x05 #byte PORTB = 0x06 #byte PIR1 = 0x0C #byte TRISA = 0x85 #byte TRISB = 0x86 #byte PCON = 0x86 #byte OPTION = 0x81 #use fast_io(A) // Работа с портами без переключения #use fast_io(B) // каждый раз регистров TRIS //unsigned char count; unsigned char Segment1,Segment2,Segment3,Segment4; //Отображаемая цифра unsigned char ShowSegment; //Текущая отображаемая цифра unsigned char MinE,MinD,SecE,SecD,mSec; // Состояние времени //unsigned int16 Shagov; // Количество шагов за сеанс unsigned char Shagov; unsigned char pressButton,pressCLK; unsigned char ShagFlag=0; // Защита от повторного счета unsigned char ValueToSegment(unsigned char val) { char res=242; switch(val) { case 1: res=0b11010110; break; case 2: res=0b01001000; break; case 3: res=0b01010000; break; case 4: res=0b10010010; break; case 5: res=0b00110000; break; case 6: res=0b10100000; break; case 7: res=0b01010110; break; case 8: res=0b00000000; break; case 9: res=0b00010010; break; case 0: res=0b00000100; break; case 83: res=0b00110000; break; // S case 69: res=0b00101000; break; // E case 114: res=0b11101010; break; // r case 71: res=0b00100100; break; // G case 80: res=0b00001010; break; // P case 32: res=0b11111110; break; default: res=0; } return res; } void main() { //|RTCC_DIV_16 setup_timer_0(RTCC_INTERNAL); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DISABLED,0,1); setup_comparator(NC_NC_NC_NC); setup_vref(FALSE); enable_interrupts(INT_TIMER0); enable_interrupts(GLOBAL); setup_oscillator(False); set_tris_a(0b00010000); set_tris_b(0x00); output_a(0xFF); output_b(0); OUTPUT_HIGH(PIN_B1); OUTPUT_HIGH(PIN_A5); OUTPUT_HIGH(PIN_A6); Shagov=0; Restrt:; // Приветствие Segment1=ValueToSegment('S'); Segment2=ValueToSegment('E'); Segment3=ValueToSegment('r'); Segment4=ValueToSegment('G'); Segment4|= 0b00000001; Delay_ms(32); while (pressButton==0) Delay_Ms(10); //Ждем отпускания кнопки while (pressButton>0) // Отображение количества шагов { //Если нажали кнопку, выходим unsigned int16 Shag; unsigned char Shag1,Shag10,Shag100,Shag1000=0; Shag=Shagov; Shag1=Shag10=Shag100=Shag1000=0; { while(Shag>999) { Shag1000++; Shag=Shag-1000; } while(Shag>99) { Shag100++; Shag=Shag-100; } while(Shag>9) { Shag10++; Shag=Shag-10; } while(Shag>0) { Shag1++; Shag--; } } Segment1=ValueToSegment(Shag1000); Segment2=ValueToSegment(Shag100); Segment3=ValueToSegment(Shag10); Segment4=ValueToSegment(Shag1); // Delay_Ms(1); } Segment1=ValueToSegment('8'); Segment2=ValueToSegment('P'); Segment3=ValueToSegment('E'); Segment4=ValueToSegment(' '); while (pressButton==0) Delay_Ms(10); //Ждем отпускания кнопки PCON&= 0xF7; //Пониженная частота while (pressButton>0)// бесконечный цикл отображения времени { Segment1=ValueToSegment(MinD); Segment2=ValueToSegment(MinE); Segment3=ValueToSegment(SecD); Segment4=ValueToSegment(SecE); Segment2|= 0b00000001; Delay_Ms(10); } PCON|= 0x8; //Нормальная частота GoTo Restrt; } #int_TIMER0 // unimportant. void TIMER0_isr(void ) { /* PORTB=0b11111010; //Тест #asm nop nop nop nop RLF PORTA, 1 ;Сдвигаем влево nop nop nop nop btfsc PORTA,0 goto next btfsc PORTA,1 goto next btfsc PORTA,2 goto next btfsc PORTA,3 goto next nop nop nop nop movlw 0b00000001 movwf PORTA nop nop nop nop next: #endasm */ // Отображение цифры //PORTA|=0b10000000; //Убираем "точку" PORTA=PORTA<<1; #asm nop nop nop nop nop #endasm if (PORTA>8) PORTA=1; if (PORTA==0) PORTA=1; PORTB=0b10101010; }