keyscan.lis
来自「Atmega64单片机程序(完整工程)」· LIS 代码 · 共 260 行
LIS
260 行
.module KeyScan.C
.area text(rom, con, rel)
.even
0000 _timer0_init::
0000 ; #include "SYS_Config.h"
0000 ; #include "KeyScan.h"
0000 ;
0000 ; /****************************************************************************
0000 ; * KeyScan - 键盘扫描函数
0000 ; * 判4个按键那个有按下
0000 ; * @Return :有按键 返回键值 无按键 返回FALSE 因此键值定义不能为FALSE
0000 ; *****************************************************************************/
0000 ; //ICC-AVR application builder : 2008-5-20 上午 09:01:00
0000 ; // Target : M64
0000 ; // Crystal: 16.000Mhz
0000 ; // TIMER0 initialize - prescale:1024
0000 ; // WGM: Normal
0000 ; // desired value: 10mSec
0000 ; // actual value: 9.984mSec (0.2%)
0000 ; void timer0_init(void)
0000 ; {
0000 ; Key0_IN();
0000 80916100 lds R24,97
0004 8E7F andi R24,254
0006 80936100 sts 97,R24
000A 80916200 lds R24,98
000E 8160 ori R24,1
0010 80936200 sts 98,R24
0014 ; Key1_IN();
0014 80916100 lds R24,97
0018 8D7F andi R24,253
001A 80936100 sts 97,R24
001E 80916200 lds R24,98
0022 8260 ori R24,2
0024 80936200 sts 98,R24
0028 ; Key2_IN();
0028 80916100 lds R24,97
002C 8B7F andi R24,251
002E 80936100 sts 97,R24
0032 80916200 lds R24,98
0036 8460 ori R24,4
0038 80936200 sts 98,R24
003C ; Key3_IN();
003C 80916100 lds R24,97
0040 877F andi R24,247
0042 80936100 sts 97,R24
0046 80916200 lds R24,98
004A 8860 ori R24,8
004C 80936200 sts 98,R24
0050 ;
0050 ; TCCR0 = 0x00; //stop
0050 2224 clr R2
0052 23BE out 0x33,R2
0054 ; ASSR = 0x00; //set async mode
0054 20BE out 0x30,R2
0056 ; TCNT0 = 0x64; //set count
0056 84E6 ldi R24,100
0058 82BF out 0x32,R24
005A ; OCR0 = 0x9C;
005A 8CE9 ldi R24,156
005C 81BF out 0x31,R24
005E ; TCCR0 = 0x07; //start timer
005E 87E0 ldi R24,7
0060 83BF out 0x33,R24
0062 ;
0062 ; TIMSK|= 0x01; //timer interrupt sources
0062 87B7 in R24,0x37
0064 8160 ori R24,1
0066 87BF out 0x37,R24
0068 L1:
0068 .dbline 0 ; func end
0068 0895 ret
.area data(ram, con, rel)
0000 _Keyvalue::
0000 .blkb 1
.area idata
0000 00 .byte 0
.area data(ram, con, rel)
0001 _Key_Deal_Flag::
0001 .blkb 1
.area idata
0001 00 .byte 0
.area data(ram, con, rel)
0002 _Count0::
0002 .blkb 1
.area idata
0002 00 .byte 0
.area data(ram, con, rel)
0003 _Key_time::
0003 .blkb 1
.area idata
0003 00 .byte 0
.area data(ram, con, rel)
.area vector(rom, abs)
.org 64
0040 0C943500 jmp _timer0_ovf_isr
.area data(ram, con, rel)
.area text(rom, con, rel)
.even
006A _timer0_ovf_isr::
006A 2A92 st -y,R2
006C 3A92 st -y,R3
006E 0A93 st -y,R16
0070 1A93 st -y,R17
0072 8A93 st -y,R24
0074 9A93 st -y,R25
0076 EA93 st -y,R30
0078 2FB6 in R2,0x3f
007A 2A92 st -y,R2
007C ; }
007C ;
007C ; INT8U Keyvalue=0;
007C ; INT8U Key_Deal_Flag=0;
007C ; INT8U Keyvalue_first,Keyvalue_second;
007C ; INT8U Count0=0,Key_time=0;
007C ;
007C ; #pragma interrupt_handler timer0_ovf_isr:17
007C ; void timer0_ovf_isr(void)
007C ; {
007C ; TCNT0 = 0x64; //reload counter value
007C 84E6 ldi R24,100
007E 82BF out 0x32,R24
0080 ;
0080 ; Count0++;
0080 80910200 lds R24,_Count0
0084 8F5F subi R24,255 ; addi 1
0086 80930200 sts _Count0,R24
008A ; if(Count0==1)
008A 8130 cpi R24,1
008C 49F4 brne L3
008E ; {
008E ; Keyvalue_first=Key_STATUS();
008E 80B1 in R24,0x0
0090 8F70 andi R24,15
0092 80930100 sts _Keyvalue_first,R24
0096 ; if(Keyvalue_first==0x0F)
0096 8F30 cpi R24,15
0098 19F4 brne L5
009A ; Count0=0;
009A 2224 clr R2
009C 20920200 sts _Count0,R2
00A0 L5:
00A0 ; }
00A0 L3:
00A0 ; if(Count0>=15)//隔140ms再来检测一次
00A0 80910200 lds R24,_Count0
00A4 8F30 cpi R24,15
00A6 A0F1 brlo L7
00A8 ; {
00A8 ; Count0=0;
00A8 2224 clr R2
00AA 20920200 sts _Count0,R2
00AE ; Keyvalue_second=Key_STATUS();
00AE 80B1 in R24,0x0
00B0 8F70 andi R24,15
00B2 80930000 sts _Keyvalue_second,R24
00B6 ; if(Keyvalue_first==Keyvalue_second)//如果相等,则为有效按键
00B6 30900100 lds R3,_Keyvalue_first
00BA 3816 cp R3,R24
00BC 49F5 brne L9
00BE ; {
00BE ; Key_Deal_Flag=1;
00BE 81E0 ldi R24,1
00C0 80930100 sts _Key_Deal_Flag,R24
00C4 ; switch(Keyvalue_first)
00C4 032D mov R16,R3
00C6 1127 clr R17
00C8 0730 cpi R16,7
00CA E0E0 ldi R30,0
00CC 1E07 cpc R17,R30
00CE C9F0 breq L17
00D0 0B30 cpi R16,11
00D2 E0E0 ldi R30,0
00D4 1E07 cpc R17,R30
00D6 89F0 breq L16
00D8 0D30 cpi R16,13
00DA E0E0 ldi R30,0
00DC 1E07 cpc R17,R30
00DE 49F0 breq L15
00E0 0E30 cpi R16,14
00E2 E0E0 ldi R30,0
00E4 1E07 cpc R17,R30
00E6 09F0 breq L14
00E8 10C0 xjmp L11
00EA X0:
00EA ; {
00EA L14:
00EA ; case 0x0E:Keyvalue=Key_Up; break;
00EA 82E1 ldi R24,18
00EC 80930000 sts _Keyvalue,R24
00F0 0FC0 xjmp L12
00F2 L15:
00F2 ; case 0x0D:Keyvalue=Key_Right;break;
00F2 84E1 ldi R24,20
00F4 80930000 sts _Keyvalue,R24
00F8 0BC0 xjmp L12
00FA L16:
00FA ; case 0x0B:Keyvalue=Key_Left; break;
00FA 83E1 ldi R24,19
00FC 80930000 sts _Keyvalue,R24
0100 07C0 xjmp L12
0102 L17:
0102 ; case 0x07:Keyvalue=Key_Down; break;
0102 81E1 ldi R24,17
0104 80930000 sts _Keyvalue,R24
0108 03C0 xjmp L12
010A L11:
010A ; default: Keyvalue=FALSE ; break;//同时有两个以上按键,视为无效
010A 2224 clr R2
010C 20920000 sts _Keyvalue,R2
0110 L12:
0110 ; }
0110 ; }
0110 L9:
0110 ; }
0110 L7:
0110 ; if( (Keyvalue==Keyvalue_first)&&(Keyvalue==Keyvalue_second) )
0110 20900100 lds R2,_Keyvalue_first
0114 30900000 lds R3,_Keyvalue
0118 3214 cp R3,R2
011A 61F4 brne L18
011C 20900000 lds R2,_Keyvalue_second
0120 3214 cp R3,R2
0122 41F4 brne L18
0124 ; {//如果长时间按,则Key_time累加,程序判断Key_time大于某个值就知道长时间按了
0124 ; if(Key_time<255)
0124 80910300 lds R24,_Key_time
0128 8F3F cpi R24,255
012A 38F4 brsh L19
012C ; Key_time++;
012C 8F5F subi R24,255 ; addi 1
012E 80930300 sts _Key_time,R24
0132 ; }
0132 03C0 xjmp L19
0134 L18:
0134 ; else
0134 ; {
0134 ; Key_time=0;
0134 2224 clr R2
0136 20920300 sts _Key_time,R2
013A ; }
013A L19:
013A L2:
013A 2990 ld R2,y+
013C 2FBE out 0x3f,R2
013E E991 ld R30,y+
0140 9991 ld R25,y+
0142 8991 ld R24,y+
0144 1991 ld R17,y+
0146 0991 ld R16,y+
0148 3990 ld R3,y+
014A 2990 ld R2,y+
014C .dbline 0 ; func end
014C 1895 reti
.area bss(ram, con, rel)
0000 _Keyvalue_second::
0000 .blkb 1
0001 _Keyvalue_first::
0001 .blkb 1
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?