📄 key_board.lis
字号:
.module key_board.c
.area lit(rom, con, rel)
0000 _key_board_table::
0000 0001 .byte 0,1
0002 0203 .byte 2,3
0004 0405 .byte 4,5
0006 0607 .byte 6,7
0008 0809 .byte 8,9
000A 0A0B .byte 10,11
000C 0C0D .byte 12,13
000E 0E0F .byte 14,15
0010 .dbfile E:\democode\key_4\source\lib\key_board.c
0010 .dbsym e key_board_table _key_board_table A[16:16]kc
.area data(ram, con, rel)
0000 .dbfile E:\democode\key_4\source\lib\key_board.c
0000 _KEY_FLAG::
0000 .blkb 1
.area idata
0000 00 .byte 0
.area data(ram, con, rel)
0001 .dbfile E:\democode\key_4\source\lib\key_board.c
0001 .dbsym e KEY_FLAG _KEY_FLAG c
0001 _key::
0001 .blkb 1
.area idata
0001 FF .byte 255
.area data(ram, con, rel)
0002 .dbfile E:\democode\key_4\source\lib\key_board.c
0002 .dbsym e key _key c
.area vector(rom, abs)
.org 4
0004 0C940000 jmp _int_isr
.area data(ram, con, rel)
0002 .dbfile E:\democode\key_4\source\lib\key_board.c
.area text(rom, con, rel)
0000 .dbfile E:\democode\key_4\source\lib\key_board.c
0000 .dbfunc e int_isr _int_isr fV
.even
0000 _int_isr::
0000 0E940000 xcall push_lset
0004 .dbline -1
0004 .dbline 22
0004 ; /**************************************
0004 ; ** Filename: key_board.c
0004 ; ** Describe: 矩阵键盘程序
0004 ; ** Author : 古欣 www.avrvi.com
0004 ; ** Time : 2007-2-15
0004 ; **************************************/
0004 ;
0004 ; #include "..\config.h"
0004 ;
0004 ; const uint8 key_board_table[]={0,1,2,3,
0004 ; 4,5,6,7,
0004 ; 8,9,10,11,
0004 ; 12,13,14,15};
0004 ; //键值可以任意设定,请不要使用0xFF
0004 ; //const uint8 key_board_table[]={0,1,2,3,4,5,6,7,8,9,10,11,'A','B','C','D'};
0004 ;
0004 ; //如果使用中断
0004 ; #if KEY_USE_INT==1
0004 ; volatile uint8 KEY_FLAG=0,key=0xff; //加 volatile 允许在中断中修改
0004 ; #pragma interrupt_handler int_isr:IV_number
0004 ; void int_isr(void)
0004 ; {
0004 .dbline 23
0004 ; KEY_FLAG = 1; //中断中标记已经产生按键中断,由于使用低电平触发方式,不用再考虑防抖问题
0004 81E0 ldi R24,1
0006 80930000 sts _KEY_FLAG,R24
000A .dbline 24
000A ; key = key_board_get_key(); //读取键值
000A 1AD0 xcall _key_board_get_key
000C 00930100 sts _key,R16
0010 .dbline -2
0010 L1:
0010 0E940000 xcall pop_lset
0014 .dbline 0 ; func end
0014 1895 reti
0016 .dbend
0016 .dbfunc e key_int_init _key_int_init fV
.even
0016 _key_int_init::
0016 .dbline -1
0016 .dbline 39
0016 ; }
0016 ; #endif
0016 ;
0016 ; /***********************************************************
0016 ; ** 函数名称: void key_board_int(void)
0016 ; ** 功能描述: 中断脚初始化
0016 ; ** 输 入: 无
0016 ; ** 输出 : 无
0016 ; ** 全局变量: 无
0016 ; ** 调用模块:
0016 ; ** 说明:输入,并使能内部上拉
0016 ; ** 注意:
0016 ; **********************************************************/
0016 ; void key_int_init(void)
0016 ; {
0016 .dbline 40
0016 ; KEY_INT_DDR &=~ (1<<KEY_INT);
0016 8A98 cbi 0x11,2
0018 .dbline 41
0018 ; KEY_INT_RORT |= (1<<KEY_INT);
0018 929A sbi 0x12,2
001A .dbline 42
001A ; GICR |= (1<<INT_BIT); //中断允许位,如INT0
001A 8BB7 in R24,0x3b
001C 8064 ori R24,64
001E 8BBF out 0x3b,R24
0020 .dbline -2
0020 L2:
0020 .dbline 0 ; func end
0020 0895 ret
0022 .dbend
0022 .dbfunc e key_board_int _key_board_int fV
.even
0022 _key_board_int::
0022 .dbline -1
0022 .dbline 57
0022 ; }
0022 ;
0022 ; /***********************************************************
0022 ; ** 函数名称: void key_board_int(void)
0022 ; ** 功能描述: 矩阵键盘扫描初始化
0022 ; ** 输 入: 无
0022 ; ** 输出 : 无
0022 ; ** 全局变量: 无
0022 ; ** 调用模块:
0022 ; ** 说明:默认初始化为行输出低,列输入,并使能内部上拉
0022 ; ** 注意:
0022 ; **********************************************************/
0022 ;
0022 ; void key_board_int(void)
0022 ; {
0022 .dbline 58
0022 ; KEY_DDR_ROW |= KEY_ROW_ALL; //行输出,低
0022 8AB3 in R24,0x1a
0024 806F ori R24,240
0026 8ABB out 0x1a,R24
0028 .dbline 59
0028 ; KEY_PORT_ROW &=~ KEY_ROW_ALL;
0028 8BB3 in R24,0x1b
002A 8F70 andi R24,15
002C 8BBB out 0x1b,R24
002E .dbline 60
002E ; KEY_DDR_COL &=~ KEY_COL_ALL; //列输入,并使能内部上拉
002E 8AB3 in R24,0x1a
0030 807F andi R24,240
0032 8ABB out 0x1a,R24
0034 .dbline 61
0034 ; KEY_PORT_COL |= KEY_COL_ALL;
0034 8BB3 in R24,0x1b
0036 8F60 ori R24,15
0038 8BBB out 0x1b,R24
003A .dbline 63
003A ; #if BEEP_EN ==1
003A ; BEEP_DDR |= (1<<BEEP_BIT);
003A 889A sbi 0x11,0
003C .dbline 64
003C ; BEEP_PORT &=~ (1<<BEEP_BIT);
003C 9098 cbi 0x12,0
003E .dbline -2
003E L3:
003E .dbline 0 ; func end
003E 0895 ret
0040 .dbend
0040 .dbfunc e key_board_get_key _key_board_get_key fc
0040 ; key_i -> R20
0040 ; temp_key -> R22
.even
0040 _key_board_get_key::
0040 0E940000 xcall push_gset3
0044 .dbline -1
0044 .dbline 80
0044 ; #endif
0044 ; }
0044 ;
0044 ; /***********************************************************
0044 ; ** 函数名称: uint8 key_board_get_key(void)
0044 ; ** 功能描述: 矩阵键盘扫描并读取键值
0044 ; ** 输 入: 无
0044 ; ** 输出 : 按键的键值,在key_board_table[]定义,无按键返回0xFF
0044 ; ** 全局变量: 无
0044 ; ** 调用模块: void key_board_int(void)
0044 ; ** 说明:通过预定义#define WAIT_KEY_UP设置等待按键抬起(1),不等待按键抬起(0)
0044 ; ** 注意:如果不等待按键抬起,很容易产生粘贴键,注意在程序中处理。
0044 ; **********************************************************/
0044 ;
0044 ; uint8 key_board_get_key(void)
0044 ; {
0044 .dbline 81
0044 ; uint8 key_i=0,temp_key=0;
0044 4427 clr R20
0046 .dbline 81
0046 6627 clr R22
0048 .dbline 82
0048 ; if(HAVE_KEY_DOWN)
0048 89B3 in R24,0x19
004A 8F70 andi R24,15
004C 8F30 cpi R24,15
004E 09F4 brne X2
0050 60C0 xjmp L5
0052 X2:
0052 .dbline 83
0052 ; {
0052 .dbline 87
0052 ; #if KEY_USE_INT==0
0052 ; Delay100us(1); //使用中断进行扫描不加延时
0052 ; #endif
0052 ; if(HAVE_KEY_DOWN)
0052 89B3 in R24,0x19
0054 8F70 andi R24,15
0056 8F30 cpi R24,15
0058 09F4 brne X3
005A 53C0 xjmp L7
005C X3:
005C .dbline 88
005C ; {
005C .dbline 91
005C ;
005C ; #if BEEP_EN ==1
005C ; BEEP_PORT |= (1<<BEEP_BIT); //蜂鸣器响
005C 909A sbi 0x12,0
005E .dbline 94
005E ; #endif
005E ;
005E ; temp_key = ( KEY_COL_ALL & KEY_PIN_COL ); //读取键值
005E 69B3 in R22,0x19
0060 6F70 andi R22,15
0062 .dbline 96
0062 ;
0062 ; switch(temp_key)
0062 A62E mov R10,R22
0064 BB24 clr R11
0066 C501 movw R24,R10
0068 8730 cpi R24,7
006A E0E0 ldi R30,0
006C 9E07 cpc R25,R30
006E 99F0 breq L15
0070 8B30 cpi R24,11
0072 E0E0 ldi R30,0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -