LIST p=16F84
; Регистры общего назначения
PC equ 02h ; Счетчик команд
STATUS EQU 03h ; статус
PORTB EQU 06h ; порт В
; Управляющие регистры портов ввода-вывода
TRISB EQU 86h ; для порта В
; Биты регистра STATUS
RP0 EQU 05h ; бит выбора страницы
; Биты регистра PORTB
DAT EQU 04h ; бит данных
SYN EQU 05h ; бит синхронизации
CBLOCK 0CH ; блок рабочих регистров
WORK1 ; переменные для циклов
WORK2
NUM ; сегменты индикатора
ENDC
org 00h ; начало исполняемого кода
GOTO START
org 04h ; программа обработки прерываний
retfie ; отсутствует
; Основная программа
START
; Инициализация PORTB
MOVLW B'11001111' ; настройка порта В
BSF STATUS,RP0 ; выбор банка 1
MOVWF TRISB ; установка RB4, RB5 на вывод
BCF STATUS,RP0 ; выбор банка 0
;
BSF PORTB,DAT ; установка битов DAT, SYN
BSF PORTB,SYN ; в регистр PORTB
MAIN ;основной цикл
MOVLW 1
CALL ZAZHECH ;рисуем 1
CALL PAUSE ;пауза
MOVLW 2 ;2
CALL ZAZHECH
CALL PAUSE
MOVLW 3 ;3
CALL ZAZHECH
CALL PAUSE
MOVLW 5 ;5
CALL ZAZHECH
CALL PAUSE
GOTO MAIN
;=============================================
; Преобразование BCD -> 7 сегментный код
; 0 - горит
;=============================================
LCDTable
addwf PC,F ; W + PC -> PC
retlw b'11000000' ; ..FEDCBA = '0'
retlw b'11111001' ; .....CB. = '1'
retlw b'10100100' ; .G.ED.BA = '2'
retlw b'10110000' ; .G..DCBA = '3'
retlw b'10011001' ; .GF..CB. = '4'
retlw b'10010010' ; .GF.DC.A = '5'
retlw b'10000010' ; .GFEDC.A = '6'
retlw b'11111000' ; .....CBA = '7'
retlw b'10000000' ; .GFEDCBA = '8'
retlw b'10010000' ; .GF.DCBA = '9'
; Подпрограмма «Зажечь»
ZAZHECH
CALL LCDTable ; получаем в W сегменты индикатора
MOVWF NUM ; сохраним в NUM
MOVLW D'8' ; 8 бит
MOVWF WORK1 ; в счетчик WORK1
M01
BCF PORTB,DAT ; установка в 0 RB4 (чтобы горело)
BTFSC NUM,0 ; если 0 бит в регистре NUM = 0, то пропускаем
BSF PORTB,DAT ; команду, если нет, то установка RB4 в 1 (чтобы потухло)
; синхронизация PORTB
BCF PORTB,SYN
BSF PORTB,SYN
RRF NUM,1 ; сдвиг вправо, через перенос
DECFSZ WORK1,1 ; по всем 8 битам
GOTO M01 ; переход на метку M01
; погасим остальные 24 сегмента
; бит DAT обязательно = 1, т.к. последний бит везде = 1
MOVLW D'24' ; количество
MOVWF WORK1
M02
BCF PORTB,SYN
BSF PORTB,SYN
DECFSZ WORK1,1
GOTO M02
RETURN ; возврат из подпрограммы
; Подпрограмма «Пауза»
PAUSE
MOVLW D'128'
MOVWF WORK1 ; в счетчик WORK1
CLRF WORK2 ; очистка регистра
LOOP
DECFSZ WORK2,1 ; уменьшить счетчик WORK2, если он
GOTO LOOP ; не равен 0, то вернуться на метку LOOP
DECFSZ WORK1,1 ; уменьшить счетчик WORK1, если он
GOTO LOOP ; не равен 0, то вернуться на метку LOOP
RETURN ; возврат из подпрограммы
END
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.