;+++++++++++++++++++++++++++++++++++++++++++++++
;проверка алгоритма (вывод номеров столов)
;RA1 желательно подключить к земле
;+++++++++++++++++++++++++++++++++++++++++++++++

;===============================================
;общие настройки МК
;===============================================
;тактовая частота 4 МГц
;внутренний генератор


list  p=16f628a
#include p16f628a.inc
__CONFIG 03F30h
;===============================================
;определение выводов портов
;===============================================
;DB=PORTB выход/вход (по ходу программы)
#define	RS	PORTA,2		;выход
#define	RW	PORTA,3		;выход
#define	E	PORTA,4		;выход
#define	Rx	PORTA,1		;вход
;===============================================
;определение переменных
;===============================================
CBLOCK	0x20
T_ext	:1	;таймер внешнего цикла
T_int	:1	;таймер внутреннего цикла
T_n	:1	;таймер начальной задержки
address	:1	;адрес ячейки ЖКИ
symbol	:1	;выводимый знак ЖКИ
ENDC
;===============================================
;начало программы
;===============================================
org 0
;===============================================
;предварительные настройки
;===============================================
banksel	CMCON		;выключить кампараторы (отрубить от PORTA)
MOVLW	0x07
MOVWF	CMCON

banksel	PORTA	;инициализация защёлок портов
CLRF	PORTA
CLRF	PORTB

banksel	TRISB	;настройка направлений портов
MOVLW	0b00000000	;PORTB на выход
MOVWF	TRISB
MOVLW	0b00010		;PORTA на выход, кроме RA1(Rx)
MOVWF	TRISA

banksel	PORTA	;возвращение в банк 0
;===============================================
;конец предварительных настроек
;===============================================
;+++++++++++++++++++++++++++++++++++++++++++++++
;===============================================
;начало инициализации ЖКИ
;===============================================
;function set

MOVLW	0b00111000	;2-line mode, display on
MOVWF	PORTB
BCF	RS
BCF	RW
CALL	delay_30ms
CALL	strob

CALL	delay_39us

;display on/off control
MOVLW	0b00001110	;вкл. дисплей, вкл. курсор, выкл. мерцание
MOVWF	PORTB
CALL	strob

CALL	delay_39us

;display clear
MOVLW	0b00000001
MOVWF	PORTB
CALL	strob

CALL	delay_1.53ms

;entry mode set
MOVLW	0b00000110	;автосдв. курсора вправо, сдв. диспл. выкл.
MOVWF	PORTB
CALL	strob

CALL	delay_39us
;===============================================
;конец инициализации ЖКИ
;===============================================
;+++++++++++++++++++++++++++++++++++++++++++++++
;===============================================
;вывод номеров столов
;===============================================
;числа 1=0b00110001, 2=0b00110010, 3=0b00110011, 4=0b00110100
;позиции 1=0x00, 2=0x08, 3=0x40, 4=0x48
;===============================================
MOVLW	0x00	;вывод 1
MOVWF	address
MOVLW	0b00110001
MOVWF	symbol
CALL	znak
;===============================================
;конец вывода номеров столов
;===============================================
;+++++++++++++++++++++++++++++++++++++++++++++++
;===============================================
;конец программы (просто зацикливание)
konec:
NOP
GOTO	konec
;===============================================
;+++++++++++++++++++++++++++++++++++++++++++++++
;===============================================
;подпрограмма вывода знака symbol в ячейку address
;===============================================
znak:

MOVF	address,0		;вывод адреса
MOVWF	PORTB
BCF	RS
CALL	strob
CALL	delay_39us

MOVF	symbol,0		;вывод символа
MOVWF	PORTB
BSF	RS
CALL	strob
CALL	delay_39us

RETURN
;===============================================
;подпрограмма стробирования по Е
;===============================================
strob:

BSF	E
NOP		;задержка 2 мкс
NOP
BCF	E

RETURN
;===============================================
;+++++++++++++++++++++++++++++++++++++++++++++++
;===============================================
;подпрограммы задержек
;===============================================
delay_30ms:
movlw	.200
movwf	T_n	;загрузить значение для внешнего цикла
cikl4:
movlw	.50
movwf	T_int	;загрузить значение для внутреннего цикла
cikl5:
nop
decfsz	T_int,1
goto	cikl5	;внутренний цикл
decfsz	T_n,1
goto	cikl4	;внешний цикл
RETURN

delay_39us:
movlw	.50
movwf	T_int	;загрузить значение таймера для паузы в T_int
cikl1:
nop
nop
nop
nop
nop
nop
decfsz	T_int,1
goto	cikl1
RETURN

delay_1.53ms:
movlw	.25
movwf	T_ext	;загрузить значение для внешнего цикла
cikl2:
movlw	.50
movwf	T_int	;загрузить значение для внутреннего цикла
cikl3:
decfsz	T_int,1
goto	cikl3	;внутренний цикл
decfsz	T_ext,1
goto	cikl2	;внешний цикл
RETURN
;===============================================
;конец подпрограмм задержек
;===============================================
;+++++++++++++++++++++++++++++++++++++++++++++++
END
;+++++++++++++++++++++++++++++++++++++++++++++++
;конец программы
;+++++++++++++++++++++++++++++++++++++++++++++++