Если это тот что 128х64 из двух половинок, то вот для пропорционального шрифта высотой 24 пикселя. легко переделать на 8, 16, 32 итд (кратное 8).
Спойлер
Код:
; Подпрограмма вывода сообщения по указателю msg_ptr
; координаты msg_x (0...127) и msg_y (0...7)
; бит clrarea означает красить чёрным (0) или белым (1).
; аргументы сохраняются. Используется FSR.
writemsg:
movlw 3 ; число записываемых слайсов
movwf slicecnt
wrnextslice:
decf slicecnt
movlw 1 << _cs1 ; выбираем первый кристалл
btfsc msg_x, 6
movlw 1 << _cs2 ; выбираем второй кристалл
movwf porta
movlw b'00111111'
andwf msg_x, w
addlw setx
call wrLCDreg ; устанавливаем адрес по-горизонтали
movf slicecnt, w
sublw 2
addwf msg_y, w
andlw b'00000111'
addlw sety
call wrLCDreg
;
movf msg_x, w
movwf msgxcounter
btfsc msgxcounter, 6 ; Переменная msgxcounter содержит два признака:
bsf msgxcounter, 7 ; 6-й бит - переход границы полуэкранов
bcf msgxcounter, 6 ; 7-й - переход уже был.
movf msg_ptr, w
movwf FSR
;
wrnextchar:
bcf status, c ; Берем из таблицы ctable сколько байт занимает
rlf indf, w ; выводимый символ.
banksel EEadr
addlw low(ctable)
movwf EEadr
movlw high(ctable)
movwf EEadrH
skpnc
incf EEadrH
banksel EEcon1
bsf EEcon1, EEPGD
bsf EEcon1, RD
nop
nop
banksel EEdata
movf EEdata, w
banksel bytecount
movwf bytecount
;
banksel EEadr ; В следующей ячейке этой же таблицы хранится
incf EEadr ; смещение начала символа от начала таблицы
skpnz
incf EEadrH
banksel EEcon1
bsf EEcon1, EEPGD
bsf eecon1, rd
nop
nop
;
banksel slicecnt ; К нему прибавляем значение счетчика слайсов
movf slicecnt, w
banksel EEadr
addwf EEdata, w
movwf EEadr
clrw
skpnc
movlw 1
addwf EEdatH, w
movwf EEadrH ;
;
movlw low(ftable)
addwf EEadr
skpnc
incf EEadrH
movlw high(ftable)
addwf EEadrH
;
wrnextbyte:
banksel EEcon1
bsf EEcon1, eepgd
bsf EEcon1, rd
nop
nop
banksel EEdata
movf EEdata, w
banksel 0
btfsc clrarea
xorlw 0xff
call wrLCDdata
;
banksel EEadr
movlw 3
addwf EEadr
skpnc
incf EEadrH
banksel bytecount
;
decf bytecount
incf msgxcounter
btfsc msgxcounter, 6
goto secondside
;
contsecside:
movf bytecount ; если не все байты символа записаны - к следующему
bnz wrnextbyte
;
incf FSR ; Передвигаем указатель на следующий символ
movlw 0xff ; и проверяем на код 0xFF - признак конца строки
xorwf indf, w
bnz wrnextchar
;
checkslice:
movf slicecnt
skpz
goto wrnextslice
return
;
;
secondside:
btfsc msgxcounter, 7 ; проверяем до какой границы дошли
goto checkslice ; если до правой - дальше ничего не рисуем
movlw 1 << _cs2 ; выбираем правый кристалл
movwf porta
movf slicecnt, w
sublw 2
addwf msg_y, w
andlw b'00000111'
addlw sety
call wrLCDreg
;
movlw setx
call wrLCDreg ; координата X всегда равна 0
bcf msgxcounter, 6
bsf msgxcounter, 7
goto contsecside
;
Шрифт располагается в ПЗУ программ. для примера черточка и двоеточие:
Код:
ftable:
.....
charC:
data b'00000000', b'00000000', b'00000000'
data b'00000000', b'00111100', b'00000000'
data b'00000000', b'00111100', b'00000000'
data b'00000000', b'00111100', b'00000000'
data b'00000000', b'00111100', b'00000000'
data b'00000000', b'00111100', b'00000000'
data b'00000000', b'00111100', b'00000000'
data b'00000000', b'00111100', b'00000000'
data b'00000000', b'00000000', b'00000000'
charD:
data b'00000000', b'00000000', b'00000000'
data b'00000111', b'00000001', b'11000000'
data b'00001111', b'10000011', b'11100000'
data b'00001111', b'10000011', b'11100000'
data b'00001111', b'10000011', b'11100000'
data b'00000111', b'00000001', b'11000000'
data b'00000000', b'00000000', b'00000000'
charE:
ctable:
data (char1-char0)/3, (char0-char0) ; 0
data (char2-char1)/3, (char1-char0) ; 1
data (char3-char2)/3, (char2-char0) ; 2
data (char4-char3)/3, (char3-char0) ; 3
data (char5-char4)/3, (char4-char0) ; 4
data (char6-char5)/3, (char5-char0) ; 5
data (char7-char6)/3, (char6-char0) ; 7
data (char8-char7)/3, (char7-char0) ; 8
data (char9-char8)/3, (char8-char0) ; 9
data (charA-char9)/3, (char9-char0) ; 10
data (charB-charA)/3, (charA-char0) ; 11
data (charC-charB)/3, (charB-char0) ; 12
data (charD-charC)/3, (charC-char0) ; 13
data (charE-charD)/3, (charD-char0) ; 14
data (charE-charD)/3, (charD-char0) ; 15
c_dash EQU 12
c_col EQU 13