Вернуться -> | Главная |
Программы на ассемблере для PIC Micro
|
Всё проги для 8-ми битных микроконтроллеров фирмы MicroChip (ассемблер).
Работа с ЖКИ индикатором Holtek HT1613
Частота кварца - 20 МГц. Экранная память 26h-2Fh десять регистров, Wrem_1 - временный; P_DatIn - пин DATA индикатора, P_CLCIn - CLC индикатора,
Fresh_Scr: | movlw screen | ; загрузим FSR адресом |
movwf FSR | ; началом экрана | |
mov Wrem_1,INDF | ; последний разряд | |
Ret10 | movlw 04h | ; количество выводимых бит |
movwf Wrem_2 | ; для индикатора = 4 | |
Ret4In | goto $+1 | ; задержка 200нс |
goto $+1 | ; задержка 200нс | |
goto $+1 | ; задержка 200нс | |
bsf P_CLCIn | ; установим такт в 1 | |
btfsc Wrem_1,3 | ; если 0 бит <> 0 | |
bsf P_DatIn | ; установить 0 | |
btfss Wrem_1,3 | ; если 1бит <> 0 | |
bcf P_DatIn | ; установить 1 | |
rlf Wrem_1,F | ; сдвинем вправо + задержка | |
bcf P_CLCIn | ; стробируем вывод бита | |
decfsz Wrem_2,F | ; проверим цикл на ноль, 0-выход | |
goto Ret4In | ; сдвигаем ещё | |
incf FSR,F | ; следующую цифру на индикатор | |
mov Wrem_1,INDF | ||
btfss FSR,4 | ; все цифры выведены ? | |
goto Ret10 | ; пока нет | |
return |
Преобразователь последовательного 8-битного кода в параллельный (К555ИР8)
Data_OUT - регистр для вывода последовательно
CiklReg - регистр кол-ва циклов сдвига = 8
CLK - CLK такт для регистра
Digi_OUT - DP бит ввода регистра
RESRD - RES сброс регистра
ZapIr8: | BANK0 | ; страница 0 |
movl CiklReg,08h | ; количество сдвигов = 8 | |
Ret_IR8 | bcf CLK | ; открываем CK записи в регистр 0-1 |
btfsc Data_OUT,7 | ; если 0 бит <> 0 | |
bsf Digi_OUT | ; установить 0 | |
btfss Data_OUT,7 | ; если 0 бит <> 0 | |
bcf Digi_OUT | ; установить 1 | |
bsf CLK | ; закрываем CK записи в регистр 1-0 | |
rlf Data_OUT,1 | ; сдвинем вправо + задержка | |
decfsz CiklReg,1 | ; проверим цикл на ноль, 0-выход | |
goto Ret_IR8 | ; сдвигаем ещё | |
bcf CLK | ||
return |
Преобразователь параллельного 8-битного кода в последовательный (К555ИР9)
Data_IN - регистр для ввода последовательно
CiklReg - регистр кол-ва циклов сдвига = 8
CLK - CLK такт для регистра
Digi_IN - DP бит вывода регистра
ZapIr9: | movlw 08h | ; количество циклов (8бит) |
movwf CiklReg | ; для сдвига в регистре | |
clrf Data_IN | ; очистим байт приёма данных | |
Ret_IR9 | rlf Data_IN,1 | ; сдвиг и запись в WREM_T |
bsf CLK | ||
bcf CLK | ||
btfsc Digi_IN | ||
bsf Data_IN,0 | ||
decfsz CiklReg,1 | ; проверим на ноль | |
goto Ret_IR9 | ||
return |
Преобразования HEX в ASCII и наоборот
программа преобразования ASCII 1-A-F в HEX код
символ ASCII для преобразования ASCI_IN ->результат преобразования HEX_OUT
ASCI_HEX: | movlw 4Fh | ; 0100 1111 - маска |
andwf ASCI_IN,F | ; складываем результат с маской | |
btfss ASCI_IN,6 | ||
goto Exit_AH | ||
incf ASCI_IN,F | ||
bsf ASCI_IN,3 | ||
Exit_AH | movlw 0Fh | 0000 1111 - маска |
andwf ASCI_IN,W | ; удалим первую тетраду | |
movwf HEX_OUT | ||
return |
программа преобразования HEX кода в ASCII символ 1-A-F
HEX в HEX_IN -> ASCI_OUT результат символ ASCII
HEX_ASCI: | movlw 0Fh | ; 0100 1111 - маска |
andwf HEX_IN,F | ; складываем результат с маской | |
movf HEX_IN,W | ||
sublw 09h | ; 0000 1001 - маска | |
btfss STATUS,C | ||
goto Exit_HA | ||
movlw 30h | ; 0011 0000 - маска | |
iorwf HEX_IN,W | ; установим биты для ASCII | |
movwf ASCI_OUT | ||
return | ||
Exit_HA | movlw 09h | ; 0011 0000 - маска |
subwf HEX_IN,F | ||
movlw 40h | ; 0100 00 - маска | |
iorwf HEX_IN,W | ; удалим первую тетраду | |
movwf ASCI_OUT | ||
return |
Сложение - вычитание двубайтных чисел
Сложение (D_add): ACCb(16 бит) + ACCa(16 бит) -> ACCb(16 бит)
ACCaLO & ACCaHI (16 бит)+ ACCbLO & ACCbHI (16 бит)=ACCbLO&ACCbHI(16
бит)
Вычитание (D_sub): ACCb(16 бит) - ACCa(16 бит) -> ACCb(16 бит)
ACCbLO & ACCbHI(16 бит) - ACCaLO & ACCaHI(16 бит) = ACCbLO & ACCbHI(16
бит)
D_sub | call neg_A | сначала инферсия, потом сложение |
D_add | movf ACCaLO,W | |
addwf ACCbLO,F | ||
btfsc STATUS,C | добавим, если перенос | |
incf ACCbHI,F | ||
movf ACCaHI,W | ||
addwf ACCbHI,F | ||
retlw 0 | ||
neg_A | comf ACCaLO,F | ; инверсия ACCa ( -ACCa -> ACCa ) |
incf ACCaLO,F | ||
btfsc STATUS,Z | ||
decf ACCaHI,F | ||
comf ACCaHI,F | ||
retlw 0 |
Умножение с двойной точностью (16x16 -> 32)(
ACCb*ACCa -> ACCb,ACCc )
УМНОЖЕНИЕ : ACCb(16 бит)*ACCa(16 бит)->ACCb,ACCc(32 бит)
1. Загрузить ACCaHI & ACCaLO (16 бит)
2. Загрузить ACCbHI & ACCbLO (16 бит)
3. Вызвать п/п Mpy1616
4. Результат 32 бита в ACCb(ACCbHI,ACCbLO) ACCc( ACCcHI,ACCcLO )
Mpy1616 | call Setup1616 | |
Mloop | rrf ACCdHI,F | |
rrf ACCdLO,F | ||
btfsc STATUS,C | ||
call D_add1616 | ||
rrf ACCbHI,F | ||
rrf ACCbLO,F | ||
rrf ACCcHI,F | ||
rrf ACCcLO,F | ||
decfsz Temp,F | ||
goto Mloop | ||
retlw 0 | ||
Setup1616 | movlw .16 | |
movwf Temp | ||
movf ACCbHI,W | ||
movwf ACCdHI | ||
movf ACCbLO,W | ||
movwf ACCdLO | ||
clrf ACCbHI | ||
clrf ACCbLO | ||
retlw 0 | ||
D_add1616 | movf ACCaLO,W | сложение ( ACCb + ACCa -> ACCb ) |
addwf ACCbLO, F | ||
btfsc STATUS,C | ||
incf ACCbHI, F | ||
movf ACCaHI,W | ||
addwf ACCbHI, F | ||
retlw 0 |
ДЕЛЕНИЕ : ACCb(24 бит)/ACCa(16 бит)->ACCb(16
бит) разность в ACCc (16 бит)
1. Загрузить делитель в ACCaHI & ACCaLO (16 бит)
2. Загрузить делимое в ACCbH2 & ACCbHI & ACCbLO ( 24 бита)
3. Вызвать п/п Div_2416
4. Результат 16 бит в ACCbHI & ACCbLO, остаток 16 бит в ACCcHI & ACCcLO
Div_2416 | call Setup24 | |
clrf ACCcHI | ||
clrf ACCcLO | ||
Dloop24 | bcf STATUS,C | |
rlf ACCdLO,F | ||
rlf ACCdHI,F | ||
rlf ACCdH2,F | ||
rlf ACCcLO,F | ||
rlf ACCcHI,F | ||
movf ACCaHI,W | ||
subwf ACCcHI,W | ; проверка a>c | |
btfss STATUS,Z | ||
goto Nochk24 | ||
movf ACCaLO,W | ||
subwf ACCcLO,W | ||
Nochk24 | btfss STATUS,C | ; перенос если c > a |
goto Nogo24 | ||
movf ACCaLO,W | ; c-a результат в c | |
subwf ACCcLO,F | ||
btfss STATUS,C | ||
decf ACCcHI,F | ||
movf ACCaHI,W | ||
subwf ACCcHI,F | ||
bsf STATUS,C | ; переместить a 1 в b (результат) | |
Nogo24 | rlf ACCbLO,F | |
rlf ACCbHI,F | ||
decfsz Temp,F | ; цикл пока все биты не проверим | |
goto Dloop24 | ||
retlw 0 | ||
Setup24 | movlw .24 | ; установки для 24 циклов |
movwf Temp | ||
movf ACCbH2,W | ; переместим ACCb в ACCd | |
movwf ACCdH2 | ||
movf ACCbHI,W | ||
movwf ACCdHI | ||
movf ACCbLO,W | ||
movwf ACCdLO | ||
clrf ACCbH2 | ||
clrf ACCbHI | ||
clrf ACCbLO | ||
retlw 0 |
Вернуться -> | Главная |
ICQ 176777742
|