📄 lcd.asm
字号:
;===========================================================
;FILE NAME :lcd.ASM
;===========================================================
;REALTED SYMBOLS
.include "x24x_app.h"
;--------------------------------------------------
;variables
;--------------------------------------------------
lcd_comdata .usect "lcd",1
lcd_temporary .usect "lcd",1
lcd_comdata_flg .usect "lcd",1 ;flag:0--command,1--data
lcd_column .usect "lcd",1
lcd_page .usect "lcd",1
lcd_count .usect "lcd",1 ;column count
lcd_bit_count .usect "lcd",1 ;send bit
lcd_innumber .usect "lcd",1 ;input number,decimal<10000
lcd_msb .usect "lcd",1
lcd_lsb .usect "lcd",1
lcd_number_flag .usect "lcd",1
;===================================================
;program
;--------------------------------------------------------------
.sect "vectors"
b _c_int0
b _c_int1
b _c_int2
b _c_int3
b _c_int4
b _c_int5
b _c_int6
.text
.def _c_int0
;GLOBAL SYMBOLS
.def lcd_comdata
.def lcd_innumber
.def lcd_temporary
_c_int0:
DINT
CALL sysinit
CALL lcd_ioconfigure
CALL lcd_init ;setting,clear screen,
;line of COM1(fixed),显示转速
**************************************************
aa
LDP #PEDATDIR>>7
LACL PEDATDIR
AND #0ffefH ;(IOPE4)BLE背光不使能(L)
; OR #010H ;(IOPE4)BLE背光使能(H)
SACL PEDATDIR
CALL delay_250
SPM 0 ;#####
LDP #lcd_innumber
SPLK #5608,lcd_innumber ;number test
CALL lcd_speed_display
LDP #lcd_innumber
SPLK #305,lcd_innumber ;number test
CALL lcd_speed_display
LDP #lcd_innumber
SPLK #70,lcd_innumber ;number test
CALL lcd_speed_display
LDP #lcd_innumber
SPLK #8,lcd_innumber ;number test
CALL lcd_speed_display
LDP #lcd_innumber
SPLK #0,lcd_innumber ;number test
CALL lcd_speed_display
nop
nop
B aa
;===============================================
lcd_speed_display: ;10进制4位数显示
SPM 0 ;#####
LDP #lcd_number_flag
SPLK #0,lcd_number_flag ;display 0 or not
LDP #lcd_temporary
SPLK #1000,lcd_temporary
LACL lcd_innumber ;inpute number
RPT #15
SUBC lcd_temporary
SACL lcd_temporary ;千位
SACH lcd_innumber ;余数
LACC lcd_temporary
ADD lcd_number_flag ;+0
SACL lcd_number_flag
BCND lcd_bit4,GT
SPLK #10,lcd_temporary ;blank
lcd_bit4
LDP #lcd_msb ;column 64
SPLK #014H,lcd_msb
SPLK #0H,lcd_lsb
LT lcd_temporary
MPY #18
PAC
LDP #lcd_count
SACL lcd_count ;pointer
CALL send_number
LDP #lcd_temporary ;百位
SPLK #100,lcd_temporary ;
LACL lcd_innumber
RPT #15
SUBC lcd_temporary
SACL lcd_temporary ;hundred
SACH lcd_innumber
LACC lcd_temporary
ADD lcd_number_flag ;+0
SACL lcd_number_flag
BCND lcd_bit3,GT
SPLK #10,lcd_temporary ;blank
lcd_bit3
LDP #lcd_msb ;column 73
SPLK #014H,lcd_msb
SPLK #09H,lcd_lsb
LT lcd_temporary
MPY #18
PAC
LDP #lcd_count
SACL lcd_count ;pointer
CALL send_number
LDP #lcd_temporary ;十位
SPLK #10,lcd_temporary
LACL lcd_innumber
RPT #15
SUBC lcd_temporary
SACL lcd_temporary ;decade
SACH lcd_innumber ;个位
LACC lcd_temporary
ADD lcd_number_flag ;+0
SACL lcd_number_flag
BCND lcd_bit2,GT
SPLK #10,lcd_temporary ;blank
lcd_bit2
LDP #lcd_msb ;column 82
SPLK #015H,lcd_msb
SPLK #02H,lcd_lsb
LT lcd_temporary
MPY #18
PAC
LDP #lcd_count
SACL lcd_count ;pointer
CALL send_number
LDP #lcd_temporary
BLDD #lcd_innumber,lcd_temporary ;个位
LDP #lcd_msb ;column 91
SPLK #015H,lcd_msb
SPLK #0BH,lcd_lsb
LT lcd_temporary
MPY #18
PAC
LDP #lcd_count
SACL lcd_count ;pointer
CALL send_number
RET
;------------------------------------------------
send_number: ;(9*16)
LDP #lcd_comdata
SPLK #0B1H,lcd_comdata ;lcd_page secect(start lcd_page1)
CALL send_comd
LDP #lcd_comdata
BLDD #lcd_msb,lcd_comdata;lcd_column MSB
CALL send_comd
LDP #lcd_comdata
BLDD #lcd_lsb,lcd_comdata;lcd_column LSB(MSB+LSB=start lcd_column8)
CALL send_comd
;send data
MAR *,AR0
LAR AR0,#8 ;9 columns
number_nextcol
LACC #lcd_number_table
ADD lcd_count
LDP #lcd_comdata
TBLR lcd_comdata ;lcd_column data
CALL send_data
lacl lcd_count
add #1
sacl lcd_count ;0--8
MAR *,AR0
BANZ number_nextcol,*-
;next page (position:page and column)
LDP #lcd_comdata
SPLK #0B2H,lcd_comdata ;lcd_page secect(start lcd_page1)
CALL send_comd
LDP #lcd_comdata
BLDD #lcd_msb,lcd_comdata;lcd_column MSB
CALL send_comd
LDP #lcd_comdata
BLDD #lcd_lsb,lcd_comdata;lcd_column LSB(MSB+LSB=start lcd_column8)
CALL send_comd
;send data lcd_count(table pointer=64)
MAR *,AR0
LAR AR0,#8 ;9 columns
number_nextcol1
LACC #lcd_number_table
ADD lcd_count
LDP #lcd_comdata
TBLR lcd_comdata ;lcd_column data
CALL send_data
lacl lcd_count
add #1
sacl lcd_count ;9--17
MAR *,AR0
BANZ number_nextcol1,*-
RET
lcd_number_table: ;0123456789+blank (9*16) *11 (dotum)
.word 00H,0F0H,08H,04H,04H,04H,08H,0F0H,00H,00H,07H,08H,10H,10H,10H,08H,07H,00h ;0
.word 00H,00H,00H,08H,08H,0FCH,00H,00H,00H,00H,00H,00H,00H,00H,1FH,00H,00H,00h ;1
.word 00H,30H,08H,04H,04H,04H,88H,70H,00H,00H,18H,14H,12H,11H,11H,10H,10H,00h ;2
.word 00H,10H,08H,44H,44H,44H,0A8H,10H,00H,00H,04H,08H,10H,10H,10H,08H,07H,00h ;3
.word 00H,00H,80H,60H,18H,04H,0FCH,00H,00H,00H,06H,05H,04H,04H,04H,1FH,04H,04h ;4
.word 00H,0FCH,84H,44H,44H,44H,84H,04H,00H,00H,09H,10H,10H,10H,10H,08H,07H,00h ;5
.word 00H,0F0H,88H,44H,44H,44H,88H,10H,00H,00H,07H,08H,10H,10H,10H,08H,07H,00h ;6
.word 00H,04H,04H,04H,04H,0C4H,34H,0CH,00H,00H,00H,00H,00H,1EH,01H,00H,00H,00h ;7
.word 00H,30H,48H,84H,84H,84H,48H,30H,00H,00H,06H,09H,10H,10H,10H,09H,06H,00h ;8
.word 00H,70H,88H,04H,04H,04H,88H,0F0H,00H,00H,04H,08H,11H,11H,11H,08H,07H,00h ;9
.word 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00h ;blank
;=============================================
;显示转速(32*16)
hzspeed_display: ;send command(start position:page and column)
LDP #lcd_comdata
SPLK #0B1H,lcd_comdata ;lcd_page secect(start lcd_page1)
CALL send_comd
LDP #lcd_comdata
SPLK #010H,lcd_comdata ;lcd_column MSB
CALL send_comd
LDP #lcd_comdata
SPLK #07H,lcd_comdata ;lcd_column LSB(MSB+LSB=start lcd_column8)
CALL send_comd
;send data
LDP #lcd_count
SPLK #0,lcd_count ;table pointer=0
speed_nextcol
LACC #lcd_table_hzspeed
ADD lcd_count
LDP #lcd_comdata
TBLR lcd_comdata ;lcd_column data
CALL send_data
lacl lcd_count
add #1
sacl lcd_count ;0--31
lacl lcd_count
SUB #31
bcnd speed_nextcol,LEQ
;next page 转速 (position:page and column)
LDP #lcd_comdata
SPLK #0B2H,lcd_comdata ;lcd_page secect(start lcd_page1)
CALL send_comd
LDP #lcd_comdata
SPLK #010H,lcd_comdata ;lcd_column MSB
CALL send_comd
LDP #lcd_comdata
SPLK #07H,lcd_comdata ;lcd_column LSB(MSB+LSB=start lcd_column8)
CALL send_comd
;send data lcd_count(table pointer=64)
speed_nextcol1
LACC #lcd_table_hzspeed
ADD lcd_count
LDP #lcd_comdata
TBLR lcd_comdata ;lcd_column data
CALL send_data
lacl lcd_count
add #1
sacl lcd_count ;32--63
SUB #63
bcnd speed_nextcol1,LEQ
RET
lcd_table_hzspeed: ;转速 32*16 (宋体)
.word 00H,88H,0E8H,9EH,0E8H,88H,88H,40H,48H,0C8H,7EH,48H,48H,48H,40H,00H
.word 40H,42H,0CCH,00H,08H,0E8H,0A8H,0A8H,0FEH,0A8H,0A8H,0E8H,0CH,08H,00H,00H
.word 00H,08H,18H,08H,7FH,04H,04H,00H,0AH,0BH,12H,2AH,46H,02H,00H,00H
.word 20H,10H,0FH,10H,20H,48H,44H,42H,5FH,41H,42H,44H,48H,40H,00H,00H
****************************************************
lcd_init: ;液晶初始化
LDP #PEDATDIR>>7
LACL PEDATDIR
AND #0FFFDH ;(IOPE1)LCD复位(L)
SACL PEDATDIR
CALL delay_long ;delay 0.8ms
LDP #PEDATDIR>>7
LACL PEDATDIR
OR #02H ;(IOPE1)LCD恢复正常,不复位(H)
SACL PEDATDIR
CALL delay_250
LDP #PEDATDIR>>7
LACL PEDATDIR
; AND #0ffdfH ;(IOPE4)BLE背光不使能(L)
OR #010H ;(IOPE4)BLE背光使能(H)
AND #0FFFBH ;(IOPE2)LCD_CS片选(低有效L)
SACL PEDATDIR
CALL delay_250
;send command
LDP #lcd_comdata
SPLK #0A0H,lcd_comdata ;ADC secect(display from left to right)
CALL send_comd
LDP #lcd_comdata
SPLK #0C0H,lcd_comdata ;SHL secect(display from top to bottom)
CALL send_comd
LDP #lcd_comdata
SPLK #0A2H,lcd_comdata ;LCD Bias secect(LCD volatage)
CALL send_comd
LDP #lcd_comdata
SPLK #02FH,lcd_comdata ;power control
CALL send_comd
LDP #lcd_comdata
SPLK #025H,lcd_comdata ;regualtor resistor select 025H******
CALL send_comd
LDP #lcd_comdata
SPLK #081H,lcd_comdata ;Set Reference Voltage Mode
CALL send_comd
LDP #lcd_comdata
SPLK #02AH,lcd_comdata ;Set Reference Voltage Register
CALL send_comd
LDP #lcd_comdata
SPLK #0AFH,lcd_comdata ;display on
CALL send_comd
CALL lcd_clear ;clear screen
LDP #lcd_comdata
SPLK #040H,lcd_comdata ;line of COM1(fixed)
CALL send_comd
CALL hzspeed_display ;显示转速
RET
**********************************************************
send_comd: ;8bit
LDP #lcd_comdata_flg
SPLK #0,lcd_comdata_flg ;send command
CALL send_byte
CALL delay_250
RET
send_data: ;8bit
LDP #lcd_comdata_flg
SPLK #1,lcd_comdata_flg ;send data
CALL send_byte
CALL delay_250
RET
;--------------------------
send_byte: ;byte(8bit)都移至第六位发送(对应IOPE6)
LDP #lcd_comdata_flg
LACC lcd_comdata_flg
BCND datago,GT
LDP #PEDATDIR>>7
LACL PEDATDIR
AND #0FFF7H ;(IOPE3)RS低(L)(发送指令),lcd_comdata_flg=0
SACL PEDATDIR
B sendall
datago
LDP #PEDATDIR>>7
LACL PEDATDIR
OR #08H ;(IOPE3)RS高(H)(发送数据),lcd_comdata_flg=1
SACL PEDATDIR
sendall
LDP #lcd_comdata
LACL lcd_comdata
SFR
AND #040H
SACL lcd_temporary
CALL send_bit ;send 7th bit
LDP #lcd_bit_count
SPLK #6,lcd_bit_count ;bit count
next_bit
LDP #lcd_comdata
LACL lcd_comdata
AND #040H
SACL lcd_temporary
CALL send_bit ;send 6-0 bit
LDP #lcd_comdata
LACL lcd_comdata
SFL
SACL lcd_comdata
LDP #lcd_bit_count
LACC lcd_bit_count
SUB #1
SACL lcd_bit_count
BCND next_bit,GEQ
RET
;--------------------------------------------------------
send_bit: ;bit
LDP #PEDATDIR>>7
LACL PEDATDIR
AND #0FFDFH ;(IOPE5)CLK低(L)
SACL PEDATDIR
LDP #PEDATDIR>>7
LACL PEDATDIR
AND #0FFBFH ;bit6=0
LDP #lcd_temporary
OR lcd_temporary
LDP #PEDATDIR>>7
SACL PEDATDIR ;send bit
CALL delay_250 ;delay
LDP #PEDATDIR>>7
LACL PEDATDIR
OR #020H ;(IOPE5)CLK高(H)
SACL PEDATDIR
CALL delay_250 ;delay
RET
;---------------------------------------------------
sysinit:
CLRC SXM
CLRC OVM
CLRC CNF ;B0 DATA MEMORY
LDP #SCSR1>>7
SPLK #008CH,SCSR1
LDP #WDCR>>7
SPLK #0EFH,WDCR
LDP #IFR>>7
SPLK #0000H,IMR
SPLK #0FFFFH,IFR
RET
lcd_ioconfigure:
LDP #MCRC>>7
LACL MCRC
AND #0FF81H ;IOPE1~6一般I/O口
SACL MCRC
LDP #PEDATDIR>>7
LACL PEDATDIR
OR #07E00H ;IOPE1~6为输出方式
SACL PEDATDIR
RET
;----------------------------------------------------
lcd_clear:
LDP #lcd_page
SPLK #0B8H,lcd_page ;lcd_page
next_page
;send command
LDP #lcd_comdata
BLDD #lcd_page,lcd_comdata ;lcd_page
CALL send_comd
LDP #lcd_comdata
SPLK #010H,lcd_comdata ;lcd_column MSB
CALL send_comd
LDP #lcd_comdata
SPLK #0H,lcd_comdata ;lcd_column LSB(MSB+LSB=start lcd_column0)
CALL send_comd
LDP #lcd_comdata
SPLK #040H,lcd_comdata ;line of COM1
CALL send_comd
;send data 0(clear screen)
LDP #lcd_column ;lcd_column
SPLK #128,lcd_column
next_column
LDP #lcd_comdata
SPLK #0H,lcd_comdata ;data 0
CALL send_data ;----
LDP #lcd_column
LACC lcd_column
SUB #1
SACL lcd_column
BCND next_column,GEQ
LDP #lcd_page
LACC lcd_page
SUB #1
SACL lcd_page
LACC lcd_page
SUB #0B0H
BCND next_page,GEQ
RET
;-----------------------------------------------------
delay_250: ;5cycle,1+5+4=10(clock),10*25=250ns
RPT #4
NOP
RET
;---------
delay_long: ;delay long time(1ms)
MAR *,AR0
LAR AR0,#01200H ;4600 cycles
delaycycle
NOP
NOP
NOP
NOP
BANZ delaycycle,*-
RET
;*******************************************
.def _c_int1
.def _c_int2
.def _c_int3
.def _c_int4
.def _c_int5
.def _c_int6
_c_int1
_c_int2
_c_int3
_c_int4
_c_int5
_c_int6
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -