📄 1602lcddriver.asm
字号:
.include hardware.inc
//.include 1602Lcd_IO.inc
//////////////////////////////////////////////////////////////////////////////
//Filename : F_WrCom
//Function : void WrCom(unsigned int)
//Input : None
//Output : None
//Destory : R1
//////////////////////////////////////////////////////////////////////////////
//========================================================
//SPLC501C Library Pin Definition
//==========================================================
//6800 Control Pin
//-----------------------------------------------------------------------------
//User can change any of control pins at any bit, except user select the IO port
//of control pin the same as control bus.
//=======================================================
// FEDCBA9876543210
//.define C_AOP_Pin 00100000000000b; //IO AOP
//.define C_EP_Pin 01000000000000b; //IO EP
//.define C_RWP_Pin 10000000000000b; //IO as RWP
// FEDCBA9876543210
//.define C_AOP_Pin 0000000000100000b; //IO AOP RS IOA5
//.define C_EP_Pin 0000000010000000b; //IO EP E IOA7
//.define C_RWP_Pin 0000000001000000b; //IO as RWP RW IOA6
.define C_AOP_Pin 0000000000000010b; //IO AOP RS IOA5
.define C_EP_Pin 0000000000001000b; //IO EP E IOA7
.define C_RWP_Pin 0000000000000100b; //IO as RWP RW IOA6
//========================================================
//Define the SPLC Data Bus Pin
//Only Two Type Can Select
//=====================================================
// FEDCBA9876543210
.define C_DataBus 1111111100000000b; //IO Data Bus
//.define C_DataBus 0000000011111111b;
.define C_BusHighLow 1; //Set Data High/Low Byte 1:High
//.define C_AddressBus 0000000011111111b; //IO Data Bus
//.define C_DataBus 0000000011111111b; //IO Data Bus
//.define C_BusHighLow 0; //Set Data High/Low Byte 0:Low
//=====================================================
//================================================
//Set Control Pins Port
//================================================
//Set Control Pins At Port A
//.define P_IO_Control_Data 0x7000; //P_IOA_Data
//.define P_IO_Control_Buffer 0x7001; //P_IOA_Buffer
//.define P_IO_Control_Dir 0x7002; //P_IOA_Dir
//.define P_IO_Control_Attrib 0x7003; //P_IOA_Attrib
//=========================================================
//Set Control Pins At Port B
.define P_IO_Control_Data 0x7005; //P_IOB_Data
.define P_IO_Control_Buffer 0x7006; //P_IOB_Buffer
.define P_IO_Control_Dir 0x7007; //P_IOB_Dir
.define P_IO_Control_Attrib 0x7008; //P_IOB_Attrib
//========================================================
//=========================================================
//Set Control Bus Port
//==========================================================
//Set Control Bus At Port A
//.define P_IO_Data_Data 0x7000; //P_IOA_Data
//.define P_IO_Data_Buffer 0x7001; //P_IOA_Buffer
//.define P_IO_Data_Dir 0x7002; //P_IOA_Dir
//.define P_IO_Data_Attrib 0x7003; //P _IOA_Attrib
//==========================================================
//Set Control Bus At Port B
.define P_IO_Data_Data 0x7005; //P_IOB_Data
.define P_IO_Data_Buffer 0x7006; //P_IOB_Buffer
.define P_IO_Data_Dir 0x7007; //P_IOB_Dir
.define P_IO_Data_Attrib 0x7008; //P_IOB_Attrib
//=========================================================
.code
.public _InitLcd
_InitLcd: .proc
r1=0x0023
[P_SystemClock]=r1
r3=0x0030
.if C_BusHighLow
R3 = R3 lsl 4;
R3 = R3 lsl 4;
.endif
r1=[P_IO_Data_Dir]
r1|=C_DataBus
[P_IO_Data_Dir]=r1
r1=[P_IO_Data_Attrib]
r1|=C_DataBus
[P_IO_Data_Attrib]=r1
r1=[P_IO_Data_Data]
r2=C_DataBus
r3&=r2
r2^=0xffff
r1&=r2
r3|=r1
[P_IO_Data_Data]=r3
r4=r3;
r3=[P_IO_Control_Data]
r3|=C_EP_Pin //0x4000
[P_IO_Control_Data]=r3
r1=C_EP_Pin
r1^=0xffff
r3&=r1 //0xbfff
[P_IO_Control_Data]=r3
call delay
[P_IO_Data_Data]=r4
r3=[P_IO_Control_Data]
r3|=C_EP_Pin //0x4000
[P_IO_Control_Data]=r3
r1=C_EP_Pin
r1^=0xffff
r3&=r1 //0xbfff
[P_IO_Control_Data]=r3
// call delay
// call delay
[P_IO_Data_Data]=r4
r3=[P_IO_Control_Data]
r3|=C_EP_Pin //0x4000
[P_IO_Control_Data]=r3
// call delay
r1=C_EP_Pin
r1^=0xffff
r3&=r1 //0xbfff
[P_IO_Control_Data]=r3
// call delay
// call delay
// call _delay
// call delay
// call F_Com00
retf
.endp
.public F_WrCom
.public _WrCom
_WrCom:
F_WrCom: .proc
//l1: call F_Com01
// call F_Led_Rd
// test r1,0x0080
// jnz l1
PUSH BP,BP TO [SP];
bp=sp
bp+=0x04
r3=[bp]
call F_Com00
call F_Led_Wr
call _delay
POP BP,BP FROM [SP]
retf
.endp
.public F_WrAdd
.public _WrAdd
_WrAdd:
F_WrAdd: .proc
PUSH BP,BP TO [SP];
bp=sp
bp+=0x0004
r3=[bp]
call F_Com00
call F_Led_Wr
POP BP,BP FROM [SP]
retf
.endp
//////////////////////////////////////////////////////////////////////////////
//Filename : F_WrDat
//Function : void WrDat(unsigned int)
//Input : None
//Output : None
//Destory : R1
//////////////////////////////////////////////////////////////////////////////
.public F_WrDat
.public _WrDat
_WrDat:
F_WrDat: .proc
PUSH BP,BP TO [SP];
bp=sp
bp+=0x0004
r3=[bp]
call F_Com10
call F_Led_Wr
POP BP,BP FROM [SP]
retf
.endp
//////////////////////////////////////////////////////////////////////////////
//Filename : F_RdDat
//Function : unsigned int RdDat(void)
//Input : None
//Output : None
//Destory : R1
//////////////////////////////////////////////////////////////////////////////
.public F_RdDat
F_RdDat: .proc
//l3:
// call F_Com01
// call F_Led_Rd
// test r1,0x0080
// jnz l3
call F_Com11
call F_Led_Rd
// call delay
retf
.endp
//////////////////////////////////////////////////////////////////////////////
//Filename : F_LedRd
//Function : unsigned int ledRD(void)
//Input : None
//Output : r1
//Destory : R1
//////////////////////////////////////////////////////////////////////////////
F_Led_Rd:
r1=[P_IO_Data_Dir]
r2=C_DataBus
r2^=0xffff
r1&=r2
[P_IO_Data_Dir]=r1
r1=[P_IO_Data_Attrib]
r1|=C_DataBus
[P_IO_Data_Attrib]=r1
r1=[P_IO_Data_Data]
r2=C_DataBus
r2^=0xffff
r1&=r2
retf
//////////////////////////////////////////////////////////////////////////////
//Filename : F_LedWr
//Function : void Ledwr(unsigned int)
//Input :r3
//Output :none
//Destory : R1
//////////////////////////////////////////////////////////////////////////////
F_Led_Wr:
.if C_BusHighLow
R3 = R3 lsl 4;
R3 = R3 lsl 4;
.endif
r1=[P_IO_Data_Dir]
r1|=C_DataBus
[P_IO_Data_Dir]=r1
r1=[P_IO_Data_Attrib]
r1|=C_DataBus
[P_IO_Data_Attrib]=r1
r1=[P_IO_Data_Data]
r2=C_DataBus
r3&=r2
r2^=0xffff
r1&=r2
r3|=r1
[P_IO_Data_Data]=r3
r3=[P_IO_Control_Data]
r3|=C_EP_Pin //0x4000
[P_IO_Control_Data]=r3
call _delay
r1=C_EP_Pin
r1^=0xffff
r3=[P_IO_Control_Data]
r3&=r1 //0xbfff
[P_IO_Control_Data]=r3
call _delay
retf
//////////////////////////////////////////////////////////////////////////////
//Filename : F_Rd_BF_AC
//Function : read bf,ac
//Input : None
//Output :r1
//Destory : R1
//////////////////////////////////////////////////////////////////////////////
.public F_Rd_BF_AC
.public _Rd_BF_AC
_Rd_BF_AC:
F_Rd_BF_AC: .proc
// call F_Com01
call F_Led_Rd
call delay
.endp
//////////////////////////////////////////////////////////////////////////////
//Filename : F_Wr_Com
//Function : read bf,ac
//Input : None
//Output : None
//Destory : R1
//////////////////////////////////////////////////////////////////////////////
F_Com00:
push r3 to [sp]
r1=[P_IO_Control_Dir]
// r1|=C_EP_Pin
r1|=C_AOP_Pin
r1|=C_RWP_Pin
[P_IO_Control_Dir]=r1
r1=[P_IO_Control_Attrib]
// r1|=C_EP_Pin
r1|=C_AOP_Pin
r1|=C_RWP_Pin
[P_IO_Control_Attrib]=r1
r3=[P_IO_Control_Data]
r1=C_AOP_Pin
r1^=0xffff
r3&=r1
r1=C_RWP_Pin
r1^=0xffff
r3&=r1
// r3&=0x1fff
[P_IO_Control_Data]=r3
//call _delay
pop r3 from [sp]
retf
//////////////////////////////////////////////////////////////////////
F_Com01:
push r3 to [sp]
r1=[P_IO_Control_Dir]
r1|=C_EP_Pin
r1|=C_AOP_Pin
r1|=C_RWP_Pin
[P_IO_Control_Dir]=r1
r1=[P_IO_Control_Attrib]
r1|=C_EP_Pin
r1|=C_AOP_Pin
r1|=C_RWP_Pin
[P_IO_Control_Attrib]=r1
r3=[P_IO_Control_Data]
r1=C_AOP_Pin
r1^=0xffff
r3&=r1
r1=C_RWP_Pin
r3|=r1
[P_IO_Control_Data]=r3
// call _delay
pop r3 from [sp]
retf
//////////////////////////////////////////////////////////////////////////////
//Filename : F_Wr_Com
//Function : read bf,ac
//Input : None
//Output : None
//Destory : R1
//////////////////////////////////////////////////////////////////////////////
F_Com10:
push r3 to [sp]
r1=[P_IO_Control_Dir]
// r1|=C_EP_Pin
r1|=C_AOP_Pin
r1|=C_RWP_Pin
[P_IO_Control_Dir]=r1
r1=[P_IO_Control_Attrib]
// r1|=C_EP_Pin
r1|=C_AOP_Pin
r1|=C_RWP_Pin
[P_IO_Control_Attrib]=r1
r3=[P_IO_Control_Data]
r1=C_AOP_Pin
r3|=r1
r1=C_RWP_Pin
r1^=0xffff
r3&=r1
[P_IO_Control_Data]=r3
//call delay
pop r3 from [sp]
retf
F_Com11:
push r3 to [sp]
r1=[P_IO_Control_Dir]
// r1|=C_EP_Pin
r1|=C_AOP_Pin
r1|=C_RWP_Pin
[P_IO_Control_Dir]=r1
r1=[P_IO_Control_Attrib]
// r1|=C_EP_Pin
r1|=C_AOP_Pin
r1|=C_RWP_Pin
[P_IO_Control_Attrib]=r1
r1=C_AOP_Pin
r3|=r1
r1=C_RWP_Pin
r3|=r1
[P_IO_Control_Data]=r3
//call delay
pop r3 from [sp]
retf
.public _delay
_delay:
r1=0x0000
delay1:
r2=0x0000
loop1:
r2+=1
cmp r2,50
jb loop1
r1+=1
cmp r1,80
jb delay1
retf
delay:
r2=0x0000
loop2:
r2+=1
cmp r2,1
jb loop2
retf
.data
TBkeyval:
.dw 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39;
.CODE
.public F_convert
.public _convert
_convert:
F_convert: .proc
PUSH BP,BP TO [SP];
bp=sp
bp+=0x0004
r3=[bp]
r3+=TBkeyval;
r1=[r3];
POP BP,BP FROM [SP]
retf
.endp
.public _delay100ms
_delay100ms:
r1=0x0000
delay3:
r2=0x0000
loop4:
r2+=1
cmp r2,21
jb loop1
r1+=1
cmp r1,10000
jb delay3
retf
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -