⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ps2simplehard.lst

📁 ATmega16应用例子
💻 LST
📖 第 1 页 / 共 4 页
字号:
(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 + -