📄 ps2simplehard.lst
字号:
(0365) if( I2C_SendWrDAdr_(wrDAdr)==I2C_ERR )
0214 0186 MOVW R16,R12
0215 DF34 RCALL _I2C_SendWrDAdr_
0216 2300 TST R16
0217 F411 BNE 0x021A
(0366) return I2C_ERR;
0218 2700 CLR R16
0219 C02D RJMP 0x0247
(0367)
(0368) if( I2C_SendDat(wordAdr)==I2C_ERR )
021A 2F04 MOV R16,R20
021B DF70 RCALL _I2C_SendDat
021C 2300 TST R16
021D F411 BNE 0x0220
(0369) return I2C_ERR;
021E 2700 CLR R16
021F C027 RJMP 0x0247
(0370)
(0371) if( I2C_Restart()==I2C_ERR )
0220 DF0E RCALL _I2C_Restart
0221 2300 TST R16
0222 F411 BNE 0x0225
(0372) return I2C_ERR;
0223 2700 CLR R16
0224 C022 RJMP 0x0247
(0373)
(0374) if( I2C_SendRdDAdr(rdDAdr)==I2C_ERR )
0225 8508 LDD R16,Y+8
0226 DF3D RCALL _I2C_SendRdDAdr
0227 2300 TST R16
0228 F411 BNE 0x022B
(0375) return I2C_ERR;
0229 2700 CLR R16
022A C01C RJMP 0x0247
(0376)
(0377) for(i=0;i<num-1;i++)
022B 2744 CLR R20
022C C00A RJMP 0x0237
(0378) if( I2C_RcvAckDat(pRdDat+i)==I2C_ERR )
022D 2F04 MOV R16,R20
022E 2711 CLR R17
022F 0D0A ADD R16,R10
0230 1D1B ADC R17,R11
0231 DF78 RCALL _I2C_RcvAckDat
0232 2300 TST R16
0233 F411 BNE 0x0236
(0379) return I2C_ERR;
0234 2700 CLR R16
0235 C011 RJMP 0x0247
0236 9543 INC R20
0237 2F86 MOV R24,R22
0238 5081 SUBI R24,1
0239 1748 CP R20,R24
023A F390 BCS 0x022D
(0380)
(0381) if( I2C_RcvNAckDat(pRdDat+i)==I2C_ERR )
023B 2F04 MOV R16,R20
023C 2711 CLR R17
023D 0D0A ADD R16,R10
023E 1D1B ADC R17,R11
023F DF5A RCALL _I2C_RcvNAckDat
0240 2300 TST R16
0241 F411 BNE 0x0244
(0382) return I2C_ERR;
0242 2700 CLR R16
0243 C003 RJMP 0x0247
(0383)
(0384) I2C_Stop();
0244 E984 LDI R24,0x94
0245 BF86 OUT 0x36,R24
(0385)
(0386) return I2C_CRR;
0246 E001 LDI R16,1
0247 940E03E8 CALL pop_gset4
0249 9508 RET
_delay50us:
j --> R20
t --> R16
024A 940E03F3 CALL push_gset1
FILE: D:\ICC_H\Hardware.H
(0001) /*********************************************************************
(0002) 微 雪 电 子 WaveShare http://www.waveShare.net
(0003)
(0004) 目 的: 建立AVR的硬件提取库,增加各类补丁,方便移植
(0005)
(0006) 目标系统: 基于AVR单片机
(0007)
(0008) 应用软件: ICCAVR
(0009)
(0010) 版 本: Version 1.0
(0011)
(0012) 圆版时间: 2005-06-25
(0013)
(0014) 开发人员: SEE(中文名不告诉你~怕你骂我)
(0015)
(0016) 说 明: 若用于商业用途,请保留此段文字或注明代码来源
(0017)
(0018) 深 圳 微 雪 电 子 保 留 所 有 的 版 权
(0019) *********************************************************************/
(0020)
(0021) /*01010101010101010101010101010101010101010101010101010101010101010101
(0022) ----------------------------------------------------------------------
(0023) 版本更新记录:
(0024)
(0025) ----------------------------------------------------------------------
(0026) 入口参数说明:
(0027)
(0028) ----------------------------------------------------------------------
(0029) 待定参数说明:
(0030)
(0031) ----------------------------------------------------------------------
(0032) 对外变量说明:
(0033)
(0034) ----------------------------------------------------------------------
(0035) 对外函数说明:
(0036)
(0037) ----------------------------------------------------------------------
(0038) 10101010101010101010101010101010101010101010101010101010101010101010*/
(0039)
(0040) #ifndef Hardware_H
(0041) #define Hardware_H
(0042)
(0043) #include <math.h>
(0044) #include <string.h>
(0045) #include <stdio.h>
(0046) #include <macros.h>
(0047) #include <eeprom.h>
(0048) //#include <wdt.h>
(0049) #include "D:\ICC_H\I2C.H" //i2c即AVR的"twi"
(0050)
(0051) /* hard configs */
(0052) #ifndef flash
(0053) #define flash const
(0054) #endif
(0055)
(0056) #ifndef code
(0057) #define code const
(0058) #endif
(0059)
(0060) #ifndef NOP
(0061) #define NOP() asm("nop")
(0062) #endif
(0063)
(0064) /* io configs */
(0065) #define sbi(io,bit) ( io |= (1<<bit) ) //example: sbi(PORTA,0);sbi(DDRA,0);
(0066) #define cbi(io,bit) ( io &= ~(1<<bit) ) //example: cbi(PORTA,0);cbi(DDRA,0);
(0067) #define gbi(pin ,bit) ( pin & (1<<bit) ) //example: gbi(PINA,0);
(0068)
(0069) /* interrupt configs */
(0070) #define DIS_INT asm("sei")
(0071) #define EN_INT asm("cli")
(0072)
(0073) /* wdt configs */
(0074) #define WDT() asm("wdr")
(0075)
(0076) /* bit operation */
(0077) //#ifndef BIT
(0078) //#define BIT(x) ( 1<<(x) )
(0079) //#endif
(0080)
(0081) /* USART configs for 4 Mhz crystal */
(0082) //#define BAUD9600 25
(0083) //#define BAUD19000 12
(0084) //#define UART_TRAN_ON() UCR |= 0x08
(0085) //#define UART_TRAN_OFF() UCR &= ~0x08
(0086) //#define UART_RCV_ON() UCR |= 0x10
(0087) //#define UART_RCV_OFF() UCR &= ~0x10
(0088)
(0089) /*--------------------------------------------------------------------
(0090) 函数全称:50us 延时
(0091) 函数功能:当然是 50us延时 啦
(0092) 注意事项:基于7.3728M晶振,稍微有点误差
(0093) 提示说明:调用Delay50us(20),得到1ms延时
(0094) 输 入:
(0095) 返 回:无
(0096) --------------------------------------------------------------------*/
(0097) void delay50us(sint16 t)
(0098) {
(0099) uint8 j;
(0100) for(;t>0;t--)
024C C007 RJMP 0x0254
(0101) for(j=0;j<70;j++)
024D 2744 CLR R20
024E C001 RJMP 0x0250
024F 9543 INC R20
0250 3446 CPI R20,0x46
0251 F3E8 BCS 0x024F
0252 5001 SUBI R16,1
0253 4010 SBCI R17,0
0254 2422 CLR R2
0255 2433 CLR R3
0256 1620 CP R2,R16
0257 0631 CPC R3,R17
0258 F3A4 BLT 0x024D
0259 940E03F6 CALL pop_gset1
025B 9508 RET
_delay50ms:
i --> R20
t --> R16
025C 940E03F3 CALL push_gset1
(0102) ;
(0103) }
(0104) /*--------------------------------------------------------------------
(0105) 函数全称:50ms 延时
(0106) 函数功能:当然是 50ms延时 啦
(0107) 注意事项:基于7.3728M晶振,稍微有点误差
(0108) 提示说明:调用delay50ms(20),得到1s延时
(0109) 输 入:
(0110) 返 回:无
(0111) --------------------------------------------------------------------*/
(0112) void delay50ms(sint16 t)
(0113) {
(0114) uint16 i;
(0115) for(;t>0;t--)
025E C00B RJMP 0x026A
(0116) for(i=0;i<52642;i++)
025F 2744 CLR R20
0260 2755 CLR R21
0261 C002 RJMP 0x0264
0262 5F4F SUBI R20,0xFF
0263 4F5F SBCI R21,0xFF
0264 3A42 CPI R20,0xA2
0265 ECED LDI R30,0xCD
0266 075E CPC R21,R30
0267 F3D0 BCS 0x0262
0268 5001 SUBI R16,1
0269 4010 SBCI R17,0
026A 2422 CLR R2
026B 2433 CLR R3
026C 1620 CP R2,R16
026D 0631 CPC R3,R17
026E F384 BLT 0x025F
026F 940E03F6 CALL pop_gset1
0271 9508 RET
_int1_isr:
0272 922A ST R2,-Y
0273 923A ST R3,-Y
0274 938A ST R24,-Y
0275 939A ST R25,-Y
0276 B62F IN R2,0x3F
0277 922A ST R2,-Y
FILE: E:\WaveShare\微雪电子CD1\开发板试验器\SD系列\M16SD\试验教程\外围模块相关试验\PS2PC~1\PS2SimpleHard\PS2SimpleHard.C
(0001) /*********************************************************************
(0002) 微 雪 电 子 WaveShare http://www.waveShare.net
(0003)
(0004) 目 的: 建立使用PS2-PC键盘操作的示例程序
(0005)
(0006) 目标系统: 基于AVR单片机
(0007)
(0008) 应用软件: ICCAVR
(0009)
(0010) 版 本: Version 1.0
(0011)
(0012) 圆版时间: 2005-06-25
(0013)
(0014) 开发人员: SEE
(0015)
(0016) 说 明: 若用于商业用途,请保留此段文字或注明代码来源
(0017)
(0018) 深 圳 微 雪 电 子 保 留 所 有 的 版 权
(0019) *********************************************************************/
(0020)
(0021) /*01010101010101010101010101010101010101010101010101010101010101010101
(0022) ----------------------------------------------------------------------
(0023) 版本更新记录:
(0024)
(0025) ----------------------------------------------------------------------
(0026) 实验内容:
(0027) 按PC键盘,观察单片机读到的数据,使用PA/PB口的LED做指示。
(0028) ----------------------------------------------------------------------
(0029) 硬件连接:
(0030) 将PA/PB口的LED指示灯使用短路帽短接;
(0031) 将PC键盘插入PS2接口,将PD3与PS2.SDA使用短路帽短接,将PD4与PS2.SCK使用短路帽短接
(0032) ----------------------------------------------------------------------
(0033) 注意事项:
(0034) 详见M16SD说明书
(0035) ----------------------------------------------------------------------
(0036) 10101010101010101010101010101010101010101010101010101010101010101010*/
(0037)
(0038) #include <iom16v.h>
(0039) #include "D:\ICC_H\CmmICC.H"
(0040) #include "D:\ICC_H\PS2.H"
(0041)
(0042) #define PRESS_DATA_DDR DDRA
(0043) #define PRESS_DATA_PORT PORTA
(0044) #define SHIFT_DATA_DDR DDRB
(0045) #define SHIFT_DATA_PORT PORTB
(0046)
(0047) #define SET_SDA sbi(PORTD,4)
(0048) #define CLR_SDA cbi(PORTD,4)
(0049) #define GET_SDA gbi(PIND,4)
(0050) #define OUT_SDA sbi(DDRD,4)
(0051) #define IN_SDA cbi(DDRD,4)
(0052)
(0053) #define SET_SCK sbi(PORTD,3)
(0054) #define CLR_SCK cbi(PORTD,3)
(0055) #define GET_SCK gbi(PIND,3)
(0056) #define OUT_SCK sbi(DDRD,3)
(0057) #define IN_SCK cbi(DDRD,3)
(0058)
(0059) bool rcvF = 0; //是否收到字符标志
(0060) uint8 keyVal; //键值
(0061)
(0062) /*--------------------------------------------------------------------
(0063) 函数名称:
(0064) 函数功能:
(0065) 注意事项:
(0066) 提示说明:
(0067) 输 入:
(0068) 返 回:
(0069) --------------------------------------------------------------------*/
(0070) #pragma interrupt_handler int1_isr:3
(0071) void int1_isr(void)
(0072) {
(0073) static uint8 rcvBits = 0; //接收次数,中断次数
(0074) if((rcvBits>0) && (rcvBits<9))
0278 2422 CLR R2
0279 90300061 LDS R3,rcvBits
027B 1423 CP R2,R3
027C F470 BCC 0x028B
027D 2D83 MOV R24,R3
027E 3089 CPI R24,0x9
027F F458 BCC 0x028B
(0075) {
(0076) keyVal=keyVal>>1; //数据是LSB格式
0280 90200064 LDS R2,keyVal
0282 9426 LSR R2
0283 92200064 STS keyVal,R2
(0077) //IN_SDA; //当有对键盘有属性设置时,注意输入输出切换
(0078) //DELAY();
(0079) if(GET_SDA)
0285 9B84 SBIS 0x10,4
0286 C004 RJMP 0x028B
(0080) keyVal=keyVal|0x80;
0287 2D82 MOV R24,R2
0288 6880 ORI R24,0x80
0289 93800064 STS keyVal,R24
(0081) }
(0082) rcvBits++;
028B 91800061 LDS R24,rcvBits
028D 5F8F SUBI R24,0xFF
028E 93800061 STS rcvBits,R24
(0083) while(!GET_SCK); //等待PS/2CLK拉高
0290 9B83 SBIS 0x10,3
0291 CFFE RJMP 0x0290
(0084)
(0085) if(rcvBits>10)
0292 E08A LDI R24,0xA
0293 90200061 LDS R2,rcvBits
0295 1582 CP R24,R2
0296 F430 BCC 0x029D
(0086) {
(0087) rcvBits=0; //接收11次表示接收完一帧数据
0297 2422 CLR R2
0298 92200061 STS rcvBits,R2
(0088) rcvF=1; //标识有字符已经输入
029A E081 LDI R24,1
029B 93800060 STS rcvF,R24
(0089) }
029D 9029 LD R2,Y+
029E BE2F OUT 0x3F,R2
029F 9199 LD R25,Y+
02A0 9189 LD R24,Y+
02A1 9039 LD R3,Y+
02A2 9029 LD R2,Y+
02A3 9518 RETI
_keyHandle:
i --> R20
val --> R16
02A4 940E03F3 CALL push_gset1
(0090) }
(0091) /*--------------------------------------------------------------------
(0092) 函数名称:
(0093) 函数功能:
(0094) 注意事项:
(0095) 提示说明:
(0096) 输 入:
(0097) 返 回:
(0098) --------------------------------------------------------------------*/
(0099) void keyHandle(uint8 val)
(0100) {
(0101) uint8 i;
(0102) static bool isUp=0; //按键释放动作标志
(0103) static bool shift=0; //shift键按下标志
(0104) rcvF = 0;
02A6 2422 CLR R2
02A7 92200060 STS rcvF,R2
(0105) PRESS_DATA_PORT = val; //状态指示
02A9 BB0B OUT 0x1B,R16
(0106) if(!isUp)
02AA 90200062 LDS R2,isUp
02AC 2022 TST R2
02AD F009 BEQ 0x02AF
02AE C05B RJMP 0x030A
(0107) {
(0108) switch(val)
02AF 2F40 MOV R20,R16
02B0 2755 CLR R21
02B1 3549 CPI R20,0x59
02B2 E0E0 LDI R30,0
02B3 075E CPC R21,R30
02B4 F0B9 BEQ 0x02CC
02B5 E589 LDI R24,0x59
02B6 E090 LDI R25,0
02B7 1784 CP R24,R20
02B8 0795 CPC R25,R21
02B9 F02C BLT 0x02BF
02BA 3142 CPI R20,0x12
02BB E0E0 LDI R30,0
02BC 075E CPC R21,R30
02BD F051 BEQ 0x02C8
02BE C011 RJMP 0x02D0
02BF 3F40 CPI R20,0xF0
02C0 E0E0 LDI R30,0
02C1 075E CPC R21,R30
02C2 F009 BEQ 0x02C4
02C3 C00C RJMP 0x02D0
(0109) {
(0110) case 0xF0 : // a relase action
(0111) isUp = 1;
02C4 E081 LDI R24,1
02C5 93800062 STS isUp,R24
(0112) break;
02C7 C05B RJMP 0x0323
(0113) case 0x12 : // Left shift
(0114) shift = 1;
02C8 E081 LDI R24,1
02C9 93800063 STS shift,R24
(0115) break;
02CB C057 RJMP 0x0323
(0116) case 0x59 : // Right shift
(0117) shift = 1;
02CC E081 LDI R24,1
02CD 93800063 STS shift,R24
(0118) break;
02CF C053 RJMP 0x0323
(0119) default:
(0120) if(!shift) // If shift not pressed
02D0 90200063 LDS R2,shift
02D2 2022 TST R2
02D3 F4D9 BNE 0x02EF
(0121) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -