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 + -
显示快捷键?