新闻  |   论坛  |   博客  |   在线研讨会
6502汇编写的PS2鼠标接口模块
534779918 | 2008-04-29 13:34:57    阅读:1805   发布文章

;//////////////////////////////////////////////////////////////////////////
;函数名:PS2get
;功能描述:从鼠标读取一个字节
;输入参数:无
;输出参数:PS2_DATA=接收数据
; PS2_RETURN=错误标志
;//////////////////////////////////////////////////////////////////////////
PS2get:
;SEI ;关全局中断
LDA #(PS2_CB + PS2_DB) ;设置 CLOCK 和 DATA 到输入
AND #0ECH
STA PCDR
;
JSR PS2getBit ;取/忽视起始位
LDA #ERROR
CMP PS2_RETURN
BEQ PS2getErr
;
LDA #08H ;装载计数器
STA PS2_COUNTER ;
PS2getLoop:
CLC ;
ROR PS2_DATA ;数据寄存器右移一位
;
JSR PS2getBit ;从鼠标读取一个数据位
LDA #ERROR
CMP PS2_RETURN
BEQ PS2getErr
;
TXA
ORA PS2_DATA ;保存该位
STA PS2_DATA
;
DEC PS2_COUNTER ;读完8个数据位了吗?
BNE PS2getLoop ;
;
JSR PS2getBit ;取/忽视奇偶校验位
LDA #ERROR
CMP PS2_RETURN
BEQ PS2getErr
;
JSR PS2getBit ;取/忽视停止位
LDA #ERROR
CMP PS2_RETURN
BEQ PS2getErr
;
LDA #OK
STA PS2_RETURN
CLI ;开全局中断
RTS
PS2getErr:
LDA #00H
STA PS2_DATA
LDA #ERROR
STA PS2_RETURN
;CLI ;开全局中断
RTS


;//////////////////////////////////////////////////////////////////////////
;函数名:PS2getBit
;功能描述:从鼠标读取一个位
;输入参数:无
;输出参数:X.7=位数据
; PS2_RETURN=错误标志
;//////////////////////////////////////////////////////////////////////////
PS2getBit:
LDA #00H
STA PS2_DEL0
PS2getBit00:
DEC PS2_DEL0
BEQ PS2getBErr ;超时退出
;
LDA PS2_PORT
AND #PS2_CB ;确定 CLOCK 是高
BEQ PS2getBit00 ;
;
LDA #00H
STA PS2_DEL0
PS2getBit10:
DEC PS2_DEL0
BEQ PS2getBErr ;超时退出
;
LDA PS2_PORT
AND #PS2_CB ;确定 CLOCK 是低
BNE PS2getBit10 ;
PS2getBit20:
LDA PS2_PORT
AND #PS2_DB ;读数据位
BEQ PS2getBit30 ;
LDA #OK
STA PS2_RETURN
LDX #80H ;
RTS
PS2getBit30:
LDA #OK
STA PS2_RETURN
LDX #00H
RTS
PS2getBErr:
LDA #ERROR ;超时退出
STA PS2_RETURN
RTS


;//////////////////////////////////////////////////////////////////////////
;函数名:PS2cmd
;功能描述:发送一个字节到鼠标
;输入参数:PS2_DATA=数据字节
;输出参数:PS2_RETURN=错误标志
;//////////////////////////////////////////////////////////////////////////
PS2cmd:
;SEI ;关全局中断
LDA #08H ;初始化计数器
STA PS2_COUNTER ;
LDA #00H ;清零奇偶校验计算器
STA PS2_PARITY
;
LDA #(PS2_CB + PS2_DB) ;设置 CLOCK 和 DATA 到输出
ORA #0ECH
STA PCDR
;
LDA #(PS2_CB) ;拉低 CLOCK 线至少100微秒
AND PS2_PORT
STA PS2_PORT
;
;JSR DELAY100US
;JSR DELAY100US
;
LDA #(PS2_DB) ;拉低 DATA 线至少5微秒
AND PS2_PORT ;
STA PS2_PORT
;
;JSR DELAY100US
;
LDA #PS2_CB ;释放 CLOCK
OR PS2_PORT
STA PS2_PORT
;
LDA #(PS2_CB) ;设置 CLOCK 到输入
AND #0ECH
STA PCDR
PS2cmdLoop:
LDA PS2_DATA ;
EOR PS2_PARITY ;奇偶校验计算
STA PS2_PARITY
;
LDA PS2_DATA
JSR PS2cmdBit ;输出1个数据位
LDA #ERROR
CMP PS2_RETURN
BEQ PS2cmdErr
;
ROR PS2_DATA ;数据右移一位
DEC PS2_COUNTER ;
BNE PS2cmdLoop ;8个数据位输出完了吗?
;
LDA #0FFH ;取反奇偶校验计算器
EOR PS2_PARITY
;
JSR PS2cmdBit ;输出奇偶校验位
LDA #ERROR
CMP PS2_RETURN
BEQ PS2cmdErr
;
LDA #01H ;
JSR PS2cmdBit ;输出停止位 (1)
LDA #ERROR
CMP PS2_RETURN
BEQ PS2cmdErr
;
LDA #00H
STA PS2_DEL0
PS2cmdExit0: ;等待鼠标设备回应
DEC PS2_DEL0
BEQ PS2cmdErr ;超时退出
;
LDA PS2_PORT
AND #PS2_CB
BNE PS2cmdExit0 ;
;
LDA #00H
STA PS2_DEL0
PS2cmdExit1:
DEC PS2_DEL0
BEQ PS2cmdErr ;超时退出
;
LDA PS2_PORT
AND #PS2_CB ;
BEQ PS2cmdExit1 ;
;
LDA #OK
STA PS2_RETURN
;CLI ;开全局中断
RTS ;
PS2cmdErr:
LDA #ERROR
STA PS2_RETURN
;CLI ;开全局中断
RTS ;
;//////////////////////////////////////////////////////////////////////////
;函数名:PS2cmdBit
;功能描述:发送一个位到鼠标
;输入参数:A.1=数据位
;输出参数:PS2_RETURN=错误标志
;//////////////////////////////////////////////////////////////////////////
PS2cmdBit:
STA PS2_TEMP0 ;暂存数据位
LDA #00H
STA PS2_DEL0
PS2cmdBit0:
DEC PS2_DEL0
BEQ PS2cmdBErr ;超时退出
;
LDA PS2_PORT
AND #PS2_CB ;等待 CLOCK 线到低
BNE PS2cmdBit0 ;
;
LDA #01H ;取出数据位
AND PS2_TEMP0
BNE PS2cmdBit1 ;
;
LDA #(PS2_DB) ;设置 DATA 线到低
AND PS2_PORT ;
STA PS2_PORT ;
JMP PS2cmdBit2
PS2cmdBit1:
LDA #PS2_DB ;设置 DATA 线到高
OR PS2_PORT
STA PS2_PORT
PS2cmdBit2:
LDA #00H
STA PS2_DEL0
PS2cmdBit3:
DEC PS2_DEL0
BEQ PS2cmdBErr ;超时退出
;
LDA PS2_PORT
AND #PS2_CB ;
BEQ PS2cmdBit3 ;等待 CLOCK 线到高
;
LDA #OK
STA PS2_RETURN
RTS
PS2cmdBErr:
LDA #ERROR
STA PS2_RETURN
RTS


;//////////////////////////////////////////////////////////////////////////
;函数名:PS2_INIT
;功能描述:鼠标初始化
;输入参数:无
;输出参数:PS2_RETURN=错误标志
;//////////////////////////////////////////////////////////////////////////
PS2_INIT:

PS2_Init0:
LDA #MOUSE_RES ;发送报告复位命令
STA PS2_DATA
JSR PS2cmd
LDA #ERROR
CMP PS2_RETURN
BEQ PS2_InitErr
;
JSR PS2get ;取忽视回应命令
LDA #ERROR
CMP PS2_RETURN
BEQ PS2_InitErr
;
LDA #0FAH
CMP PS2_DATA
BNE PS2_InitErr
;
;JSR PS2get ;取忽视BAT命令
;LDA #ERROR
;CMP PS2_RETURN
;BEQ PS2_InitErr
;
;LDA #0AAH
;CMP PS2_DATA
;BNE PS2_InitErr
;
;JSR PS2get ;取忽视ID命令
;LDA #ERROR
;CMP PS2_RETURN
;BEQ PS2_InitErr
;
;PS2_Init1:
;LDA #MOUSE_REMOTE ;发送报告进入REMOTE模式命令
;STA PS2_DATA
;JSR PS2cmd
;LDA #ERROR
;CMP PS2_RETURN
;BEQ PS2_InitErr
;
;JSR PS2get ;取忽视回应命令
;LDA #ERROR
;CMP PS2_RETURN
;BEQ PS2_InitErr
;
;LDA #MOUSE_ACK
;CMP PS2_DATA
;BNE PS2_InitErr
;
;LDX #80
;STX MOUSE_X
;LDY #40
;STY MOUSE_Y
;JSR Read_XY1616
;
LDA #OK
STA PS2_RETURN
RTS
PS2_InitErr:
LDA #ERROR
STA PS2_RETURN
RTS

;//////////////////////////////////////////////////////////////////////////
;函数名:PS2getReport
;功能描述:命令鼠标发送一个报告
;输入参数:无
;输出参数:PS2_RETURN=错误标志
;//////////////////////////////////////////////////////////////////////////
PS2getReport:
;SEI ;关全局中断
LDA #MOUSE_RDDATA ;发送报告读数据命令
STA PS2_DATA
JSR PS2cmd
LDA #ERROR
CMP PS2_RETURN
BEQ PS2getRepErr
;
JSR PS2get ;取忽视回应命令
LDA #ERROR
CMP PS2_RETURN
BEQ PS2getRepErr
;
LDA #MOUSE_ACK
CMP PS2_DATA
BNE PS2getRepErr
;
JSR PS2get ;取第一个报告字节
LDA #ERROR
CMP PS2_RETURN
BEQ PS2getRepErr
;
LDA PS2_DATA
STA MOUSE_BYTE1
;
JSR PS2get ;取第二个报告字节
LDA #ERROR
CMP PS2_RETURN
BEQ PS2getRepErr
;
LDA PS2_DATA
STA MOUSE_BYTE2
;
JSR PS2get ;取第三个报告字节
LDA #ERROR
CMP PS2_RETURN
BEQ PS2getRepErr
;
LDA PS2_DATA
STA MOUSE_BYTE3
;
LDA #0
CMP MOUSE_CT1
BEQ PS2getRepOK
DEC MOUSE_CT1
PS2getRepOK:
LDA #OK
STA PS2_RETURN
;CLI ;开全局中断
RTS
PS2getRepErr:
LDA #ERROR
STA PS2_RETURN
;CLI ;开全局中断
RTS


;//////////////////////////////////////////////////////////////////////////
;函数名:GET_MOUSE_KEY
;功能描述:检查鼠标按键状态
;输入参数:无
;输出参数:MOUSE_KEY = LKEY_PRESS--左键按下
; = LLKEY_PRESS--左键双击
; = LKEY_PRESS--右键按下
;//////////////////////////////////////////////////////////////////////////
GET_MOUSE_KEY:
SEI ;关全局中断
LDA #0
STA MOUSE_KEY
;
LDA #01H
AND MOUSE_BYTE1
BEQ CHECK_MOUSE_KEY40 ;左键没按下,跳
LDA #LKEY_PRESS ;左键按下
ORA MOUSE_KEY
STA MOUSE_KEY
;
LDA #NO
CMP MKEY_TEST
BNE CHECK_MOUSE_KEY30 ;左键松开过吗?
LDA #0 ;是的.
CMP MOUSE_CT1
BEQ CHECK_MOUSE_KEY30 ;上次按左键的时间过于长了没有?
LDA #LLKEY_PRESS ;没有
ORA MOUSE_KEY
STA MOUSE_KEY ;设置双击左键标志
LDA #NO ;清空MKEY_TEST
STA MKEY_TEST
LDA #0 ;清零左键双击有效时间
STA MOUSE_CT1
JMP CHECK_MOUSE_KEY50 ;跳去检查右键
CHECK_MOUSE_KEY30: ;
LDA #YES ;重新设置左键按过标志
STA MKEY_TEST
LDA #10 ;设置左键双击有效时间
STA MOUSE_CT1
JMP CHECK_MOUSE_KEY50
CHECK_MOUSE_KEY40: ;左键没按下,清空MKEY_TEST
LDA #NO
STA MKEY_TEST
CHECK_MOUSE_KEY50: ;检查右键
LDA #02H
AND MOUSE_BYTE1
BEQ CHECK_MOUSE_KEY_EXIT ;右键没按下,跳
LDA #RKEY_PRESS ;右键按下
ORA MOUSE_KEY
STA MOUSE_KEY
CHECK_MOUSE_KEY_EXIT:
CLI ;开全局中断
RTS
;//////////////////////////////////////////////////////////////////////////
;函数名:GoCountXY
;功能描述:根据鼠标发过来的报告计算光标在LCD的X和Y坐标的位置
;输入参数:MOUSE_BYTE1
; MOUSE_BYTE2
; MOUSE_BYTE3
;输出参数:PS2_RETURN=错误标志
; MOUSE_X
; MOUSE_Y
;//////////////////////////////////////////////////////////////////////////
GoCountXY:

GoCountX00:
;CLC
LDA MOUSE_BYTE2
CMP #0
BEQ GoCountY00
;
CLC
LDA MOUSE_BYTE1
AND #10H
BNE GoCountXdec
GoCountXadd:
CLC
LDA MOUSE_BYTE2
ADC MOUSE_X
STA MOUSE_X
CLC
LDA MOUSE_X
CMP #156
BCC GoCountY00
LDA #156
STA MOUSE_X
JMP GoCountY00
GoCountXdec:
CLC
LDA #0FFH
SBC MOUSE_BYTE2
STA MOUSE_BYTE2
INC MOUSE_BYTE2
CLC
LDA MOUSE_X
SBC MOUSE_BYTE2
STA MOUSE_X
;CLC
;LDA MOUSE_X
;SBC #2
BCS GoCountY00
LDA #2
STA MOUSE_X
;
GoCountY00:
LDA MOUSE_BYTE3
CMP #0
BEQ GoCountXY_Exit
;
LDA MOUSE_BYTE1
AND #20H
BEQ GoCountYdec
GoCountYadd:
CLC
LDA #0FFH
SBC MOUSE_BYTE3
STA MOUSE_BYTE3
INC MOUSE_BYTE3
CLC
LDA MOUSE_BYTE3
ADC MOUSE_Y
STA MOUSE_Y
CLC
LDA MOUSE_Y
CMP #76
BCC GoCountXY_Exit
LDA #76
STA MOUSE_Y
JMP GoCountXY_Exit
GoCountYdec:
CLC
LDA MOUSE_Y
SBC MOUSE_BYTE3
STA MOUSE_Y
BCS GoCountXY_Exit
LDA #00H
STA MOUSE_Y
GoCountXY_Exit:
RTS
;//////////////////////////////////////////////////////////////////////////
;函数名: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,返回值就是。

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客