;*************************************************************** ;#define pDspE PORTC,3 ; 6 -> E сброс Enable ;#define pDspRW PORTC,4 ; 5 -> WR чтение данных ;#define pDspRS PORTC,5 ; 4 -> RS обмен данными ; call Init1602 ; инициализация индикатора ; call DspClearAll ; очистить вecь индикатор ; mov mDdsHex,xxx ; hex -> дв.десятичный ; call Dds3 ; 3 разряда в подготовленное место ; call Dds2 ; 2 разряда в подготовленное место ; call hex ; 1 разряд в подготовленное место ; call write_char ; запись символа ; movlw 0x80 ; call write_cmd ; запись команд ; PosDsp 0x80 ; место на дисплее ; SymbolDsp Rus_d ; символ ;*************************************************************** ; таблица знакогенератора ; для winstar 1602 ;*************************************************************** Rus_B equ .160 ; Б Rus_G equ .161 ; Г Rus_IO equ .162 ; Rus_JJ equ .163 ; Ж Rus_Z equ .164 ; З Rus_I equ .165 ; И Rus_IK equ .166 ; Й Rus_L equ .167 ; Л Rus_P equ .168 ; П Rus_U equ .169 ; У Rus_F equ .170 ; Ф Rus_CH equ .171 ; Ч Rus_SH equ .172 ; Ш Rus_TZ equ .173 ; Ъ Rus_II equ .174 ; Ы Rus_EE equ .175 ; Э Rus_JU equ .176 ; Ю Rus_JA equ .177 ; Я Rus_b equ .178 ; б Rus_v equ .179 ; в Rus_g equ .180 ; г Rus_io equ .181 ; Rus_jj equ .182 ; ж Rus_z equ .183 ; з Rus_i equ .184 ; и Rus_ik equ .185 ; й Rus_k equ .186 ; к Rus_l equ .187 ; л Rus_m equ .188 ; м Rus_n equ .189 ; н Rus_p equ .190 ; п Rus_t equ .191 ; т Rus_ch equ .192 ; ч Rus_sh equ .193 ; ш Rus_tz equ .194 ; ъ Rus_ii equ .195 ; ы Rus_mz equ .196 ; ь Rus_ee equ .197 ; э Rus_iu equ .198 ; ю Rus_ia equ .199 ; я Rus_D equ .224 ; Д Rus_TC equ .225 ; Ц Rus_CC equ .226 ; Щ Rus_d equ .227 ; д Rus_f equ .228 ; ф Rus_tc equ .229 ; ц Rus_cc equ .230 ; щ ;************************* Rus_u equ 'y' ; y Rus_r equ 'p' ; p Rus_s equ 'c' ; c Rus_V equ 'B' ; B ;************************* Char_10 equ .123 ; маленькие цифры Char_12 equ .124 ; в стиле 7-сегментног Char_15 equ .125 ; индикатора Char_Bell equ .237 ; похож на колокольчик Char_Stars equ .238 ; типа евросоюз Char_Enter equ .126 ; Char_Nomber equ .204 ; Char_Paragr equ .253 ; Char_Left equ .219 ; стрелка с упором в линию Char_Right equ .220 ; Char_Up equ .217 ; Char_Down equ .218 ; Char_Back equ .200 ; << Char_Forward equ .201 ; >> Char_1_2 equ .242 ; 1/2 Char_1_3 equ .241 ; 1/3 Char_1_4 equ .240 ; 1/4 Char_3_4 equ .244 ; 3/4 ;************************************************************* ;///////////////////////////////////////////////////////////// ; ИНДИКАТОР 1602 ;///////////////////////////////////////////////////////////// ;--------------------------------------------------------- mDspHex equ 0x26 ; для вывода HEX mDspBin equ 0x27 ; для вывода BIN mDspError equ 0x28 ; сброс ошибки BUSY mDspCuc equ 0x29 ; для вывода в цикле ;--------------------------------------------------------- mDspCuc1 equ 0x2D ; на время работы процедуры mDspCuc2 equ 0x2E ; на время работы процедуры mDspCuc3 equ 0x2F ; на время работы процедуры ;************************************************************ PosDsp macro mesto ; movlw mesto ; позиция на дисплее call write_cmd ; записать команду endm ; SymbolDsp macro mesto ; movlw mesto ; символ на дисплее call write_char ; записать команду endm ; ;************************************************************* ;///////////////////////////////////////////////////////////// ;************************************************************* DspClearAll: ; очистить вecь индикатор ;************************************************************* call DspClearUp ; очистить верхнюю строку ;************************************************************* DspClearDown: ; очистить нижнюю строку ;************************************************************* movlw 0xC0 ; прямой адрес call write_cmd ; записать команду mvi mDspCuc3,16 ; ClearInd2: movlw ' ' ; прямой адрес call write_char ; очередной символ decfsz mDspCuc3,f goto ClearInd2 ; return ;************************************************************* DspClearUp: ; очистить верхнюю строку ;************************************************************* movlw 0x80 ; прямой адрес call write_cmd ; записать команду mvi mDspCuc3,16 ; ClearInd1: movlw ' ' ; прямой адрес call write_char ; очередной символ decfsz mDspCuc3,f goto ClearInd1 ; return ;************************************************************ HexDsp: ;************************************************************ swapf mDspHex,w call hex ; преобразовать в TXT формат call write_char ; очередной символ movf mDspHex,w call hex ; преобразовать в TXT формат goto write_char ; очередной символ ;************************************************************ BinDsp: ; вывод в BIN формате ;************************************************************ movlw '7' btfss mDspBin,7 movlw '.' call write_char ; очередной символ ;--------------------------------- movlw '6' btfss mDspBin,6 movlw '.' call write_char ; очередной символ ;--------------------------------- movlw '5' btfss mDspBin,5 movlw '.' call write_char ; очередной символ ;--------------------------------- movlw '4' btfss mDspBin,4 movlw '.' call write_char ; очередной символ ;--------------------------------- movlw '-' call write_char ; очередной символ ;--------------------------------- movlw '3' btfss mDspBin,3 movlw '.' call write_char ; очередной символ ;--------------------------------- movlw '2' btfss mDspBin,2 movlw '.' call write_char ; очередной символ ;--------------------------------- movlw '1' btfss mDspBin,1 movlw '.' call write_char ; очередной символ ;--------------------------------- movlw '0' btfss mDspBin,0 movlw '.' goto write_char ; очередной символ ;************************************************************ Dds3: ; 3 разряда ;************************************************************ call hextodec ; преобразовать Hex -> Des movf mDdsHigh,w ; сотни call hex ; преобразовать в TXT формат call write_char ; очередной символ goto dds2in ;************************************************************ Dds2: ; 2 разряда ;************************************************************ call hextodec ; преобразовать Hex -> Des dds2in: movf mDdsMid,w ; десятки call hex ; преобразовать в TXT формат call write_char ; очередной символ ;************************************************************ Dds1: ; 1 разряд ;************************************************************ movf mDdsLow,w ; единицы Dds1W: call hex ; преобразовать в TXT формат goto write_char ; очередной символ ;************************************************************ Dds512: ; 3 разряда до 512 ;************************************************************ call hextodec512 ; преобразовать 512 movf mDdsHigh,w ; сотни call hex ; преобразовать в TXT формат call write_char ; очередной символ movf mDdsMid,w ; десятки call hex ; преобразовать в TXT формат call write_char ; очередной символ movf mDdsLow,w ; единицы call hex ; преобразовать в TXT формат goto write_char ; очередной символ ;************************************************************* Init1602: ; инициализация индикатора ;************************************************************* movlw b'00111000' ; 8-х разрядная шина call write_cmd ; записать команду movlw b'00000001' ; очистка дисплея call write_cmd ; записать команду movlw b'00000010' ; начальная позиция call write_cmd ; записать команду movlw b'00000110' ; вправо, call write_cmd ; записать команду movlw b'00001100' ; вкл-дисплей,off-курсор ; movlw b'00001111' ; вкл-дисплей,on-курсор call write_cmd ; записать команду return ; нормальный выход ;************************************************************* del_ind equ .90 ; для частоты 16 Мгц ;************************************************************ write_stolb: ; запись stolbica ;************************************************************ movwf mDspCuc3 ; высота swapf mDspCuc3,f ; столбика rrf mDspCuc3,w ; макс 8 значений andlw 0x07 ; ; goto write_char ; запись символa ;************************************************************* write_char: ; запись символa ;************************************************************* ; clrf mDspError; сброс ошибки BUSY movwf PORTB ; write = уже 0 call busy ; готовность bsf pDspRS ; Нi - данные goto write_out ;************************************************************* write_cmd: ; запись команд ;************************************************************* ; clrf mDspError; сброс ошибки BUSY movwf PORTB ; write = уже 0 call busy ; готовность bcf pDspRS ; Lo - команды write_out: nop bcf pDspRW ; write данных write_cs: call del_csD ; задержка фронтов bsf pDspE ; уст Enable call del_csD ; задержка фронтов bcf pDspE ; сброс Enable ;************************************************************* del_csD: ; задержка фронтов ;************************************************************* ; return ;;;;;;;;;;;;;;;;; mvi mDspCuc1,del_ind; cuc_cs: clrwdt decf mDspCuc1,f bnz cuc_cs return ;************************************************************* busy: ; return ;;;;;;;;;;;;;;;;;; ;************************************************************* ; если здесь выбивает, значит глючит индикатор ;************************************************************* ; clrwdt ; call Delay10ms ; ЗАДЕРЖКA 10 ms = 100 Гц bsf pDspRW ; чтение данных clrf mDspCuc1 ; сброс 1 и пустая операция bcf pDspRS ; Lo - команды clrf mDspCuc2 ; сброс 2 и пустая операция bsf STATUS,RP0 ; cтраница 1 mvi TRISB,0xFF ; PB0-7=in ввод bcf STATUS,RP0 ; cтраница 0 busy_cuc: clrwdt decf mDspCuc1,f ; если счетчик1 = 0 bz busy_wait ; к проверке второго счетчика call write_cs ; сброс WDT таймера btfss PORTB,7 goto busy_cuc ; нет готовности bsf STATUS,RP0 ; cтраница 1 clrf TRISB ; PB0-7=out вывод bcf STATUS,RP0 ; cтраница 0 return ; нормальный выход busy_wait: decf mDspCuc2,f ; если счетчик = 0 bnz busy_cuc ; продолжить опрос mvi mDspError,.02; уст. ошибки BUSY return ; выход с ошибкой ;*************************************************************