Шрифт для KS0108

Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Пт июн 05, 2015 13:55:13
Откуда: Таганрог

Сообщение oscill »

Исходные данные: PIC16F877 + GLCD KS0108 + Proton v 3.5.6.5
Как вывести на экран шрифт размером 12х12 или чуть более ?
Если есть решение у кого ,поделитесь !
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7377
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

Если это тот что 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
Реклама
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Пт июн 05, 2015 13:55:13
Откуда: Таганрог

Сообщение oscill »

uldemir
Спасибо за пример, но "я тут BASIC`ами в основном балуюсь"
В общем в старых версиях Proton выводится штатным операторам ( PPrint) вполне корректно .
Друг Кота
Аватара пользователя
Сообщения: 7377
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

суть не в ассемблере или васике, а в структурах данных и манипуляциях с ними. Остальное - часности.
Реклама
Эиком - электронные компоненты и радиодетали
Ответить

Вернуться в «PIC»