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