Здравствуйте, сегодня создадим двухразрядный таймер. Код очень простой. Можно сделать и трехразрядный и четырехразрядный и т.д. таймер. Для примера создам на двухразрядном индикаторе смену двух чисел, но по данному принципу можно добавить “бесконечное” количество цифр и разрядов.
Предыдущие части:
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.
Схема аналогичная схема только с другой микросхемой:
Фото подключенного индикатора с микросхемой и программатором: