'************************************************************************* '**************************************************************** '* Name : UNTITLED.BAS '* Author : alex '* Notice : Счётчик импульсов (четыре разряда, 7-сег индикатор '* : Микроеонтроллер PIC16F84A. Кнопка на PORTB.7 '* :индикатор: '* :portb.0 = A '* :portb.1 = B '* :portb.2 = c '* :portb.3 = D '* :portb.4 = E '* :portb.5 = F '* :portb.6 = G '* :portb.7 = кнопка '* Date : 25.9.2010 '* Version : 1.0 '* Notes : '* : '**************************************************************** ' DEFINITIONS @ device pic16F84A,xt_osc define OSC 4 Cnt VAR WORD ' Cnt is a WORD variable Digit VAR Byte odin var byte dva var byte tri var byte chetire var byte ' Digit is a byte variable Pattern VAR Byte ' Pattern is a byte variable Digit1 VAR PORTA.0 ' Digit 1 enable bit Digit2 VAR PORTA.1 ' Digit 2 enable bit digit3 var PORTA.2 digit4 var porta.3 Pbutton VAR PORTB.7 ' Push button is bit 7 of PORTB i VAR Byte ' i is a byte variable ' ' START OF MAIN PROGRAM ' 'CMCON = 7 ' RA0-RA3 are digital I/O TRISA = 0 ' все ножки порта на выход TRISB = $80 ' Bit 7 PORTB сделать входом, а остальные ножки ' 'выходами ' Enable TMR0 timer interrupts ' INTCON = %00100000 ' Разрешить прерывания от TMR0 OPTION_REG = %00000111 ' Настраиваем prescale TMR0 = 100 ' Загружаем регистр TMR0 ON INTERRUPT GOTO ISR INTCON = %10100000 ' Enable Interrupts LOOP: Cnt = 0 nxt: i =0 if portb.7 = 1 then nxt Cnt = Cnt + 1 ' Инкрементируем переменную CNT '############################################################################## digit = cnt dig 3 'Считать содержимое 4 разряда и присвоить переменной Digit gosub convrt chetire = pattern digit = cnt dig 2 ' -/-/-/- gosub convrt tri = pattern Digit = Cnt DIG 1 ' Считать содержисмое 2 разряда и присвоить переменной Digit gosub convrt dva = pattern Digit = Cnt DIG 0 'Считать содержимое 1 разряда и присвоить переменной Digit gosub convrt odin = pattern for i = 1 to 999 pauseus 750 next if cnt = 9999 then loop ' После появления на табло 9999 показания сбрасываются в 0000 'и счёт начинается сначала goto nxt disable isr: '(ISR)Это - Подпрограмма Обработки Прерывания! Программа переходит к этой метке ' всякий раз, когда произошло переполнение таймера TMR0. TMR0 = 100 portb = odin digit4 = 0 ' Все цифры сброшенные в 0 - погашены! digit3 = 0 digit2 = 0 digit1 = 1 ' Зажигаем 1 цифру pauseus 1000 digit1 = 0 ' Гасим 1 цифру portb = dva digit4 = 0 digit3 = 0 digit2 = 1 ' Зажигаем 2 цифру digit1 = 0 pauseus 1000 digit2 = 0 ' Гасим 2 цифру portb = tri digit4 = 0 digit3 = 1 ' Зажигаем 3 цифру digit2 = 0 digit1 = 0 pauseus 1000 digit3 = 0 'Гасим 3 цифру portb = chetire digit4 = 1 'зажигаем 4 цифру digit3 = 0 digit2 = 0 digit1 = 0 pauseus 1000 digit4 = 0 ' Гасим 4 цифру PAUSE 1 ' Wait 1ms INTCON.2 = 0 ' Сбросить флаг прерывания по переполнению TMR0 RESUME ' Вернуться в основную программу ENABLE ' Разрешить прерывания convrt: LOOKUP Digit, [$3F, $06, $5B, $4F, $66, $6D, $7D, $07, $7F, $6F], Pattern Pattern = Pattern ^ $FF ' инвертировать биты переменной Pattern (т.к. общий анод return END ' End of program