📄 keyscan.s
字号:
.module KeyScan.C
.area text(rom, con, rel)
.even
_timer0_init::
; #include "SYS_Config.h"
; #include "KeyScan.h"
;
; /****************************************************************************
; * KeyScan - 键盘扫描函数
; * 判4个按键那个有按下
; * @Return :有按键 返回键值 无按键 返回FALSE 因此键值定义不能为FALSE
; *****************************************************************************/
; //ICC-AVR application builder : 2008-5-20 上午 09:01:00
; // Target : M64
; // Crystal: 16.000Mhz
; // TIMER0 initialize - prescale:1024
; // WGM: Normal
; // desired value: 10mSec
; // actual value: 9.984mSec (0.2%)
; void timer0_init(void)
; {
; Key0_IN();
lds R24,97
andi R24,254
sts 97,R24
lds R24,98
ori R24,1
sts 98,R24
; Key1_IN();
lds R24,97
andi R24,253
sts 97,R24
lds R24,98
ori R24,2
sts 98,R24
; Key2_IN();
lds R24,97
andi R24,251
sts 97,R24
lds R24,98
ori R24,4
sts 98,R24
; Key3_IN();
lds R24,97
andi R24,247
sts 97,R24
lds R24,98
ori R24,8
sts 98,R24
;
; TCCR0 = 0x00; //stop
clr R2
out 0x33,R2
; ASSR = 0x00; //set async mode
out 0x30,R2
; TCNT0 = 0x64; //set count
ldi R24,100
out 0x32,R24
; OCR0 = 0x9C;
ldi R24,156
out 0x31,R24
; TCCR0 = 0x07; //start timer
ldi R24,7
out 0x33,R24
;
; TIMSK|= 0x01; //timer interrupt sources
in R24,0x37
ori R24,1
out 0x37,R24
L1:
.dbline 0 ; func end
ret
.area data(ram, con, rel)
_Keyvalue::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
_Key_Deal_Flag::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
_Count0::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
_Key_time::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.area vector(rom, abs)
.org 64
jmp _timer0_ovf_isr
.area data(ram, con, rel)
.area text(rom, con, rel)
.even
_timer0_ovf_isr::
st -y,R2
st -y,R3
st -y,R16
st -y,R17
st -y,R24
st -y,R25
st -y,R30
in R2,0x3f
st -y,R2
; }
;
; INT8U Keyvalue=0;
; INT8U Key_Deal_Flag=0;
; INT8U Keyvalue_first,Keyvalue_second;
; INT8U Count0=0,Key_time=0;
;
; #pragma interrupt_handler timer0_ovf_isr:17
; void timer0_ovf_isr(void)
; {
; TCNT0 = 0x64; //reload counter value
ldi R24,100
out 0x32,R24
;
; Count0++;
lds R24,_Count0
subi R24,255 ; addi 1
sts _Count0,R24
; if(Count0==1)
cpi R24,1
brne L3
; {
; Keyvalue_first=Key_STATUS();
in R24,0x0
andi R24,15
sts _Keyvalue_first,R24
; if(Keyvalue_first==0x0F)
cpi R24,15
brne L5
; Count0=0;
clr R2
sts _Count0,R2
L5:
; }
L3:
; if(Count0>=15)//隔140ms再来检测一次
lds R24,_Count0
cpi R24,15
brlo L7
; {
; Count0=0;
clr R2
sts _Count0,R2
; Keyvalue_second=Key_STATUS();
in R24,0x0
andi R24,15
sts _Keyvalue_second,R24
; if(Keyvalue_first==Keyvalue_second)//如果相等,则为有效按键
lds R3,_Keyvalue_first
cp R3,R24
brne L9
; {
; Key_Deal_Flag=1;
ldi R24,1
sts _Key_Deal_Flag,R24
; switch(Keyvalue_first)
mov R16,R3
clr R17
cpi R16,7
ldi R30,0
cpc R17,R30
breq L17
cpi R16,11
ldi R30,0
cpc R17,R30
breq L16
cpi R16,13
ldi R30,0
cpc R17,R30
breq L15
cpi R16,14
ldi R30,0
cpc R17,R30
breq L14
xjmp L11
X0:
; {
L14:
; case 0x0E:Keyvalue=Key_Up; break;
ldi R24,18
sts _Keyvalue,R24
xjmp L12
L15:
; case 0x0D:Keyvalue=Key_Right;break;
ldi R24,20
sts _Keyvalue,R24
xjmp L12
L16:
; case 0x0B:Keyvalue=Key_Left; break;
ldi R24,19
sts _Keyvalue,R24
xjmp L12
L17:
; case 0x07:Keyvalue=Key_Down; break;
ldi R24,17
sts _Keyvalue,R24
xjmp L12
L11:
; default: Keyvalue=FALSE ; break;//同时有两个以上按键,视为无效
clr R2
sts _Keyvalue,R2
L12:
; }
; }
L9:
; }
L7:
; if( (Keyvalue==Keyvalue_first)&&(Keyvalue==Keyvalue_second) )
lds R2,_Keyvalue_first
lds R3,_Keyvalue
cp R3,R2
brne L18
lds R2,_Keyvalue_second
cp R3,R2
brne L18
; {//如果长时间按,则Key_time累加,程序判断Key_time大于某个值就知道长时间按了
; if(Key_time<255)
lds R24,_Key_time
cpi R24,255
brsh L19
; Key_time++;
subi R24,255 ; addi 1
sts _Key_time,R24
; }
xjmp L19
L18:
; else
; {
; Key_time=0;
clr R2
sts _Key_time,R2
; }
L19:
L2:
ld R2,y+
out 0x3f,R2
ld R30,y+
ld R25,y+
ld R24,y+
ld R17,y+
ld R16,y+
ld R3,y+
ld R2,y+
.dbline 0 ; func end
reti
.area bss(ram, con, rel)
_Keyvalue_second::
.blkb 1
_Keyvalue_first::
.blkb 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -