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