| Вернуться -> | Главная |
|
Программы на ассемблере для 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
|