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

📄 key_ment.s

📁 基于ATmega8开发的关于医疗康复的机器人
💻 S
字号:
	.module Key_ment.c
	.area text(rom, con, rel)
	.dbfile F:\Work\Data\程序\修订版~1.1\Key_ment.c
	.dbfunc e Keyscan _Keyscan fc
;        KeyCode -> R20
	.even
_Keyscan::
	st -y,R20
	st -y,R21
	.dbline -1
	.dbline 19
; /*****************************************************
; * File name      : Keyscan.C
; * Description    : Header file of  LCD_S.H
; * Platform       : ICCAVR 
; * Author         : xiao xue      
; * Email          : ay1509@yahoo.com
; * Date           : 2008-03-13
; * Description    :Keyboard Scan
; *********************头文件**************************/
; #include "main_H.h"
; /***************************************************
; *函    数:KeyScan
; *函数功能:按键扫描程序
; *入口参数:无
; *返 回 值:键码
; *备    注:
; ****************************************************/
; uchar Keyscan(void)
; {
	.dbline 20
;    uchar KeyCode=0x00;
	clr R20
	.dbline 21
;    if((PIND&0xfb)==0xfb)  	//判断有无键按下,没有则直接返回
	in R24,0x10
	andi R24,251
	cpi R24,251
	brne L2
X0:
	.dbline 22
;    		return(0);
	clr R16
	rjmp L1
L2:
	.dbline 23
;    else{ 
	.dbline 24
;     	delay_nms(15); 		//延时去抖动		
	ldi R16,15
	ldi R17,0
	rcall _delay_nms
	.dbline 25
;    		KeyCode = PIND&0xfb;//获得D口键值
	in R20,0x10
	andi R20,251
	.dbline 26
;    		if (KeyCode == 0xfb)//再次继续判断有无键按下,无则返回
	cpi R20,251
	brne L7
X1:
	.dbline 27
;     		return(0);  
	clr R16
	rjmp L1
L6:
	.dbline 28
;    		while ((PIND&0xfb) != 0xfb); 	//等待弹起
L7:
	.dbline 28
	in R24,0x10
	andi R24,251
	cpi R24,251
	brne L6
X2:
	.dbline 29
; 	 		delay_nms(15);				//延时去抖动
	ldi R16,15
	ldi R17,0
	rcall _delay_nms
L9:
	.dbline 30
;    		while ((PIND&0xfb) != 0xfb); 	//再次判断是否弹起
L10:
	.dbline 30
	in R24,0x10
	andi R24,251
	cpi R24,251
	brne L9
X3:
	.dbline 31
;    		switch(KeyCode){
	clr R21
	cpi R20,219
	ldi R30,0
	cpc R21,R30
	breq L17
X4:
	ldi R24,219
	ldi R25,0
	cp R24,R20
	cpc R25,R21
	brlt L21
X5:
L20:
	cpi R20,123
	ldi R30,0
	cpc R21,R30
	breq L19
X6:
	cpi R20,123
	ldi R30,0
	cpc R21,R30
	brlt L12
X7:
L22:
	cpi R20,187
	ldi R30,0
	cpc R21,R30
	breq L18
X8:
	rjmp L12
L21:
	cpi R20,235
	ldi R30,0
	cpc R21,R30
	breq L16
X9:
	cpi R20,235
	ldi R30,0
	cpc R21,R30
	brlt L12
X10:
L23:
	cpi R20,243
	ldi R30,0
	cpc R21,R30
	breq L15
X11:
	rjmp L12
L15:
	.dbline 32
;       		case 0xf3:return(1);break;		//按键1
	ldi R16,1
	rjmp L1
L16:
	.dbline 33
; 	   		case 0xeb:return(2);break;		//按键2
	ldi R16,2
	rjmp L1
L17:
	.dbline 34
; 	   		case 0xdb:return(3);break;		//按键3
	ldi R16,3
	rjmp L1
L18:
	.dbline 35
; 	   		case 0xbb:return(4);break;		
	ldi R16,4
	rjmp L1
L19:
	.dbline 36
; 	   		case 0x7b:return(5);break;		
	ldi R16,5
	rjmp L1
L12:
	.dbline 37
; 			default: return(6);break;	   	//其他特殊情况	 
	ldi R16,6
	.dbline 37
	.dbline -2
L1:
	.dbline 0 ; func end
	ld R21,y+
	ld R20,y+
	ret
	.dbsym r KeyCode 20 c
	.dbend
	.dbfunc e KeyInit _KeyInit fV
	.even
_KeyInit::
	.dbline -1
	.dbline 50
;    		}//end switch
;    }//end else
; }
; 	
; /***************************************************
; *函    数:KeyInit
; *函数功能:按键端口初始化
; *入口参数:无
; *返 回 值:无
; *备    注:
; ****************************************************/
; void KeyInit(void)
; {
	.dbline 51
; 	DDRD=0x04;     	//键盘初化
	ldi R24,4
	out 0x11,R24
	.dbline 52
; 	PORTD=0xfb;   	//键盘初值
	ldi R24,251
	out 0x12,R24
	.dbline -2
L24:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e data_memory _data_memory fV
	.even
_data_memory::
	.dbline -1
	.dbline 63
; 	
; }
; /***************************************************
; *函    数:data_memory
; *函数功能:对键盘设定的数据进行存储
; *入口参数:无
; *返 回 值:无
; *备    注:
; ****************************************************/
; void data_memory(void)
; {
	.dbline 64
;    	switch(temp){						//存储运动模式
	lds R16,_temp
	clr R17
	cpi R16,0
	cpc R16,R17
	breq L29
X12:
	cpi R16,1
	ldi R30,0
	cpc R17,R30
	breq L30
X13:
	cpi R16,2
	ldi R30,0
	cpc R17,R30
	breq L31
X14:
	cpi R16,3
	ldi R30,0
	cpc R17,R30
	breq L32
X15:
	rjmp L26
L29:
	.dbline 65
;  		case 0: p=Pretty;break;			//天女散花
	ldi R24,<_Pretty
	ldi R25,>_Pretty
	sts _p+1,R25
	sts _p,R24
	.dbline 65
	rjmp L27
L30:
	.dbline 66
;   		case 1: p=Thest;break;			//扩胸运动
	ldi R24,<_Thest
	ldi R25,>_Thest
	sts _p+1,R25
	sts _p,R24
	.dbline 66
	rjmp L27
L31:
	.dbline 67
;   		case 2: p=Armup;break;			//振臂运动
	ldi R24,<_Armup
	ldi R25,>_Armup
	sts _p+1,R25
	sts _p,R24
	.dbline 67
	rjmp L27
L32:
	.dbline 68
;   		case 3: p=Armdown;break;  		//甩臂运动
	ldi R24,<_Armdown
	ldi R25,>_Armdown
	sts _p+1,R25
	sts _p,R24
	.dbline 68
L26:
L27:
	.dbline 70
;    }//end switch
;    	switch(temp1){                      //存储幅度值
	lds R16,_temp1
	clr R17
	cpi R16,0
	cpc R16,R17
	breq L36
X16:
	cpi R16,1
	ldi R30,0
	cpc R17,R30
	breq L38
X17:
	cpi R16,2
	ldi R30,0
	cpc R17,R30
	breq L40
X18:
	cpi R16,3
	ldi R30,0
	cpc R17,R30
	breq L42
X19:
	cpi R16,4
	ldi R30,0
	cpc R17,R30
	breq L44
X20:
	rjmp L33
L36:
	.dbline 71
;  		case 0: status[1]=0x3C;break;
	ldi R24,60
	ldi R25,0
	sts _status+2+1,R25
	sts _status+2,R24
	.dbline 71
	rjmp L34
L38:
	.dbline 72
;   		case 1: status[1]=0x46;break;
	ldi R24,70
	ldi R25,0
	sts _status+2+1,R25
	sts _status+2,R24
	.dbline 72
	rjmp L34
L40:
	.dbline 73
;   		case 2: status[1]=0x50;break;
	ldi R24,80
	ldi R25,0
	sts _status+2+1,R25
	sts _status+2,R24
	.dbline 73
	rjmp L34
L42:
	.dbline 74
;   		case 3: status[1]=0x5A;break;
	ldi R24,90
	ldi R25,0
	sts _status+2+1,R25
	sts _status+2,R24
	.dbline 74
	rjmp L34
L44:
	.dbline 75
;   		case 4: status[1]=0x64;break;
	ldi R24,100
	ldi R25,0
	sts _status+2+1,R25
	sts _status+2,R24
	.dbline 75
L33:
L34:
	.dbline 77
;    	}
;  	switch(temp2){						//存储时间值
	lds R16,_temp2
	clr R17
	cpi R16,0
	cpc R16,R17
	breq L49
X21:
	cpi R16,1
	ldi R30,0
	cpc R17,R30
	breq L51
X22:
	cpi R16,2
	ldi R30,0
	cpc R17,R30
	breq L53
X23:
	cpi R16,3
	ldi R30,0
	cpc R17,R30
	breq L55
X24:
	cpi R16,4
	ldi R30,0
	cpc R17,R30
	breq L57
X25:
	rjmp L46
L49:
	.dbline 78
;   		case 0: status[2]=300;break;       
	ldi R24,300
	ldi R25,1
	sts _status+4+1,R25
	sts _status+4,R24
	.dbline 78
	rjmp L47
L51:
	.dbline 79
;   		case 1: status[2]=600;break;
	ldi R24,600
	ldi R25,2
	sts _status+4+1,R25
	sts _status+4,R24
	.dbline 79
	rjmp L47
L53:
	.dbline 80
;   		case 2: status[2]=900;break;
	ldi R24,900
	ldi R25,3
	sts _status+4+1,R25
	sts _status+4,R24
	.dbline 80
	rjmp L47
L55:
	.dbline 81
;   		case 3: status[2]=1200;break;
	ldi R24,1200
	ldi R25,4
	sts _status+4+1,R25
	sts _status+4,R24
	.dbline 81
	rjmp L47
L57:
	.dbline 82
;   		case 4: status[2]=1500;break;
	ldi R24,1500
	ldi R25,5
	sts _status+4+1,R25
	sts _status+4,R24
	.dbline 82
L46:
L47:
	.dbline 84
;    	}
;    	moto1[2]=status[0];      		//存储模式控制字
	lds R2,_status
	lds R3,_status+1
	sts _moto1+2,R2
	.dbline 85
;    	moto2[2]=status[0];     
	sts _moto2+2,R2
	.dbline 86
;    	moto3[2]=status[0];	  
	sts _moto3+2,R2
	.dbline 87
;    	moto4[2]=status[0];    
	sts _moto4+2,R2
	.dbline 88
;     page=3;							//显示参数值运动界面
	ldi R24,3
	sts _page,R24
	.dbline 89
;    	flag=1;  						//flag=1液晶显示
	ldi R24,1
	sts _flag,R24
	.dbline -2
L25:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e Keyment _Keyment fV
;            Key -> R10
	.even
_Keyment::
	rcall push_xgset300C
	.dbline -1
	.dbline 94
; }
; 
; /************************键盘处理函数************************/
; void Keyment(void)
; {
	.dbline 95
;  	uchar Key=0;
	.dbline 96
;  	Key=Keyscan();					//键盘扫描函数
	rcall _Keyscan
	mov R10,R16
	.dbline 97
; 	if(page==1){  					//页面1
	lds R24,_page
	cpi R24,1
	breq X45
	rjmp L64
X45:
X26:
	.dbline 97
	.dbline 98
;   		switch(Key){				//判断返回的键值
	mov R20,R10
	clr R21
	cpi R20,1
	ldi R30,0
	cpc R21,R30
	breq L69
X27:
	cpi R20,2
	ldi R30,0
	cpc R21,R30
	breq L70
X28:
	cpi R20,3
	ldi R30,0
	cpc R21,R30
	breq L71
X29:
	cpi R20,4
	ldi R30,0
	cpc R21,R30
	breq L72
X30:
	rjmp L65
L69:
	.dbline 99
;    			case 1: status[0]=0x87; page=2;flag=1;break;   //被动模式
	ldi R24,135
	ldi R25,0
	sts _status+1,R25
	sts _status,R24
	.dbline 99
	ldi R24,2
	sts _page,R24
	.dbline 99
	ldi R24,1
	sts _flag,R24
	.dbline 99
	rjmp L65
L70:
	.dbline 100
;  	 		case 2: status[0]=0x78; page=2;flag=1;break;   //主动模式
	ldi R24,120
	ldi R25,0
	sts _status+1,R25
	sts _status,R24
	.dbline 100
	ldi R24,2
	sts _page,R24
	.dbline 100
	ldi R24,1
	sts _flag,R24
	.dbline 100
	rjmp L65
L71:
	.dbline 101
;   			case 3: status[0]=0x69; page=2;flag=1;break;   //助力模式
	ldi R24,105
	ldi R25,0
	sts _status+1,R25
	sts _status,R24
	.dbline 101
	ldi R24,2
	sts _page,R24
	.dbline 101
	ldi R24,1
	sts _flag,R24
	.dbline 101
	rjmp L65
L72:
	.dbline 102
;   			case 4: status[0]=0x5A; page=2;flag=1;break;   //阻力模式
	ldi R24,90
	ldi R25,0
	sts _status+1,R25
	sts _status,R24
	.dbline 102
	ldi R24,2
	sts _page,R24
	.dbline 102
	ldi R24,1
	sts _flag,R24
	.dbline 102
	.dbline 103
; 			default:break;   
	.dbline 105
;    		}
; 	} //end if
	rjmp L65
L64:
	.dbline 106
; 	else if(page==2){				 //页面2
	lds R24,_page
	cpi R24,2
	breq X46
	rjmp L73
X46:
X31:
	.dbline 106
	.dbline 107
;  		switch(Key){				 //判断返回的键值
	mov R20,R10
	clr R21
	cpi R20,1
	ldi R30,0
	cpc R21,R30
	breq L78
X32:
	cpi R20,2
	ldi R30,0
	cpc R21,R30
	brne X47
	rjmp L89
X47:
X33:
	cpi R20,3
	ldi R30,0
	cpc R21,R30
	brne X48
	rjmp L92
X48:
X34:
	cpi R20,4
	ldi R30,0
	cpc R21,R30
	brne X49
	rjmp L95
X49:
X35:
	cpi R20,5
	ldi R30,0
	cpc R21,R30
	brne X50
	rjmp L98
X50:
X36:
	rjmp L75
L78:
	.dbline 109
;    			case 1: 
;      			temp++; 
	lds R24,_temp
	subi R24,255    ; addi 1
	sts _temp,R24
	.dbline 110
;     			if(temp==4) temp=0;             //被动模式选择
	cpi R24,4
	brne L79
X37:
	.dbline 110
	clr R2
	sts _temp,R2
L79:
	.dbline 111
; 				if(temp==0) temp1=3,temp3=4;  	//天女散花,幅度与力量
	lds R2,_temp
	tst R2
	brne L81
X38:
	.dbline 111
	ldi R24,3
	sts _temp1,R24
	ldi R24,4
	sts _temp3,R24
L81:
	.dbline 112
; 				if(temp==1) temp1=2,temp3=3;    //阔胸运动,幅度与力量
	lds R24,_temp
	cpi R24,1
	brne L83
X39:
	.dbline 112
	ldi R24,2
	sts _temp1,R24
	ldi R24,3
	sts _temp3,R24
L83:
	.dbline 113
; 				if(temp==2) temp1=3,temp3=2;   	//振臂运动,幅度与力量
	lds R24,_temp
	cpi R24,2
	brne L85
X40:
	.dbline 113
	ldi R24,3
	sts _temp1,R24
	ldi R24,2
	sts _temp3,R24
L85:
	.dbline 114
; 				if(temp==3) temp1=4,temp3=2;   	//甩臂运动,幅度与力量
	lds R24,_temp
	cpi R24,3
	brne L87
X41:
	.dbline 114
	ldi R24,4
	sts _temp1,R24
	ldi R24,2
	sts _temp3,R24
L87:
	.dbline 115
; 				page=2;flag=1;break; //显示页面2,页面显示标志
	ldi R24,2
	sts _page,R24
	.dbline 115
	ldi R24,1
	sts _flag,R24
	.dbline 115
	rjmp L76
L89:
	.dbline 117
;   			case 2: 				 //幅度值设定
;      			temp1++; 			 //递增
	lds R24,_temp1
	subi R24,255    ; addi 1
	sts _temp1,R24
	.dbline 118
;      			if(temp1==5) 		 //到达最大值后清零
	cpi R24,5
	brne L90
X42:
	.dbline 119
; 					temp1=0;
	clr R2
	sts _temp1,R2
L90:
	.dbline 120
; 				page=2;flag=1;		 //显示标志
	ldi R24,2
	sts _page,R24
	.dbline 120
	ldi R24,1
	sts _flag,R24
	.dbline 121
; 				break;   	
	rjmp L76
L92:
	.dbline 123
;   			case 3: 				 //时间值设定
;      			temp2++; 			 //递增
	lds R24,_temp2
	subi R24,255    ; addi 1
	sts _temp2,R24
	.dbline 124
;      			if(temp2==5) 		 //到达最大值后清零
	cpi R24,5
	brne L93
X43:
	.dbline 125
; 					temp2=0;
	clr R2
	sts _temp2,R2
L93:
	.dbline 126
; 				page=2;flag=1;		 //显示标志
	ldi R24,2
	sts _page,R24
	.dbline 126
	ldi R24,1
	sts _flag,R24
	.dbline 127
; 				break;    	
	rjmp L76
L95:
	.dbline 129
;   			case 4: 				 //力量值设定
;      			temp3++;    		 //递增
	lds R24,_temp3
	subi R24,255    ; addi 1
	sts _temp3,R24
	.dbline 130
;      			if(temp3==5) 		 //到达最大值后清零
	cpi R24,5
	brne L96
X44:
	.dbline 131
; 					temp3=0;
	clr R2
	sts _temp3,R2
L96:
	.dbline 132
; 				page=2;flag=1; break;
	ldi R24,2
	sts _page,R24
	.dbline 132
	ldi R24,1
	sts _flag,R24
	.dbline 132
	rjmp L76
L98:
	.dbline 133
;   			case 5: { 				 //开始键
	.dbline 134
;    				TIMSK=0x04;   		 //开始键、打开定时器 
	ldi R24,4
	out 0x39,R24
	.dbline 135
;   				data_memory();		 //存储设定值函数
	rcall _data_memory
	.dbline 136
;   				}//end case
	.dbline 137
;     } //end switch
L75:
L76:
	.dbline 138
;  }//end else if     
L73:
L65:
	.dbline -2
L63:
	.dbline 0 ; func end
	rjmp pop_xgset300C
	.dbsym r Key 10 c
	.dbend
; }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -