📄 ps2simplehard.s
字号:
.module PS2SimpleHard.C
.area text(rom, con, rel)
.dbfile D:\ICC_H\Software.H
.dbfunc e speaData _speaData fV
; y -> y+4
; j -> y+0
; i -> R10
; len -> R12
; dat -> y+16
.even
_speaData::
xcall push_arg4
xcall push_gset4
sbiw R28,8
ldd R12,y+20
.dbline -1
.dbline 116
; /*********************************************************************
; 微 雪 电 子 WaveShare http://www.waveShare.net
;
; 目 的: 建立使用PS2-PC键盘操作的示例程序
;
; 目标系统: 基于AVR单片机
;
; 应用软件: ICCAVR
;
; 版 本: Version 1.0
;
; 圆版时间: 2005-06-25
;
; 开发人员: SEE
;
; 说 明: 若用于商业用途,请保留此段文字或注明代码来源
;
; 深 圳 微 雪 电 子 保 留 所 有 的 版 权
; *********************************************************************/
;
; /*01010101010101010101010101010101010101010101010101010101010101010101
; ----------------------------------------------------------------------
; 版本更新记录:
;
; ----------------------------------------------------------------------
; 实验内容:
; 按PC键盘,观察单片机读到的数据,使用PA/PB口的LED做指示。
; ----------------------------------------------------------------------
; 硬件连接:
; 将PA/PB口的LED指示灯使用短路帽短接;
; 将PC键盘插入PS2接口,将PD3与PS2.SDA使用短路帽短接,将PD4与PS2.SCK使用短路帽短接
; ----------------------------------------------------------------------
; 注意事项:
; 详见M16SD说明书
; ----------------------------------------------------------------------
; 10101010101010101010101010101010101010101010101010101010101010101010*/
;
; #include <iom16v.h>
; #include "D:\ICC_H\CmmICC.H"
; #include "D:\ICC_H\PS2.H"
;
; #define PRESS_DATA_DDR DDRA
; #define PRESS_DATA_PORT PORTA
; #define SHIFT_DATA_DDR DDRB
; #define SHIFT_DATA_PORT PORTB
;
; #define SET_SDA sbi(PORTD,4)
; #define CLR_SDA cbi(PORTD,4)
; #define GET_SDA gbi(PIND,4)
; #define OUT_SDA sbi(DDRD,4)
; #define IN_SDA cbi(DDRD,4)
;
; #define SET_SCK sbi(PORTD,3)
; #define CLR_SCK cbi(PORTD,3)
; #define GET_SCK gbi(PIND,3)
; #define OUT_SCK sbi(DDRD,3)
; #define IN_SCK cbi(DDRD,3)
;
; bool rcvF = 0; //是否收到字符标志
; uint8 keyVal; //键值
;
; /*--------------------------------------------------------------------
; 函数名称:
; 函数功能:
; 注意事项:
; 提示说明:
; 输 入:
; 返 回:
; --------------------------------------------------------------------*/
; #pragma interrupt_handler int1_isr:3
; void int1_isr(void)
; {
; static uint8 rcvBits = 0; //接收次数,中断次数
; if((rcvBits>0) && (rcvBits<9))
; {
; keyVal=keyVal>>1; //数据是LSB格式
; //IN_SDA; //当有对键盘有属性设置时,注意输入输出切换
; //DELAY();
; if(GET_SDA)
; keyVal=keyVal|0x80;
; }
; rcvBits++;
; while(!GET_SCK); //等待PS/2CLK拉高
;
; if(rcvBits>10)
; {
; rcvBits=0; //接收11次表示接收完一帧数据
; rcvF=1; //标识有字符已经输入
; }
; }
; /*--------------------------------------------------------------------
; 函数名称:
; 函数功能:
; 注意事项:
; 提示说明:
; 输 入:
; 返 回:
; --------------------------------------------------------------------*/
; void keyHandle(uint8 val)
; {
; uint8 i;
; static bool isUp=0; //按键释放动作标志
; static bool shift=0; //shift键按下标志
; rcvF = 0;
; PRESS_DATA_PORT = val; //状态指示
; if(!isUp)
; {
; switch(val)
; {
; case 0xF0 : // a relase action
; isUp = 1;
; break;
; case 0x12 : // Left shift
; shift = 1;
; break;
; case 0x59 : // Right shift
.dbline 119
; shift = 1;
; break;
; default:
clr R10
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
std z+0,R20
std z+1,R21
std z+2,R22
std z+3,R23
xjmp L5
L2:
.dbline 120
.dbline 121
movw R30,R28
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
movw R30,R28
ldd R6,z+16
ldd R7,z+17
ldd R8,z+18
ldd R9,z+19
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R6
movw R18,R8
xcall div32u
movw R30,R28
std z+4,R16
std z+5,R17
std z+6,R18
std z+7,R19
.dbline 122
ldi R20,10
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+4
ldd R3,z+5
ldd R4,z+6
ldd R5,z+7
st -y,R23
st -y,R22
st -y,R21
st -y,R20
movw R16,R2
movw R18,R4
xcall mod32u
ldi R24,<_dataElem
ldi R25,>_dataElem
mov R30,R10
clr R31
add R30,R24
adc R31,R25
std z+0,R16
.dbline 123
movw R30,R28
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
ldi R20,10
ldi R21,0
ldi R22,0
ldi R23,0
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R20
movw R18,R22
xcall empy32u
movw R30,R28
std z+0,R16
std z+1,R17
std z+2,R18
std z+3,R19
.dbline 124
L3:
.dbline 119
inc R10
L5:
.dbline 119
cp R10,R12
brsh X0
xjmp L2
X0:
.dbline -2
L1:
adiw R28,8
xcall pop_gset4
adiw R28,4
.dbline 0 ; func end
ret
.dbsym l y 4 l
.dbsym l j 0 l
.dbsym r i 10 c
.dbsym r len 12 C
.dbsym l dat 16 l
.dbend
.dbfile D:\ICC_H\I2C.H
.dbfunc e I2C_Start _I2C_Start fc
.even
_I2C_Start::
.dbline -1
.dbline 126
; if(!shift) // If shift not pressed
; {
; /*
; for(i=0; unshifted[i][0]!=val && unshifted[i][0]; i++)
; ;
; 上述写法较为灵活,但KEIL非UNIXC标准,不能采用该写法
; */
.dbline 127
; for(i=0; unshifted[i][0]!=val && i<59; i++)
ldi R24,164
out 0x36,R24
.dbline 128
L7:
.dbline 128
L8:
.dbline 128
; ;
in R2,0x36
sbrs R2,7
rjmp L7
.dbline 128
.dbline 128
.dbline 129
; if(unshifted[i][0] == val)
in R24,0x1
andi R24,248
cpi R24,8
breq L10
.dbline 130
; ; //状态指示
clr R16
xjmp L6
L10:
.dbline 131
;
ldi R16,1
.dbline -2
L6:
.dbline 0 ; func end
ret
.dbend
.dbfunc e I2C_Restart _I2C_Restart fc
.even
_I2C_Restart::
.dbline -1
.dbline 142
; }
; else // If shift pressed
; {
; /*
; for(i=0; unshifted[i][0]!=val && unshifted[i][0]; i++)
; ;
; 上述写法较为灵活,但KEIL非UNIXC标准,不能采用该写法
; */
; for(i=0; shifted[i][0]!=val && i<59; i++)
; ;
; if(shifted[i][0] == val)
.dbline 143
; SHIFT_DATA_PORT = val;//状态指示
ldi R24,164
out 0x36,R24
.dbline 144
L13:
.dbline 144
L14:
.dbline 144
; }
in R2,0x36
sbrs R2,7
rjmp L13
.dbline 144
.dbline 144
.dbline 145
; }
in R24,0x1
andi R24,248
cpi R24,16
breq L16
.dbline 146
; }
clr R16
xjmp L12
L16:
.dbline 147
; else
ldi R16,1
.dbline -2
L12:
.dbline 0 ; func end
ret
.dbend
.dbfunc e I2C_SendWrDAdr _I2C_SendWrDAdr fc
; wrDAdr -> R16
.even
_I2C_SendWrDAdr::
.dbline -1
.dbline 158
; {
; isUp=0;
; switch(val)
; {
; case 0x12 : // Left SHIFT
; shift = 0;
; break;
; case 0x59 : // Right SHIFT
; shift = 0;
; break;
; }
.dbline 159
; }
.dbline 159
out 0x3,R16
.dbline 159
ldi R24,132
out 0x36,R24
.dbline 159
.dbline 159
.dbline 160
L19:
.dbline 160
L20:
.dbline 160
; }
in R2,0x36
sbrs R2,7
rjmp L19
.dbline 160
.dbline 160
.dbline 161
; /*--------------------------------------------------------------------
in R24,0x1
andi R24,248
cpi R24,24
breq L22
.dbline 162
; 函数名称:
clr R16
xjmp L18
L22:
.dbline 163
; 函数功能:
ldi R16,1
.dbline -2
L18:
.dbline 0 ; func end
ret
.dbsym r wrDAdr 16 c
.dbend
.dbfunc e I2C_SendWrDAdr_ _I2C_SendWrDAdr_ fc
; wrDAdr -> R20,R21
.even
_I2C_SendWrDAdr_::
xcall push_gset1
movw R20,R16
.dbline -1
.dbline 174
; 注意事项:
; 提示说明:
; 输 入:
; 返 回:
; --------------------------------------------------------------------*/
; void int1_init()
; {
; IN_SCK; // set SCK_DDR (PD3/INT1) as input
; SET_SCK; // set SCK_PORT as high level,avoid triggering
; MCUCR |= 0b11110011; // set PD3/INT1 as low level active
; GICR |= 0b10000000; // enable global interrupt
.dbline 175
; SEI(); // enable external interrupt
sbrs R20,0
rjmp L25
.dbline 176
; }
mov R16,R20
clr R17
mov R16,R17
clr R17
sbrc R16,7
com R17
xcall _I2C_SendWrDAdr
tst R16
brne L27
.dbline 177
; /*--------------------------------------------------------------------
clr R16
xjmp L24
L27:
L25:
.dbline 178
; 函数名称:
mov R16,R20
xcall _I2C_SendWrDAdr
tst R16
brne L29
.dbline 179
; 函数功能:
clr R16
xjmp L24
L29:
.dbline 180
; 注意事项:
ldi R16,1
.dbline -2
L24:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r wrDAdr 20 i
.dbend
.dbfunc e I2C_SendRdDAdr _I2C_SendRdDAdr fc
; rdDAdr -> R16
.even
_I2C_SendRdDAdr::
.dbline -1
.dbline 191
; 提示说明:
; 输 入:
; 返 回:
; --------------------------------------------------------------------*/
; void main(void)
; {
; PRESS_DATA_DDR = 0XFF;
; SHIFT_DATA_DDR = 0XFF;
; IN_SDA;
; int1_init();
; while(1)
.dbline 192
; {
.dbline 192
out 0x3,R16
.dbline 192
ldi R24,132
out 0x36,R24
.dbline 192
.dbline 192
.dbline 193
L32:
.dbline 193
L33:
.dbline 193
; if(rcvF)
in R2,0x36
sbrs R2,7
rjmp L32
.dbline 193
.dbline 193
.dbline 194
; keyHandle(keyVal);
in R24,0x1
andi R24,248
cpi R24,64
breq L35
.dbline 195
; }
clr R16
xjmp L31
L35:
.dbline 196
; }
ldi R16,1
.dbline -2
L31:
.dbline 0 ; func end
ret
.dbsym r rdDAdr 16 c
.dbend
.dbfunc e I2C_SendRdDAdr_ _I2C_SendRdDAdr_ fc
; rdDAdr -> R20
.even
_I2C_SendRdDAdr_::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 207
;
;
;
;
;
;
;
;
;
;
;
.dbline 208
;
sbrs R20,0
rjmp L38
.dbline 209
;
mov R16,R20
clr R17
mov R16,R17
clr R17
sbrc R16,7
com R17
xcall _I2C_SendWrDAdr
tst R16
brne L40
.dbline 210
;
clr R16
xjmp L37
L40:
L38:
.dbline 211
;
mov R16,R20
xcall _I2C_SendWrDAdr
tst R16
brne L42
.dbline 212
;
clr R16
xjmp L37
L42:
.dbline 213
;
ldi R16,1
.dbline -2
L37:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r rdDAdr 20 c
.dbend
.dbfunc e I2C_SendDat _I2C_SendDat fc
; configDat -> R16
.even
_I2C_SendDat::
.dbline -1
.dbline 224
;
;
;
;
;
;
;
;
;
;
;
.dbline 225
;
.dbline 225
out 0x3,R16
.dbline 225
ldi R24,132
out 0x36,R24
.dbline 225
.dbline 225
.dbline 226
L45:
.dbline 226
L46:
.dbline 226
;
in R2,0x36
sbrs R2,7
rjmp L45
.dbline 226
.dbline 226
.dbline 227
;
in R24,0x1
andi R24,248
cpi R24,40
breq L48
.dbline 228
;
clr R16
xjmp L44
L48:
.dbline 229
;
ldi R16,1
.dbline -2
L44:
.dbline 0 ; func end
ret
.dbsym r configDat 16 c
.dbend
.dbfunc e I2C_RcvNAckDat _I2C_RcvNAckDat fc
; pRdDat -> R16,R17
.even
_I2C_RcvNAckDat::
.dbline -1
.dbline 240
;
;
;
;
;
;
;
;
;
;
;
.dbline 241
;
ldi R24,132
out 0x36,R24
.dbline 242
L51:
.dbline 242
L52:
.dbline 242
;
in R2,0x36
sbrs R2,7
rjmp L51
.dbline 242
.dbline 242
.dbline 243
;
in R24,0x1
andi R24,248
cpi R24,88
breq L54
.dbline 244
;
clr R16
xjmp L50
L54:
.dbline 245
;
in R2,0x3
movw R30,R16
std z+0,R2
.dbline 246
;
ldi R16,1
.dbline -2
L50:
.dbline 0 ; func end
ret
.dbsym r pRdDat 16 pc
.dbend
.dbfunc e I2C_RcvAckDat _I2C_RcvAckDat fc
; pRdDat -> R16,R17
.even
_I2C_RcvAckDat::
.dbline -1
.dbline 257
;
;
;
;
;
;
;
;
;
;
;
.dbline 258
;
ldi R24,196
out 0x36,R24
.dbline 259
L57:
.dbline 259
L58:
.dbline 259
;
in R2,0x36
sbrs R2,7
rjmp L57
.dbline 259
.dbline 259
.dbline 260
;
in R24,0x1
andi R24,248
cpi R24,80
breq L60
.dbline 261
;
clr R16
xjmp L56
L60:
.dbline 262
;
in R2,0x3
movw R30,R16
std z+0,R2
.dbline 263
;
ldi R16,1
.dbline -2
L56:
.dbline 0 ; func end
ret
.dbsym r pRdDat 16 pc
.dbend
.dbfunc e I2C_Write _I2C_Write fc
; dat -> y+4
; wordAdr -> R20
; wrDAdr -> R22,R23
.even
_I2C_Write::
xcall push_gset2
mov R20,R18
movw R22,R16
.dbline -1
.dbline 276
;
;
;
;
;
;
;
;
;
;
;
;
;
.dbline 277
;
xcall _I2C_Start
tst R16
brne L63
.dbline 278
;
clr R16
xjmp L62
L63:
.dbline 280
;
;
movw R16,R22
xcall _I2C_SendWrDAdr_
tst R16
brne L65
.dbline 281
;
clr R16
xjmp L62
L65:
.dbline 283
;
;
mov R16,R20
xcall _I2C_SendDat
tst R16
brne L67
.dbline 284
;
clr R16
xjmp L62
L67:
.dbline 286
;
;
ldd R16,y+4
xcall _I2C_SendDat
tst R16
brne L69
.dbline 287
;
clr R16
xjmp L62
L69:
.dbline 289
;
;
ldi R24,148
out 0x36,R24
.dbline 291
;
;
ldi R16,1
.dbline -2
L62:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym l dat 4 c
.dbsym r wordAdr 20 c
.dbsym r wrDAdr 22 i
.dbend
.dbfunc e I2C_Read _I2C_Read fc
; pRdDat -> y+6
; rdDAdr -> y+4
; wordAdr -> R20
; wrDAdr -> R22,R23
.even
_I2C_Read::
xcall push_gset2
mov R20,R18
movw R22,R16
.dbline -1
.dbline 322
;
;
;
;
;
;
;
;
;
;
;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -