📄 lcd.asm
字号:
//硬件的连接方式IOB0-IOB7接DB0-DB7 RS接IOB8 R/W接IOB9 E接IOB10
.include hardware.inc
.define P_SIO_Data 0x701A
.public _Clear_Watchdog
.public _lcd_init
.public _IOB_init
.public _IOA_init
.public _display_line1
.public _display_line2
.public lcd_delay
.public _valid_data
.public _valid_command
.public _SIO_command
.public _SIO_data
.ram
.var data_value , command_value
.code
_IOB_init: .proc
r1=0xffff
r1&=0xfffb
[P_IOB_Dir]=r1 //初始化IOB口,其中IOB2为输入口
[P_IOB_Attrib]=r1
r1=0x0004
[P_IOB_Data]=r1
call _Clear_Watchdog
retf
.endp
_IOA_init:.proc
r1=0xfff0
[P_IOA_Dir]=r1 //初始化IOA口
[P_IOA_Attrib]=r1
r1=0xfff0
[P_IOA_Data]=r1
call _Clear_Watchdog
retf
.endp
/////////////////LCD显示///////////////////
_lcd_init: .proc
//设置工作方式指令
r1=0x0038
[command_value]=r1
call _SIO_command
call _valid_command
call _Clear_Watchdog
//清屏指令
r1=0x0001
[command_value]=r1
call _SIO_command
call _valid_command
call _Clear_Watchdog
//复位指令
r1=0x0002
[command_value]=r1
call _SIO_command
call _valid_command
call _Clear_Watchdog
//设置输入方式指令
r1=0x0006
[command_value]=r1
call _SIO_command
call _valid_command
call _Clear_Watchdog
//设置画面移动方式指令
r1=0x0014
[command_value]=r1
call _SIO_command
call _valid_command
call _Clear_Watchdog
//设置显示方式指令
r1=0x000f
[command_value]=r1
call _SIO_command
call _valid_command
call _Clear_Watchdog
//设置第一行地址
r3=0x0080
r3+=r2
[command_value]=r3
call _SIO_command
call _valid_command
retf
.endp
lcd_delay: .proc
r4 = 0xff00;
lcddelayloop:
r3 = 0x0001;
[P_Watchdog_Clear] = r3;
r4 += 1;
jnz lcddelayloop
retf
.endp
_delay: .proc
r4 = 0xfd00;
delayloop:
r3 = 0x0001;
[P_Watchdog_Clear] = r3;
r4 += 1;
jnz delayloop
retf
.endp
///////////////////LCD显示第一行///////////////////
_display_line1: .proc
push bp,bp to [sp]
bp=sp+1
r1=[bp+3]
r2=[bp+4]
r3=0x0080
r3+=r2
[command_value]=r3 //设置第一行地址
call _SIO_command
call _valid_command
[data_value]=r1 //传送数值
call _SIO_data
call _valid_data
call _Clear_Watchdog
pop bp ,bp from [sp]
retf
.endp
///////////////////LCD显示第二行///////////////////
_display_line2: .proc
push bp,bp to [sp]
bp=sp+1
r1=[bp+3]
r2=[bp+4]
r3=0x00c0
r3+=r2
[command_value]=r3 //设置第二行地址
call _SIO_command
call _valid_command
[data_value]=r1 //传送数值
call _SIO_data
call _valid_data
call _Clear_Watchdog
pop bp ,bp from [sp]
retf
.endp
///////////////SIO传输数据/////////////////////
_SIO_command:
r3=0x00c9
[P_SIO_Ctrl]=r3
r3=0x0001
[P_SIO_Start]=r3
r3=[command_value] //设置命令字
[P_SIO_Data]=r3
command_busy:
r3=0x0080
Test r3,[P_SIO_Start]
JNZ command_busy
call _Clear_Watchdog
retf
///////////////SIO传输数据/////////////////////
_SIO_data:
r3=0x00c9
[P_SIO_Ctrl]=r3
r3=0x0001
[P_SIO_Start]=r3
r3=[data_value] //设置命令字
[P_SIO_Data]=r3
data_busy:
r3=0x0080
Test r3,[P_SIO_Start]
JNZ data_busy
call _Clear_Watchdog
retf
////////////////命令字下降沿////////////////////
_valid_command:
r3=0x0080 //E置1
[P_IOB_Data] = r3
call lcd_delay
r3=0x0000 //E置0
[P_IOB_Data] = r3
call _Clear_Watchdog
retf
/////////////////数据下降沿/////////////////////
_valid_data:
r3=0x00A0 //E置1
[P_IOB_Data] = r3
call lcd_delay
r3=0x0020 //E置0
[P_IOB_Data] = r3
call _Clear_Watchdog
retf
//////////////////////////清看门狗///////////////
_Clear_Watchdog:
push r1,r5 to [sp]
r1=0x0001
[P_Watchdog_Clear]=r1
pop r1,r5 from [sp]
RETF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -