;****************************************************** ; Date: mart 2009 ; File Version: 2.7 ; Assembler: mpasm 7.42 ; Author: Bogdanov Andrew ;****************************************************** mov macro metka1,metka2 ; пересылка М2->М1 movf metka2,w ; movwf metka1 ; endm ; mvi macro metka1,constant ; запись constant->М1 movlw constant ; movwf metka1 ; endm ; ret macro ; возврат return ; endm ; cz macro metka ; условный переход btfsc STATUS,2 ; если что-то = 0 call metka ; endm ; cnz macro metka ; условный переход btfss STATUS,2 ; если что-то = 0 call metka ; endm ; rz macro ; условный возврат btfsc STATUS,2 ; из подпрограммы return ; возврат, если что-то = 0 endm ; rnz macro ; условный возврат btfss STATUS,2 ; из подпрограммы return ; возврат, если что-то не = 0 endm ; rnc macro ; условный выход btfsc STATUS,0 ; если что-то > 0 return ; endm ; rc macro ; условный выход btfss STATUS,0 ; если что-то < 0 return ; endm ; cmp macro metka2,metka1 ; сравнение М1 и М2 movf metka2,w ; f-w subwf metka1,w ; endm ; cpi macro metka2,metka1 ; сравнение М2 и константы movf metka2,w ; k-w sublw metka1 ; endm ; and macro metka2,metka1 ; and F и константы movlw metka1 ; andwf metka2,f ; endm ; ori macro metka2,metka1 ; and F и константы movlw metka1 ; iorwf metka2,f ; endm ; ;************************************************************ fcall0 macro metka ; FAR дальний вызов lcall metka ; возврат в банк 0 BCF PCLATH,3 BCF PCLATH,4 endm fcall00 macro metka ; FAR дальний вызов lcall metka ; возврат в банк 0 BCF PCLATH,3 BCF PCLATH,4 endm ;************************************************************ ; RAM ОЗУ ;************************************************************ page0 macro ; установка страницы 0 bcf STATUS,5 bcf STATUS,6 endm page1 macro ; установка страницы 1 bsf STATUS,5 bcf STATUS,6 endm page2 macro ; установка страницы 2 bcf STATUS,5 bsf STATUS,6 endm page3 macro ; установка страницы 3 bsf STATUS,5 bsf STATUS,6 endm ;*********************************************************************** pageFsr0 macro ; установка страницы 0 bcf FSR,7 bcf STATUS,7 endm pageFsr1 macro ; установка страницы 1 bsf FSR,7 bcf STATUS,7 endm pageFsr2 macro ; установка страницы 2 bcf FSR,7 bsf STATUS,7 endm pageFsr3 macro ; установка страницы 3 bsf FSR,7 bsf STATUS,7 endm ;************************************************************ W equ 0 ; Результат в аккумуляторе F equ 1 ; Результат в регистре ;******************** Flag bits: **************************** C equ 0 ; перенос - Carry CR equ 0 ; перенос - Carry Z equ 2 ; Zero ZR equ 2 ; Zero RP0 equ 5 ; страница 0-1 RP1 equ 6 ; страница 01-23 ;************************************************************ TempReg71_74 macro ; регистры прерывания temp_s equ 0x71 ; сохранение регистров temp_w equ 0x72 ; temp_fsr equ 0x73 ; во время прерывания temp_pc equ 0x74 ; endm ;************************************************************ PUSH macro ; cтандартный блок PUSH movwf temp_w ; сохранить W swapf STATUS,w ; сохранить Status movwf temp_s ; movf FSR,w ; сохранить fsr movwf temp_fsr ; mov temp_pc,PCLATH ; сохранить PCLATH clrf PCLATH ; 0 clrf STATUS ; банк 0 endm ; конец макроса POP macro ; макрос movf temp_fsr,w ; movwf FSR ; return fsr mov PCLATH,temp_pc ; восстановить PCLATH swapf temp_s,w ; cтандартный блок POP movwf STATUS ; возвратить Status swapf temp_w,f ; возвращает W не swapf temp_w,w ; изменяя флага Z ! retfie ; выход из прерывания с уст бита разрешения endm ; конец макроса ;****************************************************** __CONFIG b'00001100000110' ; биты конф 628 ;************** Bank 0 ************************************** INDF equ 00h ; Доступ к памяти через FSR TMR0 equ 01h ; TMR0 PC equ 02h ; Счетчик команд STATUS equ 03h ; Status FSR equ 04h ; Регистр косвенной адресации PORTA equ 05h ; Port A PORTB equ 06h ; Port B PCLATH equ 0Ah ; старшая часть PC INTCON equ 0Bh ; уст прерываний PIR1 equ 0Ch ; TMR1L equ 0Eh ; TMR1H equ 0Fh ; T1CON equ 10h ; TMR2 equ 11h ; T2CON equ 12h ; CCPR1L equ 15h ; CCPR1H equ 16h ; CCP1CON equ 17h ; RCSTA equ 18h ; TXREG equ 19h ; RXREG equ 1Ah ; RCREG equ 1Ah ; CMCON equ 1Fh ; ;************** Bank 1 ************************************** OPTIONR equ 01h ; 81h Option (RP0=1) TRISA equ 05h ; 85h Tris A - RP0=1 TRISB equ 06h ; 86h Tris B - RP0=1 PIE1 equ 0Ch ; 8Ch - RP0=1 PCON equ 0Eh ; 8Eh - RP0=1 PR2 equ 12h ; 92h - RP0=1 TXSTA equ 18h ; 98h - RP0=1 SPBRG equ 19h ; 99Bh - RP0=1 VRCON equ 1Fh ; 99Bh - RP0=1 ;************************************************************ EEDATA equ 1Ah ; EEPROM Данные для записи.считывания EEADR equ 1Bh ; EEPROM Адрес EECON1 equ 1CH ; EECON2 equ 1Dh ; спец регистр WRERR equ 3 ; bit EECON1 1=Ошибка во время записи WREN equ 2 ; bit EECON1 1=разрешить запись WRee equ 1 ; bit EECON1 1=запись 0=готово к следующей RDee equ 0 ; bit EECON1 уставить в 1 и можно считывать ;************************************************************ GIE equ 7 ; ;************************************************************ Init628 macro ; иницализация clrf STATUS ; cтраница 0 bsf STATUS,RP0 ; cтраница 1 movlw b'00000111' ; XT->Prescaler(1:256)->RTCC movwf OPTIONR ; + активные нагрузки clrf VRCON ; 628 Выкл источник опорного clrf PCON ; 628 clrf STATUS ; cтраница 0 mvi CMCON,0x07 ; 628 port A in-out endm ;****************************************************** #define ClkLine PORTB,3 ; 9=такт ИР2 3 #define DataLine PORTB,0 ; 6=data ИР2 0 #define sdata PORTB,7 ; 5 <-> data #define sclk PORTB,6 ; 6 --> clock ;#define CSled PORTB,4 ; CS КП2 - нужно выкл LEDS! #define CSled PORTA,3 ; CS КП2 - нужно выкл LEDS! ; на плате выводы 2-3 соединить !!! перемычкой ;#define KP2a PORTA,1 ; 18 ;#define KP2b PORTA,0 ; 17 ;#define KP2c PORTA,2 ; 1 ;******************************************************* ; tablo 1 = 20h-3Fh bank 1 ; tablo 2 = 20h-3Fh bank 2 ; tablo 3 = 20h-3Fh bank 3 ;****************************************************** mFlags equ 0x41 ; #define Fspec mFlags,2 ; флаг наличия спец символа #define Finv mFlags,3 ; флаг инверсии #define FModeSpeed mFlags,4 ; режим вывода строки - скорости #define FrecEnable mFlags,5 ; пишем только если флаг=1 ;******* Общие ячейки *********************************** mDelay equ 0x42 ; RepeatSP equ 0x43 ; режим медленной скорости ModeExe equ 0x44 ; исполительный режим вывода mFlashLr equ 0x47 ; младший адрес символа mFlashHr equ 0x48 ; старший адрес mSpeed equ 0x49 ; скорость вывода символов mFlashLzg equ 0x4A ; младший адрес знакогенератора mFlashHzg equ 0x4B ; старший адрес PosZG equ 0x4C ; позиция в знакогенераторе mTipEffect equ 0x4D ; код эффекта mTimeEffect equ 0x4E ; время эффекта mSpecDOP equ 0x4F ; счетчик эффекта ;--------------------------------- RxByte equ 0x60 ; регистр ввода данных mTOut equ 0x61 ; выкл строки на время загрузки loops equ 0x62 ; wait при записи loops2 equ 0x63 ; mCountEff equ 0x64 ; циклы при выводе эффекта mTmpUNI1 equ 0x6E ; mTmpUNI2 equ 0x6F ; ;******************************************************** ;****** только в области 70-7F ! ************************ datai equ 0x70 ; регистр ввода данных ;----- временные ячейки 24С64 ------------------------------ eeprom equ 0x72 ; битовый буфер #define di eeprom,7 ; eeprom input bit #define do eeprom,6 ; eeprom output bit bycnt equ 0x73 ; счетчик байт для адреса режима чтения txbuf equ 0x74 ; буфер передачи countee equ 0x75 ; счетчик бит bcount equ 0x76 ; циклы счетчика байта ;******************************************************* mCountDop equ 0x77 ; mNewSolb equ 0x78 ; mNewSimbol equ 0x79 ; ;********** ячейки для приема ************************* temp_pc equ 0x7C ; восстановить PCLATH temp_s equ 0x7D ; \ Int сохранение регистров temp_w equ 0x7E ; \ temp_fsr equ 0x7F ; \ Int во время прерывания ;--------------------------------------------------------------- ; выводим всю длинную линию 96 ячеек Line96 macro bit,Label1,Label2,Label3 ;------------------------------------------ bsf STATUS,7 mvi FSR,0x3F ; page 2 Label1: bcf ClkLine ; такт ИР2 clrwdt ; задержка bsf DataLine ; data ИР2 btfss INDF,bit ; проверяем текущий бит bcf DataLine ; data ИР2 decf FSR,f ; bsf ClkLine ; такт ИР2 btfsc FSR,5 goto Label1 ; 32 столбца ;------------------------------------------ clrf STATUS mvi FSR,0x3F+0x80; page 1 Label2: bcf ClkLine ; такт ИР2 clrwdt ; задержка bsf DataLine ; data ИР2 btfss INDF,bit ; проверяем текущий бит bcf DataLine ; data ИР2 decf FSR,f ; bsf ClkLine ; такт ИР2 btfsc FSR,5 goto Label2 ; 32 столбца ;------------------------------------------ mvi FSR,0x3F ; page 0 Label3: bcf ClkLine ; такт ИР2 clrwdt ; задержка bsf DataLine ; data ИР2 btfss INDF,bit ; проверяем текущий бит bcf DataLine ; data ИР2 decf FSR,f ; bsf ClkLine ; такт ИР2 btfsc FSR,5 goto Label3 ; 32 столбца ;------------------------------------------ endm ;************************************************************ CSonAndDelay macro bits ; 1-6-7-2-3-5-0-4 clrf STATUS ; все в банке 0 mvi mDelay,.3 ; устранение паразитной call Dcuc ; засветки mvi PORTA,bits ; код линии + CS endm ;************************************************************ TrisOut macro page1 ; cтраница 1 bcf sdata ; data-clk OUT page0 ; cтраница 0 endm TrisIn macro page1 ; cтраница 1 bsf sdata ; data-clk IN page0 ; cтраница 0 endm ;************************************************************ ;******************************************************* ORG 0 ; Вектор Сброса ;******************************************************* goto Start ; переход на начало программы ;******************************************************* ORG 4 ; Вектор прерывания ;******************************************************* PUSH clrf STATUS ; mov RxByte,RCREG ; ;--------------------------------------------------------- mvi mTOut,.100 ; выкл строки на время загрузки incf PORTA,f ; крутим порт bcf CSled ; всегда включен bcf DataLine ; 0 btfss RxByte,3 ; от состояния бита bsf DataLine ; 1 ;--------------------------------------------------------- cpi RxByte,0xFF ; bz ToUstFlag ; UST флаг наличия загрузки btfss Fspec ; флаг наличия спец символа goto WriteData ;---------------------------------------------------------- ChangeSpec: bcf Fspec ; сброс флага cpi RxByte,0xFE ; bz ToSimbFF ; записать символ FF cpi RxByte,0xF1 ; bz ToTxt ; загрузка только текста cpi RxByte,0xF0 ; bz ToCoda ; конец загрузки cpi RxByte,0xF6 ; узкий bz ToZg ; загрузка знакогенератора cpi RxByte,0xF8 ; широкий bz ToZg ; загрузка знакогенератора goto ret_int ; остальные не обрабатываем ;========================================================== ToTxt: ; загрузка только текста mvi mFlashLr,0x01 ; после 2-х КБ mvi mFlashHr,0x08 ; bsf FrecEnable ; пишем только если флаг=1 goto ret_int ; ;---------------------------------------------------------- ToZg: ; загрузка знакогенератора mvi mFlashLr,0x00 ; mvi mFlashHr,0x01 ; ZG в начале ROM bsf FrecEnable ; пишем только если флаг=1 goto ret_int ; ;---------------------------------------------------------- ToCoda: ; mvi mTOut,.3 ; 7 =выкл строки на время загрузки mvi RxByte,0x08 ; записываемые данные call WriteRx bcf FrecEnable ; пишем только если флаг=1 goto ret_int ;---------------------------------------------------------- ToSimbFF: ; записать символ FF mvi RxByte,0xFF ; записываемые данные WriteData: cpi mFlashHr,0x00 ; 24c512 ; cpi mFlashHr,0x20 ; 24c64 bz ToCoda call WriteRx ;--------------------------------------------------------------- incf mFlashLr,f ; bnz ret_int incf mFlashHr,f goto ret_int ;========================================================== ToUstFlag: ; UST флаг наличия загрузки bsf Fspec ; флаг спец символа ret_int: bcf PIR1,5 ; USART - Флажок !!! POP ;********************************************************* Start: ;********************************************************* page1 ; cтраница 1 movlw b'10000011' ; HS->Prescaler->Timer0, movwf OPTIONR ; 1:16 movlw b'11110000' ; movwf TRISA ; movlw b'00110010' ; TX=2 установить при 628 movwf TRISB ; clrf VRCON ; 628 Выкл источник опорного clrf PCON ; 628 ;********************************************************* movlw d'207' ; 1.200 (207=16Mhz) brg=0 movwf SPBRG ; USART DMX512-байт movlw b'00100000' ; прерывание от movwf PIE1 ; USART movlw b'00100010' ; 8 бит, TX=on, BRGH=0 movwf TXSTA ; USART clrf STATUS ;********************************************************* mvi CMCON,0x07 ; 628 port A in-out mov RxByte,RCREG; mov RxByte,RCREG; movlw b'10010000' ; TX,RX=on, 8 бит movwf RCSTA ; USART clrf PIR1 ; USART - Флажок !!! movlw b'11000000' ; разрешить все movwf INTCON ; прерывания ;////////////////////////////////////////////////////////// bsf FrecEnable ; пишем только если флаг=1 clrf mFlashLr ; все сначала mvi mFlashHr,0x08 ; mvi RxByte,.32 ; записываемые данные call WriteRx call waitRec24cXX ; ПОДПРОГРАММА ЗАДЕРЖКИ bcf FrecEnable ; пишем только если флаг=1 ;////////////////////////////////////////////////////////// NewLoad: clrwdt ; сброс WDT таймера call ClearAll ; clrf mFlashLr ; все сначала mvi mFlashHr,0x08 ; clrf mTOut ; выкл строки на время загрузки clrf PosZG ; bsf FModeSpeed ; 0 - низкая скорость mvi mSpeed,.4 ; 0-7 = 8 градаций 0-быстро bcf Finv ; флаг инверсии строки ;********************************************************* BaseCucSymbol: ;********************************************************* ;--------------------------------------------------------- ; цикл работы во время приема ;--------------------------------------------------------- cpi mTOut,0 ; выкл строки на время загрузки bz NoReceiv ; cpi mTOut,1 ; выкл строки на время загрузки bz NewLoad ; decf mTOut,f ; mvi mDelay,.250 ; просто bcf ClkLine ; группа переноса call Dcuc ; задержка bsf ClkLine goto BaseCucSymbol NoReceiv: ;--------------------------------------------------------- ;......................................................... ; Блок вывода N 1 ;......................................................... call CSoffandDelay ; выключить строку и задержка для порта Line96 7,m7,m7a,m7b ; выводим линию 96 ячеек CSonAndDelay 6 ; код линии + CS call DelaySpeed ; задержка и скорость ;......................................................... ; Блок вывода N 2 ;......................................................... call CSoffandDelay ; выключить строку и задержка для порта Line96 6,m6,m6a,m6b ; выводим линию 96 ячеек CSonAndDelay 7 ; код линии + CS call DelaySpeed ; задержка и скорость ;......................................................... ; Блок вывода N 3 ;......................................................... call CSoffandDelay ; выключить строку и задержка для порта Line96 5,m5,m5a,m5b ; выводим линию 96 ячеек CSonAndDelay 2 ; код линии + CS call DelaySpeed ; задержка и скорость ;......................................................... ; Блок вывода N 4 ;......................................................... call CSoffandDelay ; выключить строку и задержка для порта Line96 4,m4,m4a,m4b ; выводим линию 96 ячеек CSonAndDelay 3 ; код линии + CS call DelaySpeed ; задержка и скорость ;......................................................... ; Блок вывода N 5 ;......................................................... call CSoffandDelay ; выключить строку и задержка для порта Line96 3,m3,m3a,m3b ; выводим линию 96 ячеек CSonAndDelay 5 ; код линии + CS call DelaySpeed ; задержка и скорость ;......................................................... ; Блок вывода N 6 ;......................................................... call CSoffandDelay ; выключить строку и задержка для порта Line96 2,m2,m2a,m2b ; выводим линию 96 ячеек CSonAndDelay 0 ; код линии + CS call DelaySpeed ; задержка и скорость ;......................................................... ; Блок вывода N 7 ;......................................................... call CSoffandDelay ; выключить строку и задержка для порта Line96 1,m1,m1a,m1b ; выводим линию 96 ячеек CSonAndDelay 4 ; код линии + CS call DelaySpeed ; задержка и скорость ;......................................................... ; Блок вывода N 8 ;......................................................... call CSoffandDelay ; выключить строку и задержка для порта Line96 0,m0,m0a,m0b ; выводим линию 96 ячеек CSonAndDelay 1 ; код линии + CS call DelaySpeed ; задержка и скорость ;========================================================= ;--------------------------------------------------------- ;` считывание кода символа из флэшки ;--------------------------------------------------------- cpi mTipEffect,0 bnz NoJobStroka call ReadNewSimbol ; out: mNewSimbol ;--------------------------------------------------------- ;========================================================= ;--------------------------------------------------------- ; обработка эффектов ;--------------------------------------------------------- cpi mNewSimbol,'/' ; > признак эффекта ? bnz NoEffekt ; нет эффекта clrf mCountDop ; clrf mCountEff ; циклы колво эффектов call incADDRsimbol ; следующий адрес call ReadNewSimbol ; выборка типа эффекта mov mTipEffect,mNewSimbol call UstModeEffect ; установить тип эффекта call incADDRsimbol ; следующий адрес call ReadNewSimbol ; установка величины параметра ; cpi mNewSimbol,'8' '9' ; макс скорость ; bz = 0 movlw 0x30 ; 30 -> 37 subwf mNewSimbol,f movlw 0x07 ; 0 -> 7 andwf mNewSimbol,f ; cpi mTipEffect,'L' ; только ; bz UstSpeedLow ; для cpi mTipEffect,'s' ; установки bz UstSpeedQwylle ; скорости cpi mTipEffect,'S' ; установки bz UstSpeedQwylle ; скорости swapf mNewSimbol,w ; movwf mTimeEffect ; умножить на 16 movlw 0xF0 ; от 50 до 250 andwf mTimeEffect,f ; очистка movlw .50 addwf mTimeEffect,f mvi mNewSimbol,.32 ; вместо кода 0х08 goto OutEffekt ; выход из эффекта ;--------------------------------------------------------- UstSpeedLow: bcf FModeSpeed ; режим вывода скорости comf mNewSimbol,w ; movwf mSpeed ; movlw 0x07 ; andwf mSpeed,f ; clrf mTipEffect ; эффект выполнен goto OutEffekt ; выход из эффекта ;--------------------------------------------------------- UstSpeedQwylle: bsf FModeSpeed ; режим вывода скорости comf mNewSimbol,w ; movwf mSpeed ; movlw 0x07 ; andwf mSpeed,f ; clrf mTipEffect ; эффект выполнен goto OutEffekt ; выход из эффекта ;--------------------------------------------------------- OutEffekt: call incADDRsimbol ; следующий адрес call ReadNewSimbol ; установка величины параметра clrf PosZG ; начало символа знакогенератора NoEffekt: ;========================================================= ;--------------------------------------------------------- ; признак конца ;--------------------------------------------------------- cpi mNewSimbol,0x08; признак конца ? bnz NormaOutZG ; clrf mFlashLr ; все сначала mvi mFlashHr,0x08 ; после 2-х КБ mvi mNewSimbol,.32 ; вместо кода 0х08 ;--------------------------------------------------------- NormaOutZG: ; знакоместо равно ширине символа ;--------------------------------------------------------- call NewStolbFromZG ;in: mNewSimbol -> out: mNewSolb cpi mNewSimbol,0xDB; из-за пробела bz FollowPosZG ; между вертикалями cpi mNewSimbol,0xFB; Ы ы это не bz FollowPosZG ; cpi mNewSimbol,.32 ; пробел весь символ лысый bz FollowPosZG ; cpi PosZG,2 ; не может быть в знаке bc FollowPosZG ; менее 3-х столбиков cpi mNewSolb,0 ; bz MadeNewSimbol FollowPosZG: incf PosZG,f ; позиция в знакогенераторе cpi PosZG,8 ; при ZG = 8x8 bnz ObxodZG ; продолжаем считывать знакогенератор MadeNewSimbol: clrf PosZG ; начало символа знакогенератора call incADDRsimbol ; следующий адрес в тексте ObxodZG: btfsc Finv ; если установлен флаг comf mNewSolb,f ; инвертировать ;========================================================= NoJobStroka: ;--------------------------------------------------------- ; расчет скорости в медленном режиме ; сдвиги строки и вывод эффектов ;--------------------------------------------------------- btfsc FModeSpeed ; режим вывода скорости goto NoModeSpeedLow ; 0 - низкая скорость incf RepeatSP,f ; mov bcount,mSpeed ; 0 -> 7 = 8 градаций rlf bcount,f ; приведение входгого байта bcf bcount,0 ; скорости в норму movlw .21 ; output = (input * 2) + 21 addwf bcount,f ; 21 -> 37 cmp RepeatSP,bcount; 30=4 раза в сек bnz BaseCucSymbol ; 20 = min уже двоится clrf RepeatSP ; real 20-50 NoModeSpeedLow: ;--------------------------------------------------------- ;========================================================= ;--------------------------------------------------------- ; ; выполнение эффектов ;--------------------------------------------------------- cpi mTipEffect,'D' ; эффект ухода вниз bz ExeDown cpi mTipEffect,'d' ; эффект ухода вниз bz ExeDown cpi mTipEffect,'U' ; эффект ухода вверх bz ExeUp cpi mTipEffect,'u' ; эффект ухода вверх bz ExeUp cpi mTipEffect,'J' ; эффект раздвигания bz ExeLeftRight cpi mTipEffect,'j' ; эффект раздвигания bz ExeLeftRight cpi mTipEffect,'W' ; эффект удержания надписи bz ExeWait cpi mTipEffect,'w' ; эффект удержания надписи bz ExeWait cpi mTipEffect,'F' ; эффект заполнения FF bz ExeFill cpi mTipEffect,'f' ; эффект заполнения FF bz ExeFill clrf mTipEffect ; эффект выполнен call SdwigRamStrokiLeft ; сдвигаем строку влево goto BaseCucSymbol ; ;--------------------------------------------------------- ExeDown: incf mCountDop,f ; cpi mCountDop,.3 ; bnz BaseCucSymbol ; clrf mCountDop ; call CucDown incf mCountEff,f ; циклы кол-во cpi mCountEff,.10 ; повторов эффектов bnz BaseCucSymbol ; clrf mTipEffect ; эффект выполнен goto BaseCucSymbol ; ;--------------------------------------------------------- ExeUp: incf mCountDop,f ; cpi mCountDop,.3 ; bnz BaseCucSymbol ; clrf mCountDop ; call CucUP incf mCountEff,f ; циклы кол-во cpi mCountEff,.10 ; повторов эффектов bnz BaseCucSymbol ; clrf mTipEffect ; эффект выполнен goto BaseCucSymbol ; ;--------------------------------------------------------- ExeLeftRight: call CheckRazdvig ; раздвигаем строку incf mCountEff,f ; циклы кол-во cpi mCountEff,.50 ; повторов эффектов bnz BaseCucSymbol ; clrf mTipEffect ; эффект выполнен goto BaseCucSymbol ; ;--------------------------------------------------------- ExeWait: decf mTimeEffect,f bnz BaseCucSymbol clrf mTipEffect ; эффект выполнен goto BaseCucSymbol ; ;--------------------------------------------------------- ExeFill: mvi mNewSolb,0xFF ; call SdwigRamStrokiLeft ; сдвигаем строку влево incf mCountEff,f ; циклы кол-во cpi mCountEff,.96 ; повторов эффектов bnz BaseCucSymbol ; clrf mTipEffect ; эффект выполнен goto BaseCucSymbol ; ;********************************************************* ;********************************************************* ;********************************************************* ; / - Y R G ; /R - собирание букв в начале строки ; /Z - остановить и стереть хаотично, по окончании пуск ; /I - инверсия ; /N - не инверсия, нормально ; /Q - (qwikle) очистить бысtро табло ; /U - (up) выдвинуть вверх (in move=stop news) ; /D - (down) выдвинуть вниз (in move=stop news) ; /J - (J) разъехаться в разные строны (in move=stop news) ; /F - (fill) заполнить кодом, по окончании пуск ; /A - (Add) добавить кодом, по окончании пуск ; /S - (speed) скорость движения строки ; 3-й символ скорость, если символ не цифра ничего не делать ; /W - (wait) задержка написанной фразы на N-секунд ; 3-й символ время в секундах, если символ не цифра = 1 сек ;--------------------------------------------------------- UstModeEffect: ; установить тип эффекта ;--------------------------------------------------------- ; cpi mSpec,'Z' ; эффект хаотичного стирания ; bz EffectsXaos cpi mTipEffect,'I' ; установка инверсии bz EffectsInvers ; cpi mTipEffect,'i' ; установка инверсии bz EffectsInvers ; cpi mTipEffect,'N' ; номальный вывод bz EffectsNorma ; cpi mTipEffect,'n' ; номальный вывод bz EffectsNorma ; cpi mTipEffect,'Q' ; эффект быстрого стирания bz EffectsQUKLY cpi mTipEffect,'q' ; эффект быстрого стирания bz EffectsQUKLY cpi mTipEffect,'D' ; эффект ухода вниз rz cpi mTipEffect,'U' ; эффект ухода вверх rz cpi mTipEffect,'J' ; эффект раздвигания rz cpi mTipEffect,'W' ; эффект удержания надписи rz cpi mTipEffect,'F' ; эффект заполнения FF rz cpi mTipEffect,'S' ; быстро - скорость rz ; cpi mTipEffect,'L' ; медленно - скорость ; rz return ;========================================================= EffectsInvers: ;========================================================= bsf Finv clrf mTipEffect ; эффект выполнен return ;========================================================= EffectsNorma: ;========================================================= bcf Finv clrf mTipEffect ; эффект выполнен return ;========================================================= EffectsQUKLY: ; эффект быстрого стирания ;========================================================= call ClearTablo ; mvi mTipEffect,'W' return ;******************************************************** CucUP: ;******************************************************** clrf mSpecDOP UP0: mvi FSR,0x20 ; pageFsr0 ; для косв. адресации movf mSpecDOP,w ; addwf FSR,f ; rrf INDF,f ; bcf INDF,7 incf mSpecDOP,f ; cpi mSpecDOP,.32 ; bnz UP0 ;-------------------------------------------------------- clrf mSpecDOP UP1: mvi FSR,0x20 ; pageFsr1 ; для косв. адресации movf mSpecDOP,w ; addwf FSR,f ; rrf INDF,f ; bcf INDF,7 incf mSpecDOP,f ; cpi mSpecDOP,.32 ; bnz UP1 ;-------------------------------------------------------- clrf mSpecDOP UP2: mvi FSR,0x20 ; pageFsr2 ; для косв. адресации movf mSpecDOP,w ; addwf FSR,f ; rrf INDF,f ; bcf INDF,7 incf mSpecDOP,f ; cpi mSpecDOP,.32 ; bnz UP2 ;-------------------------------------------------------- clrf STATUS return ;******************************************************** CucDown: ;******************************************************** clrf mSpecDOP DownOneBank00: mvi FSR,0x20 ; pageFsr0 ; для косв. адресации movf mSpecDOP,w ; addwf FSR,f ; rlf INDF,f ; bcf INDF,0 incf mSpecDOP,f ; cpi mSpecDOP,.32 ; bnz DownOneBank00 ; ;-------------------------------------------------------- clrf mSpecDOP DownTwoBank00: mvi FSR,0x20 ; pageFsr1 ; для косв. адресации movf mSpecDOP,w ; addwf FSR,f ; rlf INDF,f ; bcf INDF,0 incf mSpecDOP,f ; cpi mSpecDOP,.32 ; bnz DownTwoBank00 ; ;-------------------------------------------------------- clrf mSpecDOP DownTwoBank020: mvi FSR,0x20 ; pageFsr2 ; для косв. адресации movf mSpecDOP,w ; addwf FSR,f ; rlf INDF,f ; bcf INDF,0 incf mSpecDOP,f ; cpi mSpecDOP,.32 ; bnz DownTwoBank020 ; ;-------------------------------------------------------- clrf STATUS return ;///////////////////////////////////////////////////// ;**************************************************************** ;************************************************************** BSTART: ; эта подпрограмма генерирует бит начала ;************************************************************** bsf sdata ; data -> 1 TrisOut ; линии роrта data и clock на вывод bcf sclk ; clock -> 0 nop nop nop bsf sclk ; clock -> 1 nop nop clrwdt ; сброс WDT таймера nop nop bcf sdata ; для бита старта data -> 0 nop ; clock -> 1 nop nop nop nop ; задержка bcf sclk ; конец старт бита nop nop retlw 0 ;************************************************************ BSTOP: ; эта подпрограмма генерирует бит конца ;************************************************************** bcf sdata ; data -> 0 TrisOut ; линии роrта data и clock на вывод bcf sdata ; clock -> 0 nop nop nop bsf sclk ; clock -> 1 nop clrwdt ; сброс WDT таймера nop bsf sdata ; data -> 1 nop nop ; для стоп бита nop bcf sclk ; clock -> 0 nop nop nop ; во время ожидания bsf sclk ; установить лог.1 retlw 0 ;************************************************************* BITOUT: ; передача одного бита ;************************************************************** TrisOut ; линии роrта data и clock на вывод btfss do ; проверка состояния порта data goto bitlow ; 0 ? переход на установку 0 bsf sdata ; 1 ? data -> 1 goto clkout ; переход на выдачу тактового имп ;------------------------------------------------------------- bitlow bcf sdata ; data -> 0 nop clkout bsf sclk ; clock -> 1 nop nop clrwdt ; сброс WDT таймера nop bcf sclk ; clock -> 0 retlw 0 ;************************************************************** BITIN: ; прием одного бита ;************************************************************** bsf di ; учесть что bit -> 1 TrisIn ; линию порта clock на ввод ; >>>>> bsf sdata ; sdata на прием bsf sclk ; clock -> 1 nop ; задержка nop clrwdt ; сброс WDT таймера nop nop ; btfss sdata ; читаем data bit bcf di ; входной bit ->0,уст'di' соответственно bcf sclk ; clock -> 0 retlw 0 ; ;**************************************************************** TX24c64: ; Передача байта из 'datao' ;**************************************************************** movlw .8 ; во внешнюю память movwf countee ; уст счетчик бит = 8 TXLP: ; bcf do ; убедиться что бит снаружи = 0 btfsc txbuf,7 ; bit = 0 ? bsf do ; нет, установить = 1 call BITOUT ; выдача бита в serial EE rlf txbuf, F ; сдвинуть влево буфер передачи decfsz countee,F ; прошло 8 bit ? goto TXLP ; нет - повтор call BITIN ; читаем ack bit retlw 0 ; ;**************************************************************** RX24c64: ; Принимает байт в регистр 'datai' из внешней памяти . ;**************************************************************** clrf datai ; очистить input buffer movlw .8 ; уст счетчик бит = 8 movwf countee bcf STATUS,CR ; RXLP: rlf datai,F ; сдвинуть datai на 1 влево call BITIN ; читаем bit btfsc di bsf datai,0 ; уст bit 0 если необходимо decfsz countee, F ; прошло 8 bit ? goto RXLP ; нет - повтор bsf do ; уст ack bit = 1 call BITOUT ; окончание передачи retlw 0 ;********************************************************* WriteRx: ;********************************************************* btfss FrecEnable ; пишем только если флаг=1 return call BSTART ; выдать start bit movlw b'10100000' ; уст прием адреса режим записи movwf txbuf ; в буфер передачи call TX24c64 ; и передаем movf mFlashHr,w ; старший адрес movwf txbuf ; в буфер передачи call TX24c64 ; и передаем movf mFlashLr,w ; младший адрес movwf txbuf ; в буфер передачи call TX24c64 ; и передаем movf RxByte,w ; записываемые данные movwf txbuf ; в буфер передачи call TX24c64 ; и передаем call BSTOP ; выдать stop bit return ;************************************************************* waitRec24cXX:; ПОДПРОГРАММА ЗАДЕРЖКИ ;************************************************************* mvi loops,.50 top: movlw .110 ; переменная корректировки времени movwf loops2 top2: nop ; задержка nop nop clrwdt ; сброс WDT таймера nop nop decfsz loops2, F ; внутренние циклы завершены ? goto top2 ; нет , повтор ; decfsz loops, F ; внешние циклы завершены ? goto top ; нет , повтор retlw 0 ; да, возврат ;**************************************************************** ;**************************************************************** ;//////////////////////////////////////////////////////////////// ;**************************************************************** ;**************************************************************** ;**************************************************************** DelaySpeed: ;**************************************************************** btfss FModeSpeed ; 0 - низкая скорость goto Delay255 ; 0-7 = 8 градаций mov bcount,mSpeed ; movlw 5 ; addwf bcount,f ; 0-7 -> 4-12 DelaySpeedCuc: call Delay255 decfsz bcount,f goto DelaySpeedCuc return ;******************************************************* Delay255: ;******************************************************* mvi mDelay,.255 ; goto Dcuc ;******************************************************* Dcuc: ;******************************************************* clrwdt decfsz mDelay,f goto Dcuc return ;******************************************************* ClearREG: ; очистка строки не трогая память ;******************************************************* mvi bcount,.97 bcf DataLine ; data ИР2 CucReg: bcf ClkLine ; такт ИР2 clrwdt ; задержка bsf ClkLine ; такт ИР2 decfsz bcount,f ; goto CucReg ; return ;******************************************************* CSoffandDelay: ; выключить строку и задержка для порта ;******************************************************* clrf STATUS ; все в банке 0 bsf CSled ; выключить все светодиоды mvi mDelay,.55 ; устранение паразитной goto Dcuc ; засветки ;********************************************************* CheckRazdvig: ; раздвигаем строку ;********************************************************* clrf STATUS mvi FSR,0x20 ; pageFsr0 ; для косв. адресации Checkrz0: ; incf FSR,f ; movf INDF,w ; сначала считываем последующую decf FSR,f ; movwf INDF ; теперь пишем в предыдущую incf FSR,f ; cpi FSR,0x3f ; bnz Checkrz0 ;------------------------------------------------------ clrf STATUS bsf STATUS,5 ; page 1 movf 0x20,w clrf STATUS ; page 0 movwf 0x3f ;------------------------------------------------------ mvi FSR,0x20+0x80 ; pageFsr1 r2dl1: ; incf FSR,f ; movf INDF,w ; сначала считываем последующую decf FSR,f ; movwf INDF ; теперь пишем в предыдущую incf FSR,f ; cpi FSR,0xAf ; bnz r2dl1 ;------------------------------------------------------ page1 mov 0x2F,mNewSolb ; новый столб в конец строки ; clrf 0x2F ; новый столб в конец строки ;====================================================== clrf STATUS mvi FSR,0x3f ; pageFsr2 ; для косв. адресации Checkrz1: decf FSR,f ; movf INDF,w ; сначала считываем последующую incf FSR,f ; movwf INDF ; теперь пишем в предыдущую decf FSR,f ; cpi FSR,0x20 ; bnz Checkrz1 ;------------------------------------------------------ page1 movf 0x3F,w page2 movwf 0x20 ;------------------------------------------------------ clrf STATUS mvi FSR,0x3f ; pageFsr1 ; для косв. адресации Checkrzw: decf FSR,f ; movf INDF,w ; сначала считываем последующую incf FSR,f ; movwf INDF ; теперь пишем в предыдущую decf FSR,f ; cpi FSR,0xB0 ; bnz Checkrzw ;************************************************************** page1 mov 0x30,mNewSolb; новый столб в конец строки ; clrf 0x30 ; новый столб в конец строки clrf STATUS return ;******************************************************* SdwigRamStrokiLeft: ; сдвигаем строку влево ;******************************************************* clrf STATUS mvi FSR,0x20 ; s2dl0: ; incf FSR,f ; W->W !!! movf INDF,w ; сначала считываем последующую decf FSR,f ; movwf INDF ; теперь пишем в предыдущую incf FSR,f ; cpi FSR,0x3f ; btfss FSR,4 ??? bnz s2dl0 ; goto s2dl0 ;------------------------------------------------------ clrf STATUS bsf STATUS,5 ; page 1 movf 0x20,w clrf STATUS ; page 0 movwf 0x3f ;------------------------------------------------------ mvi FSR,0x20+0x80 ; pageFsr1 s2dl1: ; incf FSR,f ; movf INDF,w ; сначала считываем последующую decf FSR,f ; movwf INDF ; теперь пишем в предыдущую incf FSR,f ; cpi FSR,0xDf ; bnz s2dl1 ;------------------------------------------------------ clrf STATUS bsf STATUS,6 ; page 2 movf 0x20,w page1 movwf 0x3f clrf STATUS ;------------------------------------------------------ mvi FSR,0x20 ; pageFsr2 ; для косв. адресации s2dl2: ; incf FSR,f ; movf INDF,w ; сначала считываем последующую decf FSR,f ; movwf INDF ; теперь пишем в предыдущую incf FSR,f ; cpi FSR,0x3f ; bnz s2dl2 ;------------------------------------------------------ page2 mov 0x3F,mNewSolb ; новый столб в конец строки clrf STATUS return ;************************************************** ClearTablo: ;************************************************** ; tablo 1 = 20h-3Fh bank 1 ; tablo 2 = 20h-3Fh bank 2 ; tablo 3 = 20h-3Fh bank 3 clrwdt ; сброс WDT таймера ;--------------------------------------------------- movlw 0x20 ; очистка movwf FSR ; всей pageFsr0 ; для косв. адресации clear_memT0: ; clrf INDF ; памяти incf FSR,f ; т.е. запись во все cpi FSR,0x40 ; ячейки = 0 bnz clear_memT0 ;------------------------------------------------------ movlw 0x20 ; очистка movwf FSR ; всей pageFsr1 ; для косв. адресации clear_memT1: ; clrf INDF ; памяти incf FSR,f ; т.е. запись во все cpi FSR,0x40+0x80 ; ячейки = 0 bnz clear_memT1 ;--------------------------------------------------- movlw 0x20 ; очистка movwf FSR ; всей pageFsr2 ; для косв. адресации clear_memT2: ; clrf INDF ; памяти incf FSR,f ; т.е. запись во все cpi FSR,0x40 ; ячейки = 0 bnz clear_memT2 ;------------------------------------------------------ clrwdt ; сброс WDT таймера clrf STATUS return ;****************************************************** ClearAll: ;****************************************************** movlw 0x20 ; очистка movwf FSR ; всей pageFsr0 ; для косв. адресации clear_mem02: ; clrf INDF ; памяти incf FSR,f ; т.е. запись во все cpi FSR,0x7f ; ячейки = 0 bnz clear_mem02 ;------------------------------------------------------ movlw 0x20 ; очистка movwf FSR ; всей pageFsr1 ; для косв. адресации clear_mem12: ; clrf INDF ; памяти incf FSR,f ; т.е. запись во все cpi FSR,0xff ; ячейки = 0 bnz clear_mem12 ;------------------------------------------------------ movlw 0x20 ; очистка movwf FSR ; всей pageFsr2 ; для косв. адресации clear_mem22: ; clrf INDF ; памяти incf FSR,f ; т.е. запись во все cpi FSR,0x7f ; ячейки = 0 bnz clear_mem22 ;------------------------------------------------------ clrf STATUS return ;****************************************************** incADDRsimbol: ; следующий адрес в тексте ;****************************************************** incf mFlashLr,f ; rnz ; нет превышения адреса incf mFlashHr,f ; cpi mFlashHr,0x00; rnz ; нет превышения адреса clrf mFlashLr ; все сначала mvi mFlashHr,0x08; после 2-х КБ return ;********************************************************* ReadNewSimbol: ; читаем новый символ ;********************************************************* call BSTART ; выдаем старт бит movlw b'10100000' ; уст прием адреса режим записи movwf txbuf ; получить адрес (write mode) call TX24c64 ; отправляем в устройство movf mFlashHr,w ; старший адрес movwf txbuf ; в буфер передачи call TX24c64 ; и передаем movf mFlashLr,w ; movwf txbuf ; передаем младший адрес call TX24c64 ; call BSTART ; теперь читaем байт из адреса movlw b'10100001' ; получить адрес (rеаd mode) movwf txbuf ; в буфер передачи call TX24c64 ; отправляем в устройство call RX24c64 ; читаем 1 байт из serial EE call BSTOP ; посылаем стоп бит mov mNewSimbol,datai ; return ;********************************************************* NewStolbFromZG: ; новый столб в RAM ;********************************************************* mov countee,mNewSimbol; вычисляем rlf countee,f ; адрес нового rlf countee,f ; символа rlf countee,w ; 8х8 movwf mFlashLzg ; чистый младший адрес movlw 0xF8 ; правые 3 бита = 0 andwf mFlashLzg,f ; мл адрес movf PosZG,w ; позиция в знакогенераторе addwf mFlashLzg,f ; полный мл адрес ;-------------------------------------------------------- swapf mNewSimbol,f ; только 3 бита rrf mNewSimbol,w ; andlw 0x07 ; начало ZG movwf mFlashHzg ; готовый ст адрес ;-------------------------------------------------------- call BSTART ; выдаем старт бит movlw b'10100000' ; уст прием адреса режим записи movwf txbuf ; получить адрес (write mode) call TX24c64 ; отправляем в устройство mov txbuf,mFlashHzg ; старший адрес call TX24c64 ; и передаем movf mFlashLzg,w ; movwf txbuf ; передаем младший адрес call TX24c64 ; call BSTART ; теперь читaем байт из адреса movlw b'10100001' ; получить адрес (rеаd mode) movwf txbuf ; в буфер передачи call TX24c64 ; отправляем в устройство call RX24c64 ; читаем 1 байт из serial EE call BSTOP ; посылаем стоп бит mov mNewSolb,datai ; return ;************************************************************* End ; BrSoft Copyright (C) 2009 Bogdanov Andrew ;*************************************************************