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

📄 kbscan.lis

📁 用ICC写的ATMega8的4X4键盘驱动程序
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .module kbscan.c
                        .area lit(rom, con, rel)
 0000           _digital::
 0000 3F06              .byte 63,6
 0002 5B4F              .byte 91,'O
 0004 666D              .byte 'f,'m
 0006 7D07              .byte 125,7
 0008 7F6F              .byte 127,'o
 000A 777C              .byte 'w,124
 000C 395E              .byte 57,94
 000E 7971              .byte 'y,'q
 0010                   .dbfile H:\嵌入式开发\单片机\Proj\4x4KeyBoard\kbscan.c
 0010                   .dbsym e digital _digital A[16:16]kc
                        .area text(rom, con, rel)
 0000                   .dbfile H:\嵌入式开发\单片机\Proj\4x4KeyBoard\kbscan.c
 0000                   .dbfunc e delay_1ms _delay_1ms fV
 0000           ;              i -> R16,R17
                        .even
 0000           _delay_1ms::
 0000                   .dbline -1
 0000                   .dbline 35
 0000           ; /**************************************************************************
 0000           ; Description:线翻转法键盘扫描程序,只检测和处理单键
 0000           ; 
 0000           ; 4*4键盘排列:
 0000           ;    0   1   2   3
 0000           ;  -----------------
 0000           ; |  0   1   2   3  | 0
 0000           ; |  4   5   6   7  | 1
 0000           ; |  8   9   A   B  | 2
 0000           ; |  C   D   E   F  | 3
 0000           ;  -----------------
 0000           ; 
 0000           ; Write by:杨震禹
 0000           ; Time:2007-1-5
 0000           ; ***************************************************************************/
 0000           ; #include <iom8v.h>
 0000           ; #include <macros.h>
 0000           ; 
 0000           ; #define key_port PORTB         //定义键盘接口
 0000           ; #define port_DDR DDRB
 0000           ; #define port_PIN PINB
 0000           ; typedef unsigned int UINT;
 0000           ; typedef unsigned char UCHAR;
 0000           ; 
 0000           ; const UCHAR digital[16] = 
 0000           ; {
 0000           ;  0x3f, 0x6, 0x5b, 0x4f,  //0,1,2,3
 0000           ;  0x66, 0x6d, 0x7d, 0x7,  //4,5,6,7
 0000           ;  0x7f, 0x6f, 0x77, 0x7c,  //8,9,A,B
 0000           ;  0x39, 0x5e, 0x79, 0x71   //C,D,E,F
 0000           ; };
 0000           ; 
 0000           ; /*延时程序*/
 0000           ; void delay_1ms(void)
 0000           ; {//1ms延时函数
 0000                   .dbline 37
 0000           ;       UINT i;
 0000           ;       for(i=0; i<141; i++)
 0000 0027              clr R16
 0002 1127              clr R17
 0004 02C0              rjmp L5
 0006           L2:
 0006                   .dbline 38
 0006                   .dbline 38
 0006           L3:
 0006                   .dbline 37
 0006 0F5F              subi R16,255  ; offset = 1
 0008 1F4F              sbci R17,255
 000A           L5:
 000A                   .dbline 37
 000A 0D38              cpi R16,141
 000C E0E0              ldi R30,0
 000E 1E07              cpc R17,R30
 0010 D0F3              brlo L2
 0012                   .dbline -2
 0012           L1:
 0012                   .dbline 0 ; func end
 0012 0895              ret
 0014                   .dbsym r i 16 i
 0014                   .dbend
 0014                   .dbfunc e delay _delay fV
 0014           ;              i -> R20,R21
 0014           ;              n -> R22,R23
                        .even
 0014           _delay::
 0014 00D0              rcall push_gset2
 0016 B801              movw R22,R16
 0018                   .dbline -1
 0018                   .dbline 42
 0018           ;       {}
 0018           ; }
 0018           ; 
 0018           ; void delay(UINT n)
 0018           ; {//延时n毫秒
 0018                   .dbline 44
 0018           ;       UINT i;
 0018           ;       for(i=0; i<n; i++)      //执行n次1毫秒延时
 0018 4427              clr R20
 001A 5527              clr R21
 001C 03C0              rjmp L10
 001E           L7:
 001E                   .dbline 45
 001E F0DF              rcall _delay_1ms
 0020           L8:
 0020                   .dbline 44
 0020 4F5F              subi R20,255  ; offset = 1
 0022 5F4F              sbci R21,255
 0024           L10:
 0024                   .dbline 44
 0024 4617              cp R20,R22
 0026 5707              cpc R21,R23
 0028 D0F3              brlo L7
 002A                   .dbline -2
 002A           L6:
 002A 00D0              rcall pop_gset2
 002C                   .dbline 0 ; func end
 002C 0895              ret
 002E                   .dbsym r i 20 i
 002E                   .dbsym r n 22 i
 002E                   .dbend
 002E                   .dbfunc e scan_init _scan_init fV
                        .even
 002E           _scan_init::
 002E                   .dbline -1
 002E                   .dbline 50
 002E           ;               delay_1ms();
 002E           ; }
 002E           ; 
 002E           ; /*键盘扫描*/
 002E           ; void scan_init(void)
 002E           ; {//初始化键盘扫描端口
 002E                   .dbline 51
 002E           ;       key_port = 0xff;
 002E 8FEF              ldi R24,255
 0030 88BB              out 0x18,R24
 0032                   .dbline 52
 0032           ;       port_DDR = 0x0f; //高四位输入,开上拉电阻
 0032 8FE0              ldi R24,15
 0034 87BB              out 0x17,R24
 0036                   .dbline 53
 0036           ;       key_port = 0xf0; //低四位输出0
 0036 80EF              ldi R24,240
 0038 88BB              out 0x18,R24
 003A                   .dbline -2
 003A           L11:
 003A                   .dbline 0 ; func end
 003A 0895              ret
 003C                   .dbend
 003C                   .dbfunc e scan_turn _scan_turn fV
                        .even
 003C           _scan_turn::
 003C                   .dbline -1
 003C                   .dbline 57
 003C           ; }
 003C           ; 
 003C           ; void scan_turn(void)
 003C           ; {//端口输出翻转
 003C                   .dbline 58
 003C           ;       key_port |= 0x0f;
 003C 88B3              in R24,0x18
 003E 8F60              ori R24,15
 0040 88BB              out 0x18,R24
 0042                   .dbline 59
 0042           ;       port_DDR = 0xf0;  //低四位输入,开上拉电阻
 0042 80EF              ldi R24,240
 0044 87BB              out 0x17,R24
 0046                   .dbline 60
 0046           ;       key_port &= 0x0f; //高四位输出0
 0046 88B3              in R24,0x18
 0048 8F70              andi R24,15
 004A 88BB              out 0x18,R24
 004C                   .dbline -2
 004C           L12:
 004C                   .dbline 0 ; func end
 004C 0895              ret
 004E                   .dbend
 004E                   .dbfunc e kbscan _kbscan fc
 004E           ;            col -> R20
 004E           ;            row -> R22
                        .even
 004E           _kbscan::
 004E 00D0              rcall push_gset4
 0050                   .dbline -1
 0050                   .dbline 64
 0050           ; }
 0050           ; 
 0050           ; UCHAR kbscan(void)
 0050           ; {
 0050                   .dbline 66
 0050           ;       UCHAR row, col; //行、列坐标
 0050           ;       row = 4;
 0050 64E0              ldi R22,4
 0052                   .dbline 67
 0052           ;       col = 4;
 0052 44E0              ldi R20,4
 0054                   .dbline 68
 0054           ;       scan_init();
 0054 ECDF              rcall _scan_init
 0056                   .dbline 69
 0056           ;       if((port_PIN&0xf0)!=0xf0) { //有键按下
 0056 86B3              in R24,0x16
 0058 807F              andi R24,240
 005A 803F              cpi R24,240
 005C 09F4              brne X3
 005E 57C0              rjmp L14
 0060           X3:
 0060                   .dbline 69
 0060                   .dbline 70
 0060           ;               delay(5);   //防抖
 0060 05E0              ldi R16,5
 0062 10E0              ldi R17,0
 0064 D7DF              rcall _delay
 0066                   .dbline 71
 0066           ;               if((port_PIN&0xf0)!=0xf0) {
 0066 86B3              in R24,0x16
 0068 807F              andi R24,240
 006A 803F              cpi R24,240
 006C 09F4              brne X4
 006E 4FC0              rjmp L16
 0070           X4:
 0070                   .dbline 71
 0070                   .dbline 72
 0070           ;                       row = (port_PIN&0xf0); //行值
 0070 66B3              in R22,0x16
 0072 607F              andi R22,240
 0074                   .dbline 74
 0074           ;                       
 0074           ;                       scan_turn();   //翻转
 0074 E3DF              rcall _scan_turn
 0076                   .dbline 76
 0076           ;                       
 0076           ;                       if((port_PIN&0x0f)!=0x0f)
 0076 86B3              in R24,0x16
 0078 8F70              andi R24,15
 007A 8F30              cpi R24,15
 007C 11F0              breq L18
 007E                   .dbline 77
 007E           ;                               col = (port_PIN&0x0f); //列值
 007E 46B3              in R20,0x16
 0080 4F70              andi R20,15
 0082           L18:
 0082                   .dbline 80
 0082           ;                       

⌨️ 快捷键说明

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