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

📄 key_board.lis

📁 键盘操作 键盘扫描 用的是单片机mega16
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .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 + -