📄 splc501hardware.asm
字号:
//////////////////////////////////////////////////////////////////////////////
.public _Set_LCD_Page_No
.public F_Set_LCD_Page_No
F_Set_LCD_Page_No:
_Set_LCD_Page_No:
r1=r1 lsl 0x04
r1=r1 lsl 0x04
r1|=0xb000
PUSH R1,R1 TO [SP]
r1=[P_IO_Data_Data]
push r2 to [sp]
r2=C_DataBus
r2^=0xffff
r1&=r2
pop r2 from [sp]
[P_IO_Data_Data]=r1
POP R1,R1 FROM [SP]
r1|=[P_IO_Data_Data]
.if C_BusHighLow
.else
R1 = R1 lsr 4;
R1 = R1 lsr 4;
.endif
[P_IO_Data_Data]=r1
CALL F_Send_data
// R1 |= 0x0AB0; //Set Page No. (0~7)
// [P_Lcd501Ctrl]=R1;
// CALL F_Delay_Bus_Time;
RETF;
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//Filename : F_Set_LCD_Start_Line
//Function : Set the LCD start line
//Input : Page No. (R1:0x0000~0x003F)
//Output : None
//Destroy : R1
//////////////////////////////////////////////////////////////////////////////
F_Set_LCD_Start_Line:
r3=[P_IO_Data_Data]
r2=C_DataBus
r2^=0xffff
r3&=r2
r1=r1 lsl 0x04
r1=r1 lsl 0x04
r3|=0x4000
r3|=r1
.if C_BusHighLow
.else
R3 = R3 lsr 4;
R3 = R3 lsr 4;
.endif
[P_IO_Data_Data]=r3
CALL F_Send_data
// R1 |= 0x0A40; //Set start line (00D ~ 63D)
// [P_Lcd501Ctrl]=R1;
// CALL F_Delay_Bus_Time;
RETF;
//////////////////////////////////////////////////////////////////////////////
//Filename : F_Set_LCD_Column_Addr
//Function : Set the LCD column address
//Input : Page No. (R2:0x0000~0x0083)
//Output : None
//Destroy : R1,R2
//////////////////////////////////////////////////////////////////////////////
.public _Set_LCD_Column_Addr
.public F_Set_LCD_Column_Addr
F_Set_LCD_Column_Addr:
_Set_LCD_Column_Addr:
push r1 to [sp]
push r3 to [sp]
R1 = R2
R1 = R1 LSl 4;
R1 &= 0x0F00;
R1 |= 0x1000;
push r1,r1 to [sp]
r1=[P_IO_Data_Data]
// r1&=0x00ff
push r2 to [sp]
r2=C_DataBus
r2^=0xffff
r1&=r2
pop r2 from [sp]
[P_IO_Data_Data]=r1
pop r1,r1 from [sp]
r1|=[P_IO_Data_Data]
.if C_BusHighLow
.else
R1 = R1 lsr 4;
R1 = R1 lsr 4;
.endif
[P_IO_Data_Data]=r1
CALL F_Send_data
R1 = R2
R1 = R1 LSl 4;
R1 = R1 LSl 4;
R1 &= 0x0F00;
push r1,r1 to [sp]
r1=[P_IO_Data_Data]
// r1&=0x00ff
push r2 to [sp]
r2=C_DataBus
r2^=0xffff
r1&=r2
pop r2 from [sp]
[P_IO_Data_Data]=r1
pop r1,r1 from [sp]
r1|=[P_IO_Data_Data]
.if C_BusHighLow
.else
R1 = R1 lsr 4;
R1 = R1 lsr 4;
.endif
[P_IO_Data_Data]=r1
CALL F_Send_data
pop r3 from [sp]
pop r1 from [sp]
RETF;
//////////////////////////////////////////////////////////////////////////////
//Filename : F_Fill_All_LCD_Value
//Function : Clear all LCD dots
//Input : Value (R3 : b0~7)
//Output : None
//Destroy : R1,R2
//////////////////////////////////////////////////////////////////////////////
.public _Fill_All_LCD_Value
.public F_Fill_All_LCD_Value
_Fill_All_LCD_Value:
F_Fill_All_LCD_Value:
R3 &= 0xFF00; //Filling value
R1 = 0x0000; //Page No. = 0
.if C_BusHighLow
.else
R3 = R3 lsr 4;
R3 = R3 lsr 4;
.endif
L_Fill_Page_Loop:
PUSH R1,R3 TO [SP]; //Store R1 temporarily
CALL F_Set_LCD_Page_No; //Page No. = 0
R2 = 0x0000; //Column address (00H ~ 63H)
CALL F_Set_LCD_Column_Addr; //Column Addr. = 0
POP R1,R3 FROM [SP]; //Restore R1
R2 = 0x0084; //Max. column address +1
L_Fill_Column_Loop:
push r3,r3 to[sp]
r3=[P_IO_Data_Data]
push r2 to [sp]
r2=C_DataBus
r2^=0xffff
r3&=r2
pop r2 from [sp]
[P_IO_Data_Data]=r3
pop r3,r3 from [sp]
r3|=[P_IO_Data_Data]
[P_IO_Data_Data]=r3
PUSH R3,R3 TO [SP];
r3=C_AOP_Pin //0x2000
r3|=[P_IO_Control_Data]
[P_IO_Control_Data]=r3
CALL F_Send_data ////xxxxxxxx
POP R3,R3 FROM [SP]
R2 -= 0x0001; //Next column address
JNZ L_Fill_Column_Loop; //End Page ?
R1 += 0x0001;
CMP R1,0x0008; //Next page address
JNE L_Fill_Page_Loop;
R1 = 0x0001;
[P_Watchdog_Clear] = R1; // reset watchdog
RETF;
//////////////////////////////////////////////////////////////////////////////
//destory: r3
//////////////////////////////////////////////////////////////////////
.public _Send_data
.public F_Send_data
F_Send_data:
_Send_data: .proc
r3=[P_IO_Control_Data]
r3|=C_EP_Pin //0x4000
[P_IO_Control_Data]=r3
push r1 to [sp]
r1=C_EP_Pin
r1^=0xffff
r3&=r1 //0xbfff
pop r1 from [sp]
[P_IO_Control_Data]=r3
push r1 to [sp]
r1=C_AOP_Pin
r1^=0xffff
r3&=r1
r1=C_RWP_Pin
r1^=0xffff
r3&=r1
pop r1 from [sp]
// r3&=0x1fff
[P_IO_Control_Data]=r3
retf
.endp
//////////////////////////////////////////////////////////////////////////////
F_Delay_Bus_Time:
RETF;
//////////////////////////////////////////////////////////////////////////////
//Filename : F_Read_Lcd_data
//Function : frist read appoint data on lcd
//Input :
//Output : r3
//Destroy : R1,r3
//////////////////////////////////////////////////////////////////////////////
.public _Read_Lcd_data
.public F_Read_Lcd_data
_Read_Lcd_data: .proc
F_Read_Lcd_data:
r1=[P_IO_Data_Dir]
push r2 to [sp]
r2=C_DataBus
r2^=0xffff
r1&=r2
pop r2 from [sp]
// r1&=0x00ff
[P_IO_Data_Dir]=r1
// r1=[P_IOA_Attrib]
// r1|=0xff00
// [P_IOA_Attrib]=r1
// r3=0x00fd
r3=[P_IO_Control_Data]
// r3|=0xb000
r3|=C_AOP_Pin
r3|=C_RWP_Pin
r1=C_EP_Pin
r1^=0xffff
r3&=r1
[P_IO_Control_Data]=r3
CALL F_Send_data //Dummy read after setting column address immediately
// r3=0x00fd
r3=[P_IO_Control_Data]
r3|=C_AOP_Pin
r3|=C_RWP_Pin
r1=C_EP_Pin
r1^=0xffff
r3&=r1
[P_IO_Control_Data]=r3
CALL F_Send_data //Read Data
R3 = [P_IO_Data_Data] //Get it
.if C_BusHighLow
.else
R3 = R3 lsl 4;
R3 = R3 lsl 4;
.endif
r1=[P_IO_Data_Dir]
r1|=C_DataBus
[P_IO_Data_Dir]=r1
retf
.endp
//////////////////////////////////////////////////////////////////////
//input: r3
//destory: r3
//////////////////////////////////////////////////////////////////////
.PUBLIC F_Display_point
//_Display_point: .proc
F_Display_point:
nop
nop
push r3,r3 to[sp]
r3=[P_IO_Data_Data]
r2=C_DataBus
r2^=0xffff
r3&=r2
[P_IO_Data_Data]=r3
pop r3,r3 from [sp]
r3=r3 lsl 0x04
r3=r3 lsl 0x04
// R3 |= 0x00f4; //Write data
.if C_BusHighLow
.else
R3 = R3 lsr 4;
R3 = R3 lsr 4;
.endif
r3|=[P_IO_Data_Data]
[P_IO_Data_Data]=r3
r3=[P_IO_Control_Data]
r3|=C_AOP_Pin //0x2000
[P_IO_Control_Data]=r3
CALL F_Send_data
retf
//////////////////////////////////////////////////////////////////////////////
//Filename : F_Init_IO
//Function : Intialize I/O
//Input : None
//Output : None
//Destory : R1
//////////////////////////////////////////////////////////////////////////////
.public F_Init_IO
.public _Init_IO
_Init_IO:
F_Init_IO: .proc
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
r2^=0xffff
r1&=r2
[P_IO_Data_Data]=r1 //Initial porta
r1=[P_IO_Control_Dir]
r1|=C_AOP_Pin
r1|=C_EP_Pin
r1|=C_RWP_Pin
[P_IO_Control_Dir]=r1
r2=[P_IO_Control_Attrib]
r2|=r1
[P_IO_Control_Attrib]=r2
r2=[P_IO_Control_Data]
r1^=0xffff
r2&=r1
[P_IO_Control_Data]=r1
RETF
.endp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -