📄 key_ment.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 + -