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

📄 ps2simplehard.s

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