📄 lcd.asm
字号:
//******************************************说明****************************************************//
// DI/RS:IOB3 R/W:IOB4 E:IOB5 CS1:IOB6 CS2:IOB7
// CS1和CS2只能有一个为低
//程序规范:每个函数写数据前自己清零数据线,写完后就返回,不用
//恢复数据线的电位。
//寄存器规范:R4传参,R5做数据指针.
//R1,R2,R3 做工作寄存器
//****************************************************************************************************//
.include hardware.inc
.define Clock 0x7013
.ram //定义公共变量
.public _page1,_page2,Begin_row,page1_clr,page2_clr,_temp1,_temp2,_temp3,_col1 //行、列指针
.var _page1,_page2,Begin_row,page1_clr,page2_clr,_temp1,_temp2,_temp3,_col1
.define lie 0x4000 //设置列起始地址
.code
//****************************************************************************************//
//函数名称:_Initial
//函数功能:液晶初始化
//入口参数:无
//返回参数:无
//************************************************************************************//
.public _Initial_lcd
_Initial_lcd: .proc
r1=0xffff
[P_IOB_Dir]=r1
[P_IOB_Attrib]=r1
[P_IOB_Data]=r1
nop
r1=0x0000
[P_IOB_Data]=r1
// r1=0x0080 //更改此值可以改变时钟频率
// [Clock]=r1 //主振49M,64分频?
r4=0x3e00 //关显示,r4用于传参
call Ctrl1
call Ctrl2
r4=0x3f00 //开显示
call Ctrl1
call Ctrl2
r1=0
[Begin_row]=r1
r1=r1 lsl 4
r1=r1 lsl 4
r4=r1+0xc000 //设起始点阵行
call Ctrl1
call Ctrl2
r1=0
[page1_clr]=r1
[page2_clr]=r1
Clr_begin1:
r1=[page1_clr]
r1=r1 lsl 4
r1=r1 lsl 4
r4=r1+0xb800 //设置页面地址
call Ctrl1
r2=0
r4=lie //设置列地址
call Ctrl1
?yihang1:
r4=0x0000 //用于清屏
call data1
r2+=1 //显示完64行?
cmp r2,63
jna ?yihang1
r1=[page1_clr]
r1+=1
[page1_clr]=r1
cmp r1,0x0007 //显示完8页?
jna Clr_begin1
Clr_begin2:
r1=[page2_clr]
r1=r1 lsl 4
r1=r1 lsl 4
r4=r1+0xb800 //设置页面地址
call Ctrl2
r2=0
r4=lie //设置列地址
call Ctrl2
?yihang2:
r4=0x0000 //用于清屏
call data2
r2+=1 //显示完64行?
cmp r2,63
jna ?yihang2
r1=[page2_clr]
r1+=1
[page2_clr]=r1
cmp r1,0x0007 //显示完8页?
jna Clr_begin2
retf
.endp
//************************************************************************************
//函数名称:Delay
//函数功能:延时
//入口参数:无
//返回参数:无
//**************************************************************************************
.public Delay
Delay: .proc
push r1,r2 to [sp] //把r2,r1依次压入堆栈
r1=0x0000
r2=0x0000
?loop2:
?loop1:
r2+=1
cmp r2,0x3fff //延时多长时间
jna ?loop1 //r2<=0x3fff则跳转
r1+=1
cmp r1,0xcfff
jna ?loop2
pop r1,r2 from [sp]
retf
.endp
//************************************************************************************
//函数名称:busy1
//函数功能:判断液晶接口是否繁忙子程序(左半屏)
//入口参数:无
//返回参数:无
//DI/RS:IOB3 R/W:IOB4 E:IOB5 CS1:IOB6 CS2:IOB7
//**************************************************************************************
.public busy1
busy1: .proc
push r1,r3 to [sp]
call Set_IOB_Dir_in
r1=[P_IOB_Data] //读取B口的状态
call Set_IOB_Dir_in
r1&=0x0077 //清零RS,CS2 1110 1110 0000 0000
r1|=0x0050 //置RW,CS1为1 0000 1010 0000 0000
[P_IOB_Data]=r1
r1|=0x0020 //置E 0000 0100 0000 0000
[P_IOB_Data]=r1
call Set_IOB_Dir_in
?lop1:
nop
r3=[P_IOB_Data]
r3&=0x8000 // 0000 0000 1000 0000
jnz ?lop1 //r3 不等于0则忙,跳转 用于检验是否繁忙
r1&=0xffdf //清E 1111 1011 1111 1111
[P_IOB_Data]=r1
call Set_IOB_Dir_out
pop r1,r3 from [sp]
retf
.endp
//************************************************************************************
//函数名称:busy2
//函数功能:判断液晶接口是否繁忙子程序(右半屏)
//入口参数:无
//返回参数:无
//DI/RS:IOB3 R/W:IOB4 E:IOB5 CS1:IOB6 CS2:IOB7
//**************************************************************************************
.public busy2
busy2: .proc
push r1,r3 to [sp]
call Set_IOB_Dir_in
r1=[P_IOB_Data]
call Set_IOB_Dir_in
r1&=0x00b7 //清RS,CS1 1111 0110 0000 0000
r1|=0x0090 //置RW,CS2 0000 1010 0000 0000
[P_IOB_Data]=r1
r1|=0x0020 //置E 0000 0100 0000 0000
[P_IOB_Data]=r1
call Set_IOB_Dir_in
?lop2:
nop
r3=[P_IOB_Data]
r3&=0x8000
jnz ?lop2
r1&=0xffdf //清E 1111 1011 1111 1111
[P_IOB_Data]=r1
call Set_IOB_Dir_out
pop r1,r3 from [sp]
retf
.endp
//************************************************************************************
//函数名称:data1
//函数功能:写左半屏数据子程序
//入口参数:无
//返回参数:无
//DI/RS:IOB3 R/W:IOB4 E:IOB5 CS1:IOB6 CS2:IOB7
//**************************************************************************************
.public data1
data1: .proc
push r1,r4 to [sp]
call busy1 //检测是否繁忙
r1=r4|0x0048 // 0000 1001 0000 0000 CS1和RS位置1
r1=r1&0xff6f // 1110 1101 1111 1111 清CS2,R/W
[P_IOB_Data]=r1
r1=r1|0x0020 // 0000 0100 0000 0000
[P_IOB_Data]=r1
nop
nop
nop
call _Clear_Watchdog
r1=r1&0xffdf // 1111 1011 1111 1111 E置0
[P_IOB_Data]=r1
pop r1,r4 from [sp]
retf
.endp
//************************************************************************************
//函数名称:data2
//函数功能:写右半屏数据子程序
//入口参数:无
//返回参数:无
//DI/RS:IOB3 R/W:IOB4 E:IOB5 CS1:IOB6 CS2:IOB7
//**************************************************************************************
.public data2
data2: .proc
push r1,r4 to [sp]
call busy2
r1=r4|0x0088 //置RS CS2位为1 0001 0001 0000 0000
r1=r1&0xffaf //清RW,CS1 1111 0101 1111 1111
[P_IOB_Data]=r1
r1=r1|0x0020 //E置1 0000 0100 0000 0000
[P_IOB_Data]=r1
nop
nop
nop
call _Clear_Watchdog
r1=r1&0xffdf // 1111 1011 1111 1111 E置0
[P_IOB_Data]=r1
pop r1,r4 from [sp]
retf
.endp
//************************************************************************************
//函数名称:Ctrl1
//函数功能:控制左半屏子程序
//入口参数:无
//返回参数:无
//DI/RS:IOB3 R/W:IOB4 E:IOB5 CS1:IOB6 CS2:IOB7
//**************************************************************************************
.public Ctrl1
Ctrl1: .proc
r1=r4|0x0040 //置CS1 0000 1000 0000 0000
r1=r1&0xff67 //清DI,RW,CS2 1110 1100 1111 1111
call busy1
[P_IOB_Data]=r1
r1=r1|0x0020 //E置1 0000 0100 0000 0000
[P_IOB_Data]=r1
nop
nop
nop
r1=r1&0xffdf // 1111 1011 1111 1111 E置0
[P_IOB_Data]=r1
retf
.endp
//************************************************************************************
//函数名称:Ctrl2
//函数功能:控制右半屏子程序
//入口参数:无
//返回参数:无
//DI/RS:IOB3 R/W:IOB4 E:IOB5 CS1:IOB6 CS2:IOB7
//**************************************************************************************
.public Ctrl2
Ctrl2: .proc
r1=r4|0x0080 //置CS2 0001 0000 0000 0000
r1=r1&0xffa7 //清DI,RW,CS1 1111 0100 1111 1111
call busy2
[P_IOB_Data]=r1
r1=r1|0x0020 //E置1 0000 0100 0000 0000
[P_IOB_Data]=r1
nop
nop
nop
r1=r1&0xffdf // 1111 1011 1111 1111 E置0
[P_IOB_Data]=r1
retf
.endp
//************************************************************************************
//函数名称:Set_IOB_Dir_in
//函数功能:将IO口属性改为输入
//入口参数:无
//返回参数:无
//**************************************************************************************
.public Set_IOB_Dir_in
Set_IOB_Dir_in: .proc
push r1 to [sp]
r1=[P_IOB_Dir]
r1&=0x00ff
[P_IOB_Dir]=r1
r1=[P_IOB_Attrib]
r1&=0x00ff
[P_IOB_Attrib]=r1
pop r1 from [sp]
retf
.endp
//************************************************************************************
//函数名称:Set_IOB_Dir_out
//函数功能:将IO口属性改为输出
//入口参数:无
//返回参数:无
//************************************************************************************
.public Set_IOB_Dir_out
Set_IOB_Dir_out: .proc
push r1,r3 to [sp]
r1=0xffff
[P_IOB_Dir]=r1
[P_IOB_Attrib]=r1
pop r1,r3 from [sp]
retf
.endp
//************************************************************************************
//函数名称:_Clear_Watchdog
//函数功能:清看门狗程序
//入口参数:无
//返回参数:无
//**************************************************************************************
.public _Clear_Watchdog
_Clear_Watchdog:.proc
push r1 to [sp]
r1=0x0001
[P_Watchdog_Clear]=r1
pop r1 from [sp]
retf
.endp
//************************************定位显示程序__正常显示1*****************************
//函数名称: _Dingwei_Display1
//函数功能: 在左半屏正常显示一行汉字,四个
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -