📄 getkey.lis
字号:
.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 + -