В.Т. Рябов - Устройство и программирование однокристальных микроконтроллеров (1054006), страница 21
Текст из файла (страница 21)
ГРУППА КОМАНД АРИФМЕТИЧЕСКИХ ОПЕРАЦИЙНазвание командыСложение аккумулятора с регистром (n=0-7)Сложение аккумулятора с прямоадресуемым байтомСложение аккумулятора с байтом из РПДСложение аккумулятора с константой .Сложение аккумулятора с регистром и переносомСложение аккумулятора с прямоадресуемым байтом и переносомСложение аккумулятора с байтом из РПД и переносомСложение аккумулятора с константой и переносомМнемокодADD A, RnКОП00101rrrЦ1Б2Операция(A)←(A)+(Rn)ADO A, ad0010010112(A)←(A)+(ad)ADO A,@R1ADD A, #d0010011111(A)←(A)+((Ri))0010010012(A)←(A)+#dADDC A, Rn00111rrr11(А)←(А)+(Rn)+(С)ADD A, ad0011010112(A)←(A)+(Rn)+(C)ADDC A,@RiADDC A, #d00110100001001110011010011(A)←(A)+((Ri))+(C)12(A)←(A)+#d+(C)69Десятичная коррекция аккумулятораВычитание из аккумулятора регистра и заемаВычитание из аккумуляторапрямо адресуемого байта и заемаВычитание из аккумулятора байта РПД и заемаВычитание из аккумулятора константы и заемаИнкремент аккумулятораИнкремент регистраИнкремент прямо адресуемогобайтаИнкремент байта а РПДИнкремент указателя данныхДекремент аккумулятораДекремент регистраДекремент прямо адресуемогобайтаДекремент байта в РПДУмножение аккумулятора на регистр ВДеление аккумулятора на регистр ВПродолжение таблицы П1.3.11DA A11010100SUBB A, Rn10011rrr11(A)←(A)-(C)-(Rn)SUBB A, Ad1001010111(A)←(A)-(C)-((ad))SUBB A,@RiSUBB A, #d1001011111(A)←(A)-(C)-(Ri)1001010012(A)←(A)-(C)-#dINC AINC RnINC ad0000010000001rrr00000101111112(A)←(A)+1(Rn)←(Rn)+1(ad)←(ad)+1INC @RiINC DPTRDEC ADEC RnDEC ad0000011i101000110001010000011rrr000101011211111112((Ri))←((Ri))+1(DPTR)←(DPTR)+1(А)←(А)-1(Rn)←(Rn)-1(ad)←(ad)-1DEC @RiMUL AB0001011i101001001411((Ri))←((Ri))-1(B)(A)←(A)X(B)DIV AB1000010041(B).(A)←(A)/(B)Таблица П1.4.
ГРУППА КОМАНД ОПЕРАЦИЙ С БИТАМИНазвание командыСброс переносаСброс битаУстановка переносаУстановка битаИнверсия битаИнверсия переносаЛогическое И бита и переноса.Логическое ИЛИ бита и переносаЛогическое И инверсии бита ипереносаЛогическое ИЛИ инверсии бита ипереносаПересылка бита в переносПересылка переноса в битМнемокодCLR СCLR bitSETB СSETB bitCPL bitCPL СANL С, bitORL С, bitANL С, /bitКОП110000111100001011010011110100101011001010110011100000100111001010110000Ц111111222Б121221222Операция(С)←0(b)←0(С)←1(b)←1(b)←(-b)(С)←(-С)(С)←(С)∩(b)(C)←(C)∪(b)(C)←(C)∩(-b)ORL C, /bit1010000022(C)←(C)∪(-b)MOV C, /bit 10100010MOV bit, С 100100101222(C)←(b)(b)←(c)70Таблица П1.5. ГРУППА КОМАНД ЛОГИЧЕСКИХ ОПЕРАЦИЙНазвание командыЛогическое И аккумулятора ирегистраЛогическое И аккумулятора ипрямо адресуемого байтаЛогическое И аккумулятора иРПДЛогическое И аккумулятора иконст.Логическое ИЛИ аккумулятора ипрямо адресуемого байтаЛогическое ИЛИ аккумулятора ирегистраЛогическое ИЛИ аккумулятора иРПДЛогическое ИЛИ аккумулятора иконстантыЛогическое ИЛИ прямо адресуемого байта и аккумулятораЛогическое ИЛИ прямо адресуемого байта м константыЛогическое ИЛИ прямо адресуемого байта и аккумулятораИсключающее ИЛИ аккумулятора м регистраИсключающее ИЛИ аккумулятора и прямо адресуемого байтаИсключающее ИЛИ аккумулятора и байта РПДИсключающее ИЛИ аккумулятора и константыИсключающее ИЛИ прямо адресуемого байта и аккумулятораИсключающее ИЛИ прямо адресуемого байта и аккумулятораСброс аккумулятораИнверсия аккумулятораСдвиг аккумулятора влево черезCСдвиг аккумулятора вправо циклическийСдвиг аккумулятора вправо черезCОбмен местами тетрад в аккумулятореМнемокодANL A, RnКОПO1OllrrrЦ1Б1Операция(А)←(А)∩(Rn)ANL A, ad0101010111(А)←(А)∩(ad)ANL A,@RiANL A, #d0101011112(А)←(А)∩((Ri))O1Ollrrr12(А)←(А)∩#dORL A, ad0100010111(A)←(A)∪(ad)ORL A, RnO1001rrr11(A)←(A)∪(Rn)ORL A,@RiORL A, #d0100011111(A)←(A) ∪ ((R1))0100010012(A)←(A) ∪ #dORL ad, A0100001012(ad)←(ad) ∪ (A)ORL ad, #d0100001023(ad)←(ad) ∪ #dORL ad, A0100001012(ad) ←(ad) ∪ (A)XRL A, RnOl101rrr11(A) ← (A)¤(Rn)XRL A, ad0110010112(A) ← (A)¤(ad)XRL A,@RiXRL A, #d0110011111(A) ← (A) ¤ ((R1))0110010012(A) ← (A)¤ #dXRL ad, A0110001012(ad) ← (ad)(A)XRL ad, #d0110001123(ad) ← (ad) ¤ #dCLR ACPL ARLC A111001001111010000110011111112(A)←0(A) ← - (A)RR A0000001111RRC A0001001111SWAP A110001001171ПРИЛОЖЕНИЕ 2.
Текст программного обеспечения контроллера ШД, выполняемого под управлением диспетчерапроцессовORG 0;-------зона векторов прерываний МК----------------------------------LJMP 2Bh; вход в диспетчерORG 0Bh; вектор прерываний таймера Т/C0LJMP 0D0h; переход к подпрограмме прерывания Т/C0ORG 2Bh; -------начальная настройка МК----------------------------------------MOV SP,#64h; перенос вершины стекаMOV 24h,#0FCh ; настройка Т/С0, установка начальныхMOV 25h,#82h; значений регистров для «тика» в 1 мсMOV TH0,24h; перенос начальных значенийMOV TL0,25hв регистры Т/С0MOV TMOD,#11h ; задание режимов Т/С0MOV TCON,#10h ; задание режимов Т/С0MOV IE,#82h; разрешение прерываний от Т/С0CLR A; обнулениеMOV 20h,A; регистра статусов квантовMOV 21h,A; регистра флагов квантовMOV 26h,A; регистра управления очередью квантовLCALL 0162h; переход к начальной настройке пользователяORG 4Fh;--------начало петли диспетчера процессов--------------------------PR0: JNB 21h.0h,PR1; если флаг нулевого кванта не установлен, переход к PR1JNB 20h.0h,PR1; если статус нулевого кванта не установлен, переход к PR1CLR 21h.0h; иначе очистить флаг квантаLCALL 149h; запустить нулевой квантJNB 26h.0h,PR0; если очередь квантов на круговая, переход в начало петлиPR1: JNB 21h.1h,PR2; анализ состояния первого кванта и так далее до метки PR7JNB 20h.1h,PR2CLR 21h.1hLCALL 014ChJNB 26h.0h,PR0PR2: JNB 21h.2h,PR3JNB 20h.2h,PR3CLR 21h.2hLCALL 14FhJNB 26h.0h,PR0PR3: JNB 21h.3h,PR4JNB 20h.3h,PR4CLR 21h.3hLCALL 0152hJNB 26h.0h,PR0PR4: JNB 21h.4h,PR5JNB 20h.4h,PR5CLR 21h.4hLCALL 0155hJNB 26h.0h,PR0PR5: JNB 21h.5h,PR6JNB 20h.5h,PR6CLR 21h.5hLCALL 0158h72JNB 26h.0h,PR0PR6: JNB 21h.6h,PR7JNB 20h.6h,PR7CLR 21h.6hLCALL 015BhJNB 26h.0h,PR0PR7: JNB 21h.7h,PR0JNB 20h.7h,PR0CLR 21h.7hLCALL 015EhJNB 26h.0h,PR0SJMP PR0; ----конец петли диспетчера, переход на начало----------------ORG 0D0h;------подпрограмма обработки прерываний таймера Т/С0----CLR EA; запретить прерыванияPUSH PSW; сохранить в стеке слово состояния процессораPUSH ACC; сохранить в стеке аккумуляторSETB RS0; задать первый банк регистров МКMOV TH0,24h; восстановить в счетном регистре таймераMOV TL0,25h; начальные значенияDJNZ 23h,FL0; если счетный регистр малых тиков не ноль, переход к FL0;----обработка задержек всех квантов с большой и малой разрядностью задержек---------DJNZ R0,FH1; уменьшить задержку кванта 0 и переход к FН1, если не 0SETB 21h.0h; если задержка обнулена, установить флаг кванта 0FH1: DJNZ R1,FH2; уменьшить задержку кванта 1 и переход к FН2, если не 0SETB 21h.1h; если задержка обнулена, установить флаг кванта 1FH2: DJNZ R2,FH3; и т.д.
до метки ENTSETB 21h.2hFH3: DJNZ R3,FH4SETB 21h.3hFH4: DJNZ R4,FH5SETB 21h.4hFH5: DJNZ R5,FH6SETB 21h.5hFH6: DJNZ R6,FH7SETB 21h.6hFH7: DJNZ R7,EHTSETB 21h.7hEHT: SJMP ENDTM;-------------конец обработки «большого тика»------------------;----обработка задержек квантов только с малой разрядностью задержек--------------------FL0: JB 22h.0h,FL1; если задержка кванта - в больших тиках, переход к FL1DJNZ R0,FL1; иначе уменьшить задержку и переход к FL1, если не нольSETB 21h.0h; если задержка обнулена, установить флаг кванта 0FL1: JB 22h.1h,FL2; и т.д. до метки ENDTMDJNZ R1,FL2SETB 21h.1hFL2: JB 22h.2h,FL3DJNZ R2,FL3SETB 21h.2hFL3: JB 22h.3h,FL4DJNZ R3,FL4SETB 21h.3hFL4: JB 22h.4h,FL573DJNZ R4,FL5SETB 21h.4hFL5: JB 22h.5h,FL6DJNZ R5,FL6SETB 21h.5hFL6: JB 22h.6h,FL7DJNZ R6,FL7SETB 21h.6hFL7: JB 22h.7h,ENDTMDJNZ R7,ENDTMSETB 21h.7h;-------------конец обработки «малого тика»------------------ENDTM:POP ACC; восстановить аккумуляторPOP PSW; и слово состояния процессораSETB EA; разрешить прерыванияRETI;возврат из прерывания;------------------------векторы квантов пользователя-------------------------------------------ORG 149hLJMP STEP; имя кванта0ORG 14ChLJMP KLAV; имя кванта1ORG 14Fh;LJMP NANE2; имя кванта2ORG 152h;LJMP NAME3; имя кванта3ORG 155h;LJMP NAME4; имя кванта4ORG 158h;LJMP NAME5; имя кванта5ORG 15Bh;LJMP NAME6; имя кванта6ORG 15Eh;LJMP NAME7; имя кванта7ORG 162hLJMP START ; имя стартовой программы пользователя;----------------------стартовая программа пользователя-----------------------------------------START: MOV R3,#0Ch; 00001100 в ФАЗУMOV R2,#0Ah; 00001010 в МАСКУMOV P1,R3; фазу в портCLR 20h.0h; снять статус кванта STEPMOV R1,#20h; задержка кванта STEP 32 - тикаMOV 08h,R1; переписать ее в регистр задержек кванта STEPSETB 20h.1h; установить статус кванта KLAVMOV 09h,#80h; записать 128 в регистр задержек кванта KLAVMOV 28h,#0FFh; клавиши не нажималисьMOV 22h,#00; все задержки в коротких тикахRET; возврат из подпрограммы;----------------------------кванты пользователя----------------------------------------------------STEP: CLR A; очистить аккумуляторORL A,P1; фазу в аккумуляторXRL A,R2; исключающее ИЛИ фазы и маскиMOV P1,A; результат в порт Р1XRL 02h,#0Fh; исключающее ИЛИ маски и 0Fh74MOV 08h,R1; установить задержку кванту из R1MOV R3,A; новую фазу в R3RET; возврат из подпрограммы.;-------------------------------------------------KLAV---------------------------------------------------------KLAV:ORL P1, #0F0h; запись единиц в старшую тетраду порта Р1;-------------------------------------------Опрос кнопки К1------------------------------------------------P1_7:JB P1.7, N_P1_7 ; если К4 не нажата, переход к метке N_P1_7; иначе продолжаемJNB 28h.7h, P1_6 ; если была нажата (сочетание 00), опрос К3LCALL PUSK_STOP ; иначе (сочетание 10), запуск «PUSK_STOP»INV7:CPL 28h.7h; инверсия прошлого состояния кнопки К4SJMP P1_6; безусловный переход к метке P1_6 (опрос К3)N_P1_7:JB 28h.7h,P1_6; если не была нажата (сочетание 11) опрос К3SJMP INV7; иначе (сочетание 01) инверсия прошлого; состояния кнопки К4;-------------------------------------------Опрос кнопки К2------------------------------------------------P1_6:JB P1.6,N_P1_6; если К3 не нажата, переход к метке N_P1_6JNB 28h.6h,P1_5 ; если была нажата (сочетание 00), опрос К2LCALL REVERS; иначе (сочетание 10), запуск «REVERS»INV6:CPL 28h.6h; инверсия прошлого состояния кнопки К3SJMP P1_5; безусловный переход к метке P1_5 (опрос К2)N_P1_6:JB 28h.6h,P1_5; если не была нажата (сочетание 11) опрос К2SJMP INV6; иначе (сочетание 01) инверсия прошлого состояния К3;-------------------------------------------Опрос кнопки К3------------------------------------------------P1_5:JB P1.5,P1_4; если К2 не нажата переход к анализу К1LCALL FASTER; иначе, запуск подпрограммы FASTER;-------------------------------------------Опрос кнопки К4------------------------------------------------P1_4:JB P1.4,EKL; если К1 не нажата – выход из кванта опроса кнопокLCALL SLOWLY; иначе, запуск подпрограммы SLOWLYEKL:RET; возврат из подпрограммы KLAV;---------------------------Подпрограммы реакции на нажатие кнопок------------------------------;--------------------Реакция на нажатие К4 «Вкл-Выкл»-----------------------------------------------PUSK_STOP: CPL 20h.0h;инверсия статуса кванта STEPMOV P1,#0F0h; обнулили младшую тетраду Р1 (сняли питание с ШД)JNB 20h.0h,ENDPS ; если статус – ноль, выход из подпрограммыMOV P1,R3; иначе записать в Р1 хранимое в R3 состояние фаз ШДENDPS:RET; выход из подпрограммы PUSK_STOP;--------------------Реакция на нажатие К3 «Реверс»---------------------------------------------------REVERS:XRL 02,#0Fh;инверсия битов младшей тетрады переменной MASKARET;выход из подпрограммы REVERS;--------------------Реакция на нажатие К2 «Медленнее»---------------------------------------------SLOWLY:INC R1;инкремент R1 (задержки кванта STEP)RET;выход из подпрограммы SLOWLY;--------------------Реакция на нажатие К1 «Быстрее»-------------------------------------------------FASTER:DEC R1;декремент R1 (задержки кванта STEP)RET;выход из подпрограммы FASTER;--------------------------------------------------------------------------------------------------------------END; конец программы.