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

📄 key.lis

📁 我自己编写的atmega16的4*4键盘程序
💻 LIS
字号:
                        .module key.c
                        .area data(ram, con, rel)
 0000           _num::
 0000                   .blkb 2
                        .area idata
 0000 3031              .byte 48,49
                        .area data(ram, con, rel)
 0002                   .blkb 2
                        .area idata
 0002 3233              .byte 50,51
                        .area data(ram, con, rel)
 0004                   .blkb 2
                        .area idata
 0004 3435              .byte 52,53
                        .area data(ram, con, rel)
 0006                   .blkb 2
                        .area idata
 0006 3637              .byte 54,55
                        .area data(ram, con, rel)
 0008                   .blkb 2
                        .area idata
 0008 3839              .byte 56,57
                        .area data(ram, con, rel)
 000A                   .blkb 2
                        .area idata
 000A 4142              .byte 'A,'B
                        .area data(ram, con, rel)
 000C                   .blkb 2
                        .area idata
 000C 4344              .byte 'C,'D
                        .area data(ram, con, rel)
 000E                   .blkb 2
                        .area idata
 000E 4546              .byte 'E,'F
                        .area data(ram, con, rel)
 0010                   .dbfile F:\自编程序\M16\4-4keyboard\key.c
 0010                   .dbsym e num _num A[16:16]c
                        .area vector(rom, abs)
                        .org 4
 0004 0C940000          jmp _INT0_TURNLOW_handler
                        .area data(ram, con, rel)
 0010                   .dbfile F:\自编程序\M16\4-4keyboard\key.c
                        .area text(rom, con, rel)
 0000                   .dbfile F:\自编程序\M16\4-4keyboard\key.c
 0000                   .dbfunc e INT0_TURNLOW_handler _INT0_TURNLOW_handler fV
 0000           ;              i -> R20
 0000           ;       ScanCode -> R22
 0000           ;              j -> R10
                        .even
 0000           _INT0_TURNLOW_handler::
 0000 0E940000          xcall push_lset
 0004 0E940000          xcall push_gset3
 0008                   .dbline -1
 0008                   .dbline 18
 0008           ; #include <iom16v.h> 
 0008           ; #include <macros.h> 
 0008           ; 
 0008           ; //键盘接口
 0008           ; #define KEYDDR  DDRB  
 0008           ; #define KEYPORT PORTB 
 0008           ; #define KEYPIN PINB
 0008           ; //键盘接口
 0008           ; 
 0008           ; unsigned char num[]={48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70};
 0008           ; 
 0008           ; /**************INT0处理函数 start*******************/
 0008           ; /**************
 0008           ;          捕捉键盘输入中断进行处理
 0008           ;                                 *******************/
 0008           ; #pragma interrupt_handler     INT0_TURNLOW_handler:2
 0008           ; void INT0_TURNLOW_handler(void)
 0008           ;  {  
 0008                   .dbline 20
 0008           ;    unsigned char i,j,ScanCode;
 0008           ;    ScanCode=0x01;
 0008 61E0              ldi R22,1
 000A                   .dbline 21
 000A           ;    CLI();
 000A F894              cli
 000C                   .dbline 22
 000C           ;    for(i=0;i<4;i++)
 000C 4427              clr R20
 000E 15C0              xjmp L5
 0010           L2:
 0010                   .dbline 23
 0010           ;     {
 0010                   .dbline 24
 0010 68BB              out 0x18,R22
 0012                   .dbline 24
 0012 AA24              clr R10
 0014 01C0              xjmp L9
 0016           L6:
 0016                   .dbline 24
 0016           L7:
 0016                   .dbline 24
 0016 A394              inc R10
 0018           L9:
 0018                   .dbline 24
 0018           ;         KEYPORT=ScanCode;for(j=0;j<10;j++);
 0018 8A2D              mov R24,R10
 001A 8A30              cpi R24,10
 001C E0F3              brlo L6
 001E                   .dbline 25
 001E           ;         if ((KEYPIN&0XF0)!=0x00) USART_Transmit(keycode(ScanCode,KEYPIN&0XF0));//串口发送
 001E 86B3              in R24,0x16
 0020 807F              andi R24,240
 0022 49F0              breq L10
 0024                   .dbline 25
 0024 26B3              in R18,0x16
 0026 3327              clr R19
 0028 207F              andi R18,240
 002A 3070              andi R19,0
 002C 062F              mov R16,R22
 002E 1127              clr R17
 0030 14D0              xcall _keycode
 0032 0E940000          xcall _USART_Transmit
 0036           L10:
 0036                   .dbline 26
 0036 660F              lsl R22
 0038                   .dbline 27
 0038           L3:
 0038                   .dbline 22
 0038 4395              inc R20
 003A           L5:
 003A                   .dbline 22
 003A 4430              cpi R20,4
 003C 48F3              brlo L2
 003E                   .dbline 28
 003E AA24              clr R10
 0040 01C0              xjmp L15
 0042           L12:
 0042                   .dbline 28
 0042           L13:
 0042                   .dbline 28
 0042 A394              inc R10
 0044           L15:
 0044                   .dbline 28
 0044           ;           ScanCode<<=1;
 0044           ;      }
 0044           ;    for(j=0;j<200;j++);//消抖
 0044 8A2D              mov R24,R10
 0046 883C              cpi R24,200
 0048 E0F3              brlo L12
 004A                   .dbline 29
 004A           ;    SEI();
 004A 7894              sei
 004C                   .dbline 30
 004C           ;    KEYPORT=0X0F; 
 004C 8FE0              ldi R24,15
 004E 88BB              out 0x18,R24
 0050                   .dbline -2
 0050                   .dbline 31
 0050           ;   }
 0050           L1:
 0050 0E940000          xcall pop_gset3
 0054 0E940000          xcall pop_lset
 0058                   .dbline 0 ; func end
 0058 1895              reti
 005A                   .dbsym r i 20 c
 005A                   .dbsym r ScanCode 22 c
 005A                   .dbsym r j 10 c
 005A                   .dbend
 005A                   .dbfunc e keycode _keycode fi
 005A           ;           temp -> R20
 005A           ;           line -> R18
 005A           ;            row -> R16
                        .even
 005A           _keycode::
 005A 0E940000          xcall push_gset2
 005E                   .dbline -1
 005E                   .dbline 35
 005E           ; /**************INT0处理函数 end*******************/
 005E           ; /**************解码函数 start*******************/
 005E           ; unsigned keycode(unsigned char row,unsigned char line)
 005E           ; {
 005E                   .dbline 37
 005E           ;   unsigned char temp;
 005E           ;   switch(row) //行值处理
 005E 402F              mov R20,R16
 0060 5527              clr R21
 0062 4130              cpi R20,1
 0064 E0E0              ldi R30,0
 0066 5E07              cpc R21,R30
 0068 69F0              breq L20
 006A 4230              cpi R20,2
 006C E0E0              ldi R30,0
 006E 5E07              cpc R21,R30
 0070 59F0              breq L21
 0072 4430              cpi R20,4
 0074 E0E0              ldi R30,0
 0076 5E07              cpc R21,R30
 0078 49F0              breq L22
 007A 4830              cpi R20,8
 007C E0E0              ldi R30,0
 007E 5E07              cpc R21,R30
 0080 39F0              breq L23
 0082 07C0              xjmp L17
 0084           X0:
 0084                   .dbline 38
 0084           ;    {
 0084           L20:
 0084                   .dbline 39
 0084           ;      case 0x01:temp=0x00;break;
 0084 4427              clr R20
 0086                   .dbline 39
 0086 05C0              xjmp L18
 0088           L21:
 0088                   .dbline 40
 0088           ;        case 0x02:temp=0x04;break;
 0088 44E0              ldi R20,4
 008A                   .dbline 40
 008A 03C0              xjmp L18
 008C           L22:
 008C                   .dbline 41
 008C           ;        case 0x04:temp=0x08;break;
 008C 48E0              ldi R20,8
 008E                   .dbline 41
 008E 01C0              xjmp L18
 0090           L23:
 0090                   .dbline 42
 0090           ;      case 0x08:temp=0x0c;break;
 0090 4CE0              ldi R20,12
 0092                   .dbline 42
 0092           L17:
 0092           L18:
 0092                   .dbline 44
 0092           ;    }
 0092           ;    switch(line) //列值处理
 0092 622F              mov R22,R18
 0094 7727              clr R23
 0096 6032              cpi R22,32
 0098 E0E0              ldi R30,0
 009A 7E07              cpc R23,R30
 009C C1F0              breq L28
 009E 80E2              ldi R24,32
 00A0 90E0              ldi R25,0
 00A2 8617              cp R24,R22
 00A4 9707              cpc R25,R23
 00A6 2CF0              brlt L32
 00A8           L31:
 00A8 6031              cpi R22,16
 00AA E0E0              ldi R30,0
 00AC 7E07              cpc R23,R30
 00AE 71F0              breq L27
 00B0 13C0              xjmp L24
 00B2           L32:
 00B2 6034              cpi R22,64
 00B4 E0E0              ldi R30,0
 00B6 7E07              cpc R23,R30
 00B8 61F0              breq L29
 00BA 6034              cpi R22,64
 00BC E0E0              ldi R30,0
 00BE 7E07              cpc R23,R30
 00C0 5CF0              brlt L24
 00C2           L33:
 00C2 6038              cpi R22,128
 00C4 E0E0              ldi R30,0
 00C6 7E07              cpc R23,R30
 00C8 31F0              breq L30
 00CA 06C0              xjmp L24
 00CC           X1:
 00CC                   .dbline 45
 00CC           ;    {
 00CC           L27:
 00CC                   .dbline 46
 00CC           ;      case 0x10:temp+=0x00;break;
 00CC                   .dbline 46
 00CC 05C0              xjmp L25
 00CE           L28:
 00CE                   .dbline 47
 00CE           ;        case 0x20:temp+=0x01;break;
 00CE 4395              inc R20
 00D0                   .dbline 47
 00D0 03C0              xjmp L25
 00D2           L29:
 00D2                   .dbline 48
 00D2           ;        case 0x40:temp+=0x02;break;
 00D2 4E5F              subi R20,254    ; addi 2
 00D4                   .dbline 48
 00D4 01C0              xjmp L25
 00D6           L30:
 00D6                   .dbline 49
 00D6           ;      case 0x80:temp+=0x03;break;
 00D6 4D5F              subi R20,253    ; addi 3
 00D8                   .dbline 49
 00D8           L24:
 00D8           L25:
 00D8                   .dbline 51
 00D8           ;    }
 00D8           ;    return num[temp];
 00D8 80E0              ldi R24,<_num
 00DA 90E0              ldi R25,>_num
 00DC E42F              mov R30,R20
 00DE FF27              clr R31
 00E0 E80F              add R30,R24
 00E2 F91F              adc R31,R25
 00E4 0081              ldd R16,z+0
 00E6 1127              clr R17
 00E8                   .dbline -2
 00E8           L16:
 00E8 0E940000          xcall pop_gset2
 00EC                   .dbline 0 ; func end
 00EC 0895              ret
 00EE                   .dbsym r temp 20 c
 00EE                   .dbsym r line 18 c
 00EE                   .dbsym r row 16 c
 00EE                   .dbend
 00EE                   .dbfunc e KEY_INI _KEY_INI fV
                        .even
 00EE           _KEY_INI::
 00EE                   .dbline -1
 00EE                   .dbline 56
 00EE           ; }
 00EE           ; /**************解码函数 end*******************/
 00EE           ; /**************键盘初始化 stat*******************/
 00EE           ; void KEY_INI(void)//高四位输出并拉高
 00EE           ; {
 00EE                   .dbline 57
 00EE           ;   KEYDDR = 0x0F;
 00EE 8FE0              ldi R24,15
 00F0 87BB              out 0x17,R24
 00F2                   .dbline 58
 00F2           ;   KEYPORT = 0x0F;
 00F2 88BB              out 0x18,R24
 00F4                   .dbline 61
 00F4           ;   
 00F4           ;   /*************INT0初始化 start******************/
 00F4           ;   PORTD &= 0xFB;
 00F4 82B3              in R24,0x12
 00F6 8B7F              andi R24,251
 00F8 82BB              out 0x12,R24
 00FA                   .dbline 62
 00FA           ;   DDRD  &= 0xFB;
 00FA 81B3              in R24,0x11
 00FC 8B7F              andi R24,251
 00FE 81BB              out 0x11,R24
 0100                   .dbline 63
 0100           ;   MCUCR=(1<<ISC01)|(1<<ISC00);//上升沿触发
 0100 83E0              ldi R24,3
 0102 85BF              out 0x35,R24
 0104                   .dbline 64
 0104           ;   GICR=(1<<INT0);
 0104 80E4              ldi R24,64
 0106 8BBF              out 0x3b,R24
 0108                   .dbline -2
 0108                   .dbline 67
 0108           ; /**************INT0初始化 end*******************/
 0108           ; 
 0108           ; } 
 0108           L34:
 0108                   .dbline 0 ; func end
 0108 0895              ret
 010A                   .dbend

⌨️ 快捷键说明

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