Pic16f630: Семисегментный индикатор ( часть 5 двухразрядный таймер)

Здравствуйте, сегодня создадим двухразрядный таймер. Код очень простой. Можно сделать и трехразрядный и четырехразрядный и т.д. таймер. Для примера создам на двухразрядном индикаторе смену двух чисел, но по данному принципу можно добавить “бесконечное” количество цифр и разрядов.


Предыдущие части:
Pic16f630: Семисегментный индикатор показываем цифры по порядку
Pic16f630: Семисегментный индикатор (часть 2 добавляем кнопку)
Pic16f630: Семисегментный индикатор (часть 3 задержка регулируемая через программу)
Pic16f630: Семисегментный индикатор ( часть 4 игральный кубик)

Скачать файлы asm,hex,inc:


Скачать файлы.

Код на ассемблере:

#include <P16F630.INC>
 __CONFIG (_MCLRE_OFF & _CP_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT)  ;Internal osc.

c1 equ 20
c2 equ 21
t1 equ 22
t2 equ 23
Reg_1 equ 24
Reg_2 equ 25
Reg_3 equ 26

 org 0

Start
 
 BSF   STATUS,RP0  ; select bank 1
 CLRF  TRISC       ; make PORTC pins all output
 CLRF  TRISA       ; make PORTA pins all output
 BCF   STATUS,RP0  ; select bank 0
 movlw b'00000000'
 movwf  PORTC       ; set portc pins equal to 0
 movlw b'00000000'
 movwf  PORTA       ; set portc pins equal to 0

loop
call game
goto loop

game
movlw 0x99
movwf t1
movlw 0x50
movwf t2
game1
 movlw b'00111111' ;0
 movwf PORTC
 movlw b'00010000'
 movwf PORTA
 call delay10000
 movlw b'00100100'  ;1
 movwf PORTC
 movlw b'00000001'
 movwf PORTA
 call delay10000
 decfsz t1,1 
 goto game1

game2
 movlw b'00100100'  ;1
 movwf PORTC
 movlw b'00010000'
 movwf PORTA
 call delay10000
 movlw b'00011110'  ;2
 movwf PORTC
 movlw b'00000101'
 movwf PORTA
 call delay10000
 decfsz t2,1 
 goto game2


;delay = 1000 machine cycles
delay10000
       movlw       0x75
       movwf       Reg_1
       movlw       0x2
       movwf       Reg_2
wr          
       decfsz      Reg_1, 1
       goto        wr
       decfsz      Reg_2, 1
       goto        wr
       nop
return

end

Как организовать циклы в ассемблере с заданным количеством шагов?

Для организации ветвлений в pic-контроллерах можно использовать 4 команды: две оперирующие с байтами (decfsz, incfsz) и две оперирующие с битами (btfsc, btfss). Работают эти команды следующим образом:

decfsz f,d - вычесть 1 из регистра f, если результат =0, то пропустить следующую команду (d определяет, куда сохранять результат,
             если d=0 - результат сохраняется в аккумуляторе W, если d=1 - результат сохраняется в регистре f)
incfsz f,d - добавить 1 к регистру f, если результат =0, то пропустить следующую команду
btfsc f,b  - проверить бит b в регистре f, если он =0, то пропустить следующую команду
btfss f,b  - проверить бит b в регистре f, если он =1, то пропустить следующую команду

Эти команды эквивалентны следующим алгоритмам:

Как видите, все перечисленные команды позволяют установить счётчик команд либо на следующий адрес, либо через один.

Как же организовать полноценное ветвление, такое как на рисунке 1? Это делается очень просто. Для этого дополнительно используется команда безусловного перехода goto. В итоге алгоритмы приобретают вот такой вид (эквивалентный алгоритму на рисунке 1):

Если провести аналогию с языками высокого уровня, то эти конструкции можно сравнить с конструкциями вида if then else и им подобными.

Схема соединения:

На моём трехсегментном индикаторе минусовые выходы были расположены на ножках 8,9 и 12.

Схема аналогичная схема только с другой микросхемой:

Фото подключенного индикатора с микросхемой и программатором:

Добавить комментарий