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

📄 getkey.lis

📁 4X4键盘扫描程序
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .module getkey.c
                        .area text(rom, con, rel)
 0000                   .dbfile E:\MYDOCU~1\ICCAVR_Directory\4x4keys\getkey.c
 0000                   .dbfunc e main _main fV
 0000           ;            key -> R22
                        .even
 0000           _main::
 0000                   .dbline -1
 0000                   .dbline 29
 0000           ; /*--------------------------------------------------------------------------------
 0000           ; **工程名称:键盘扫描测试程序
 0000           ; **编译器:ICCAVR6.31A pro
 0000           ; **日期:2005.04.14
 0000           ; **作者:neutronlmk
 0000           ; 
 0000           ; **芯片类型:M16
 0000           ; **时钟频率:外接4M
 0000           ; 
 0000           ; ---------------------------------------------------------------------------------*/
 0000           ; #include <iom16v.h>
 0000           ; #include <macros.h>
 0000           ; 
 0000           ; #define led_port PORTA
 0000           ; #define led_port_ddr DDRA
 0000           ; #define key_port PORTD
 0000           ; #define key_port_ddr DDRD
 0000           ; #define key_port_pin PIND
 0000           ; 
 0000           ; /*------------------------------------函数声明----------------------------------*/
 0000           ; signed char get_key(void);
 0000           ; void delay_1us(void);
 0000           ; void delay_nus(unsigned int n);
 0000           ; void delay_1ms(void);
 0000           ; void delay_nms(unsigned int n);
 0000           ; 
 0000           ; /*----------------------------------主函数--------------------------------------*/
 0000           ; void main(void)
 0000           ; {
 0000                   .dbline 31
 0000           ;       //端口初始化
 0000           ;       led_port_ddr=0xff;
 0000 8FEF              ldi R24,255
 0002 8ABB              out 0x1a,R24
 0004                   .dbline 32
 0004           ;       led_port=0x00;
 0004 2224              clr R2
 0006 2BBA              out 0x1b,R2
 0008                   .dbline 33
 0008           ;       key_port_ddr=0xf0;
 0008 80EF              ldi R24,240
 000A 81BB              out 0x11,R24
 000C                   .dbline 34
 000C           ;       key_port=0xf0;
 000C 82BB              out 0x12,R24
 000E 5CC0              xjmp L3
 0010           L2:
 0010                   .dbline 38
 0010           ; 
 0010           ;       //死循环,获取键值,并在发光二极管上提示
 0010           ;       while(1)
 0010           ;       {
 0010                   .dbline 40
 0010           ;               signed char key;
 0010           ;               key=get_key();
 0010 5DD0              xcall _get_key
 0012 602F              mov R22,R16
 0014                   .dbline 41
 0014           ;               if(key!=0xff)
 0014 0F3F              cpi R16,255
 0016 09F4              brne X3
 0018 57C0              xjmp L5
 001A           X3:
 001A                   .dbline 42
 001A           ;               {
 001A                   .dbline 43
 001A           ;                       switch(key)
 001A 462F              mov R20,R22
 001C 5527              clr R21
 001E 47FD              sbrc R20,7
 0020 5095              com R21
 0022 4030              cpi R20,0
 0024 4507              cpc R20,R21
 0026 69F1              breq L10
 0028           X0:
 0028 4130              cpi R20,1
 002A E0E0              ldi R30,0
 002C 5E07              cpc R21,R30
 002E 61F1              breq L11
 0030 4230              cpi R20,2
 0032 E0E0              ldi R30,0
 0034 5E07              cpc R21,R30
 0036 59F1              breq L12
 0038 4330              cpi R20,3
 003A E0E0              ldi R30,0
 003C 5E07              cpc R21,R30
 003E 51F1              breq L13
 0040 4430              cpi R20,4
 0042 E0E0              ldi R30,0
 0044 5E07              cpc R21,R30
 0046 49F1              breq L14
 0048 4530              cpi R20,5
 004A E0E0              ldi R30,0
 004C 5E07              cpc R21,R30
 004E 41F1              breq L15
 0050 4630              cpi R20,6
 0052 E0E0              ldi R30,0
 0054 5E07              cpc R21,R30
 0056 39F1              breq L16
 0058 4730              cpi R20,7
 005A E0E0              ldi R30,0
 005C 5E07              cpc R21,R30
 005E 31F1              breq L17
 0060 4830              cpi R20,8
 0062 E0E0              ldi R30,0
 0064 5E07              cpc R21,R30
 0066 29F1              breq L18
 0068 4930              cpi R20,9
 006A E0E0              ldi R30,0
 006C 5E07              cpc R21,R30
 006E 21F1              breq L19
 0070 4A30              cpi R20,10
 0072 E0E0              ldi R30,0
 0074 5E07              cpc R21,R30
 0076 19F1              breq L20
 0078 4B30              cpi R20,11
 007A E0E0              ldi R30,0
 007C 5E07              cpc R21,R30
 007E 11F1              breq L21
 0080 23C0              xjmp L8
 0082           X1:
 0082                   .dbline 44
 0082           ;                       {
 0082           L10:
 0082                   .dbline 45
 0082           ;                               case 0:led_port=0x01;break;
 0082 81E0              ldi R24,1
 0084 8BBB              out 0x1b,R24
 0086                   .dbline 45
 0086 20C0              xjmp L8
 0088           L11:
 0088                   .dbline 46
 0088           ;                               case 1:led_port=0x02;break;
 0088 82E0              ldi R24,2
 008A 8BBB              out 0x1b,R24
 008C                   .dbline 46
 008C 1DC0              xjmp L8
 008E           L12:
 008E                   .dbline 47
 008E           ;                               case 2:led_port=0x04;break;
 008E 84E0              ldi R24,4
 0090 8BBB              out 0x1b,R24
 0092                   .dbline 47
 0092 1AC0              xjmp L8
 0094           L13:
 0094                   .dbline 48
 0094           ;                               case 3:led_port=0x08;break;
 0094 88E0              ldi R24,8
 0096 8BBB              out 0x1b,R24
 0098                   .dbline 48
 0098 17C0              xjmp L8
 009A           L14:
 009A                   .dbline 49
 009A           ;                               case 4:led_port=0x10;break;
 009A 80E1              ldi R24,16
 009C 8BBB              out 0x1b,R24
 009E                   .dbline 49
 009E 14C0              xjmp L8
 00A0           L15:
 00A0                   .dbline 50
 00A0           ;                               case 5:led_port=0x20;break;
 00A0 80E2              ldi R24,32
 00A2 8BBB              out 0x1b,R24
 00A4                   .dbline 50
 00A4 11C0              xjmp L8
 00A6           L16:
 00A6                   .dbline 51
 00A6           ;                               case 6:led_port=0x40;break;
 00A6 80E4              ldi R24,64
 00A8 8BBB              out 0x1b,R24
 00AA                   .dbline 51
 00AA 0EC0              xjmp L8
 00AC           L17:
 00AC                   .dbline 52
 00AC           ;                               case 7:led_port=0x80;break;
 00AC 80E8              ldi R24,128
 00AE 8BBB              out 0x1b,R24
 00B0                   .dbline 52
 00B0 0BC0              xjmp L8
 00B2           L18:
 00B2                   .dbline 53
 00B2           ;                               case 8:led_port=0x03;break;
 00B2 83E0              ldi R24,3
 00B4 8BBB              out 0x1b,R24
 00B6                   .dbline 53
 00B6 08C0              xjmp L8
 00B8           L19:
 00B8                   .dbline 54
 00B8           ;                               case 9:led_port=0x06;break;
 00B8 86E0              ldi R24,6
 00BA 8BBB              out 0x1b,R24
 00BC                   .dbline 54
 00BC 05C0              xjmp L8
 00BE           L20:
 00BE                   .dbline 55
 00BE           ;                               case 10:led_port=0x0c;break;
 00BE 8CE0              ldi R24,12
 00C0 8BBB              out 0x1b,R24
 00C2                   .dbline 55
 00C2 02C0              xjmp L8
 00C4           L21:
 00C4                   .dbline 56
 00C4           ;                               case 11:led_port=0x18;break;
 00C4 88E1              ldi R24,24
 00C6 8BBB              out 0x1b,R24
 00C8                   .dbline 56
 00C8                   .dbline 57
 00C8           ;                               default:break;
 00C8           L8:
 00C8                   .dbline 59
 00C8           ;                               }
 00C8           ;                       }
 00C8           L5:
 00C8                   .dbline 60
 00C8           L3:
 00C8                   .dbline 37
 00C8 A3CF              xjmp L2
 00CA           X2:
 00CA                   .dbline -2
 00CA           L1:
 00CA                   .dbline 0 ; func end
 00CA 0895              ret
 00CC                   .dbsym r key 22 C
 00CC                   .dbend
 00CC                   .dbfunc e get_key _get_key fC
 00CC           ;              i -> R22
 00CC           ;            tem -> R10
                        .even
 00CC           _get_key::
 00CC 0E940000          xcall push_gset3
 00D0                   .dbline -1
 00D0                   .dbline 66
 00D0           ;               }
 00D0           ;       }
 00D0           ;                       
 00D0           ; /*----------------------------------------------获取按键函数---------------------------------*/
 00D0           ; //获取键值函数,返回0~11号按键,无按键按下则返回0xff
 00D0           ; signed char get_key(void)
 00D0           ; {
 00D0                   .dbline 68
 00D0           ;       unsigned char i,tem;
 00D0           ;       key_port_ddr=0x0f;//使能键盘口高四位的上拉电阻
 00D0 8FE0              ldi R24,15
 00D2 81BB              out 0x11,R24
 00D4                   .dbline 69
 00D4           ;       key_port=0xff;
 00D4 8FEF              ldi R24,255
 00D6 82BB              out 0x12,R24
 00D8                   .dbline 70
 00D8           ;       for(i=0;i<3;i++)//若4*4键盘,这里应为i<4,因为现在PD3悬空,PD3没电平变化,所以你改i<4也不会出错^__^
 00D8 6627              clr R22
 00DA 5CC0              xjmp L26
 00DC           L23:
 00DC                   .dbline 71
 00DC           ;       {
 00DC                   .dbline 72
 00DC           ;               key_port=~(1<<i);//键盘线扫描,从PD0~PD2逐位电位变低
 00DC 01E0              ldi R16,1
 00DE 162F              mov R17,R22
 00E0 0E940000          xcall lsl8
 00E4 202E              mov R2,R16
 00E6 2094              com R2
 00E8 22BA              out 0x12,R2
 00EA                   .dbline 73
 00EA           ;               delay_nus(100);//延时等待电平稳定
 00EA 04E6              ldi R16,100
 00EC 10E0              ldi R17,0
 00EE 5BD0              xcall _delay_nus
 00F0                   .dbline 74
 00F0           ;               tem=key_port_pin&0xf0;//读键盘扫描信号(PD口高四位)状态,屏蔽低四位
 00F0 80B3              in R24,0x10
 00F2 807F              andi R24,240
 00F4 A82E              mov R10,R24
 00F6                   .dbline 75
 00F6           ;               if(tem!=0xf0)//若PD高四位不等于0xf0,则PD高四位引脚有可能被拉低(即有按键按下)
 00F6 803F              cpi R24,240

⌨️ 快捷键说明

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