LDA #0 ;是的.
;//////////////////////////////////////////////////////////////////////////
;函数名:Read_XY1616
;功能描述:读LCD显示缓冲区X,Y指定起始位置的一个鼠标指针区域的值存入寄存器
;输入参数:X,Y=指针起始坐标值
;输出参数:无
;//////////////////////////////////////////////////////////////////////////
Read_XY1616:
;SEI ;关全局中断
LDA KEY_in
PHA
LDA KEY_ini
PHA
LDA KEY_inj
PHA
LDA KEY_find
PHA
;
STX KEY_in
STX KEY_ini ;保存X坐标
STY KEY_inj ;保存Y坐标
;
LDA #19
STA Word_Count
;
LDA #0FFH ;设置寄存器起始地址,向下((11*19)/8)=27个字节
STA MOUSE_RAM_ADDR
LDA #8
STA Byte_Count ;一个字节8个位
Read_XY_16Word:
LDA #11
STA Dot_Count ;鼠标图宽为11个位
Read_XY_11Dot:
CLC
ROL KEY_find ;数据左移一个位
LDX KEY_ini
LDY KEY_inj
JSR GET_PIXEL ;取一个位状态
AND #01H
ORA KEY_find ;储存该位
STA KEY_find
INC KEY_ini ;宽度加1
DEC Byte_Count ;读完8个位了吗?
BNE Read_XY_3Dot
;满一个字节,储存该字节
LDX MOUSE_RAM_ADDR
LDA KEY_find
STA 0H,X ;储存到RAM
DEC MOUSE_RAM_ADDR ;RAM地址向下减1
LDA #8 ;重新设置字节位数
STA Byte_Count
Read_XY_3Dot:
DEC Dot_Count ;11个位读完了吗?
BNE Read_XY_11Dot
;
LDX KEY_in ;X起始不变
STX KEY_ini
INC KEY_inj ;Y加1
;LDY KEY_inj
;
DEC Word_Count ;Y个X都读完了吗?
BNE Read_XY_16Word
;;;;;;;;
ROL KEY_find ;数据左移一个位
ROL KEY_find ;数据左移一个位
ROL KEY_find ;数据左移一个位
ROL KEY_find ;数据左移一个位
ROL KEY_find ;数据左移一个位
ROL KEY_find ;数据左移一个位
ROL KEY_find ;数据左移一个位
;储存该字节
LDX MOUSE_RAM_ADDR
LDA KEY_find
STA 0H,X ;储存到RAM
;;;;;;;;
PLA
STA KEY_find
PLA
STA KEY_inj
PLA
STA KEY_ini
PLA
STA KEY_in
;CLI ;开全局中断
RTS
;//////////////////////////////////////////////////////////////////////////
;函数名:Write_XY1616
;功能描述:将寄存器的值写入LCD显示缓冲区X,Y指定起始位置的一个鼠标指针区域
;输入参数:X,Y=指针起始坐标值
;输出参数:无
;//////////////////////////////////////////////////////////////////////////
Write_XY1616:
;SEI ;关全局中断
LDA KEY_in
PHA
LDA KEY_ini
PHA
LDA KEY_inj
PHA
LDA KEY_find
PHA
;
STX KEY_in
STX KEY_ini ;保存X坐标
STY KEY_inj ;保存Y坐标
;
LDA #19
STA Word_Count
;
LDA #0FFH ;设置寄存器起始地址,向下((11*19)/8)=27个字节
STA MOUSE_RAM_ADDR
LDX MOUSE_RAM_ADDR
LDA 0H,X ;得到第一个数据
STA KEY_find
LDA #8
STA Byte_Count ;一个字节8个位
Write_XY_16Word:
LDA #11
STA Dot_Count ;宽度为11个位
Write_XY_11Dot:
LDA KEY_find
AND #80H ;得到最高位
BNE Write_XY_11Dot1 ;是0还是1?
LDX KEY_ini
LDY KEY_inj
JSR CLEAR_PIXEL ;是0清除该点
JMP Write_XY_11DotX
Write_XY_11Dot1:
LDX KEY_ini ;是1设置该点
LDY KEY_inj
JSR PUT_PIXEL
Write_XY_11DotX:
CLC
ROL KEY_find ;数据左移一位
INC KEY_ini ;X宽度加1
DEC Byte_Count ;一个字节写完了吗?
BNE Write_XY_3DotX
;写完一个字节,读下一字节
DEC MOUSE_RAM_ADDR ;得到下一字节地址
LDX MOUSE_RAM_ADDR
LDA 0H,X ;得到下一字节
STA KEY_find
LDA #8 ;重置字节位数
STA Byte_Count
Write_XY_3DotX:
DEC Dot_Count ;11个点都写完了吗?
BNE Write_XY_11Dot
;
LDX KEY_in ;X起始不变
STX KEY_ini
INC KEY_inj ;Y加1
;LDY KEY_inj
;
DEC Word_Count ;Y个X都写完了吗?
BNE Write_XY_16Word
;;;;;;;;
PLA
STA KEY_find
PLA
STA KEY_inj
PLA
STA KEY_ini
PLA
STA KEY_in
;CLI ;开全局中断
RTS
;//////////////////////////////////////////////////////////////////////////
;函数名:Cmp_XY1616
;功能描述:比较LCD显示缓冲区X,Y指定起始位置一个鼠标指针区域的值与保存好的背景数据
;输入参数:X,Y=指针起始坐标值
;输出参数:PS2_RETURN=OK为相同/ERROR为不相同
;//////////////////////////////////////////////////////////////////////////
Cmp_XY1616:
;SEI ;关全局中断
LDA KEY_in
PHA
LDA KEY_ini
PHA
LDA KEY_inj
PHA
LDA KEY_find
PHA
;
STX KEY_in
STX KEY_ini ;保存X坐标
STY KEY_inj ;保存Y坐标
LDA #0
STA PS2_TEMP0
;
LDA #19
STA Word_Count
Cmp_XY_16Word:
LDA #11
STA Dot_Count
Cmp_XY_15Dot:
LDX PS2_TEMP0
LDA MouseData_Prt,X
STA KEY_find
AND #02H
BEQ Cmp_XY_NotCmp
LDA KEY_find
AND #01H
STA KEY_find
;
LDX KEY_ini
LDY KEY_inj
JSR GET_PIXEL
AND #01H
CMP KEY_find
BNE NE_XY1616
Cmp_XY_NotCmp:
INC KEY_ini
INC PS2_TEMP0
DEC Dot_Count
BNE Cmp_XY_15Dot
;
LDX KEY_in
STX KEY_ini
INC KEY_inj
LDY KEY_inj
;
DEC Word_Count
BNE Cmp_XY_16Word
;
LDA #OK
STA PS2_RETURN
JMP EQ_XY1616
NE_XY1616:
LDA #ERROR
STA PS2_RETURN
EQ_XY1616:
PLA
STA KEY_find
PLA
STA KEY_inj
PLA
STA KEY_ini
PLA
STA KEY_in
;CLI ;开全局中断
RTS
;//////////////////////////////////////////////////////////////////////////
;函数名:Print_Mouse
;功能描述:根据X和Y的坐标值显示一个鼠标指针图形
;输入参数:X,Y=指针起始坐标值
;输出参数:无
;//////////////////////////////////////////////////////////////////////////
Print_Mouse:
;SEI ;关全局中断
LDA KEY_ini
PHA
LDA KEY_inj
PHA
LDA KEY_in
PHA
LDA KEY_i
PHA
LDA KEY_j
PHA
LDA KEY_find
PHA
;
STX KEY_ini ;保存X坐标
STY KEY_inj ;保存Y坐标
;
LDA #00H
STA KEY_in
LDA #00H ;清零Y偏移
STA KEY_j
PtMs_Loop00:
LDA #00H ;清零X偏移
STA KEY_i
PtMs_Loop10:
LDX KEY_in
LDA MouseData_Prt,X
STA KEY_find ;暂存数据
;
CLC
LDA KEY_ini ;计算LCD X坐标
ADC KEY_i
TAX
CLC
LDA KEY_inj ;计算LCD Y坐标
ADC KEY_j
TAY
;
LDA KEY_find ;判断写0还是写1到LCD的一个点
CMP #00H
BEQ Neglect_dot
AND #01H
CMP #00H
BEQ Write_WhiteDot
Write_BlackDot:
JSR PUT_PIXEL ;写1
JMP Neglect_dot
Write_WhiteDot:
JSR CLEAR_PIXEL ;写0
Neglect_dot:
INC KEY_i
INC KEY_in
LDA #11
CMP KEY_i
BNE PtMs_Loop10
INC KEY_j
LDA #19
CMP KEY_j
BNE PtMs_Loop00
;
PLA
STA KEY_find
PLA
STA KEY_j
PLA
STA KEY_i
PLA
STA KEY_in
PLA
STA KEY_inj
PLA
STA KEY_ini
;CLI ;开全局中断
RTS
;//////////////////////////////////////////////////////////////////////////
;//////////////////////////////////////////////////////////////////////////
;//////////////////////////////////////////////////////////////////////////
MouseData_Prt:
DB 11H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H
DB 11H,11H,00H,00H,00H,00H,00H,00H,00H,00H,00H
DB 11H,10H,11H,00H,00H,00H,00H,00H,00H,00H,00H
DB 11H,10H,10H,11H,00H,00H,00H,00H,00H,00H,00H
DB 11H,10H,10H,10H,11H,00H,00H,00H,00H,00H,00H
DB 11H,10H,10H,10H,10H,11H,00H,00H,00H,00H,00H
DB 11H,10H,10H,10H,10H,10H,11H,00H,00H,00H,00H
DB 11H,10H,10H,10H,10H,10H,10H,11H,00H,00H,00H
DB 11H,10H,10H,10H,10H,10H,10H,10H,11H,00H,00H
DB 11H,10H,10H,10H,10H,10H,10H,10H,10H,11H,00H
DB 11H,10H,10H,10H,10H,10H,11H,11H,11H,11H,11H
DB 11H,10H,10H,11H,11H,10H,11H,00H,00H,00H,00H
DB 11H,10H,11H,00H,11H,10H,10H,11H,00H,00H,00H
DB 11H,11H,00H,00H,00H,11H,10H,11H,00H,00H,00H
DB 11H,00H,00H,00H,00H,11H,10H,10H,11H,00H,00H
DB 00H,00H,00H,00H,00H,00H,11H,10H,11H,00H,00H
DB 00H,00H,00H,00H,00H,00H,11H,10H,10H,11H,00H
DB 00H,00H,00H,00H,00H,00H,00H,11H,10H,11H,00H
DB 00H,00H,00H,00H,00H,00H,00H,11H,11H,11H,00H
;//////////////////////////////////////////////////////////////////////////
;函数名:Refresh_Mouse
;功能描述:刷新鼠标指针图形,调用此程序前应先调用取报告(PS2getReport)程序
;输入参数:PS2_RETURN
; MOUSE_BYTE2
; MOUSE_BYTE3
; MOUSE_X
; MOUSE_Y
;输出参数:无
;//////////////////////////////////////////////////////////////////////////
Refresh_Mouse:
LDA #ERROR
CMP PS2_RETURN
BNE TEST000 ;判断读报告是否错误
;-------------------------------
LDA #OK ;是的,读报告错误,判断是否鼠标被热拔出
CMP MOUSE_BEING
BNE ReMo_000
LDX MOUSE_X ;是的,鼠标被拔掉,需还原原来的背景
LDY MOUSE_Y
JSR Write_XY1616 ;还原上一位置的显示内容
ReMo_000:
LDA #ERROR
STA MOUSE_BEING ;鼠标不存在,置标志
JSR PS2_INIT ;不防复位一下鼠标,以防也许鼠标不是被热拔,而是失灵,这时需要初始化.
JMP TEST0060 ;取鼠标报告失败,退出程序
;-------------------------------
TEST000:
LDA #ERROR ;读报告是成功的,这里判断鼠标是否又被热插入
CMP MOUSE_BEING
BEQ TEST002 ;如果是刚被热插入,则跳转到保存鼠标位置的背景先
TEST001:
LDA MOUSE_BYTE2 ;在这里鼠标连续工作正常,从此入口进行一系列的操作
ORA MOUSE_BYTE3
CMP #0
BNE TEST010 ;鼠标指针位置变化,转另一刷新方式
;
LDX MOUSE_X
LDY MOUSE_Y
JSR Cmp_XY1616 ;比较指针图形是否被新的背景掩盖
LDA #OK
CMP PS2_RETURN
BEQ TEST003 ;没被掩盖则转重直接画指针图形
TEST002:
LDX MOUSE_X
LDY MOUSE_Y
JSR Read_XY1616 ;已经被掩盖则先读出背景数据再重画指针图形
LDX MOUSE_X
LDY MOUSE_Y
TEST003:
LDX MOUSE_X ;虽然指针未动,但LCD画面可能重写,指针图形可能被掩盖,所以仍然需要重画
LDY MOUSE_Y
JSR Print_Mouse ;画鼠标指针图形
LDA #OK
STA MOUSE_BEING
JMP TEST0060
TEST010:
LDX MOUSE_X ;鼠标位置移动,从此入口进行操作
LDY MOUSE_Y
JSR Write_XY1616 ;还原上一位置背景的显示内容
JSR GoCountXY ;计算指针新的坐标位置
LDX MOUSE_X
LDY MOUSE_Y
JSR Read_XY1616 ;储存当前位置背景的内容
LDX MOUSE_X
LDY MOUSE_Y
JSR Print_Mouse ;画鼠标指针图形
TEST0060:
RTS
;//////////////////////////////////////////////////////////////////////////
;鼠标专用廷时程序
;//////////////////////////////////////////////////////////////////////////
DELAY100US: ;*delay about 100us @ Fcpu=3.57M/4
LDA #245D
STA PS2_DEL0
LDA #1D
STA PS2_DEL1
NOP
NOP
NOP
DELAYLP100:
INC PS2_DEL0
BNE DELAYLP100
DEC PS2_DEL1
BNE DELAYLP100
RTS
;
DELAY50US: ;*delay about 50us @ Fcpu=3.57M/4
LDA #250D
STA PS2_DEL0
LDA #1D
STA PS2_DEL1
NOP
NOP
NOP
DELAYLP50:
INC PS2_DEL0
BNE DELAYLP50
DEC PS2_DEL1
BNE DELAYLP50
RTS
在中断中直接调用Refresh_Mouse就行了,要读鼠标按键状态调用GET_MOUSE_KEY,返回值就是。