📄 4x4key.lis
字号:
.module _4X4key.c
.area text(rom, con, rel)
0000 .dbfile H:\39数码~1\4X4key.c
0000 .dbfunc e delay_ms _delay_ms fV
0000 ; i -> R20,R21
0000 ; j -> R22,R23
0000 ; k -> R16,R17
.even
0000 _delay_ms::
0000 0E940000 xcall push_gset2
0004 .dbline -1
0004 .dbline 15
0004 ; //-----------------------------------------------------------------
0004 ; // 名称: 数码管显示4×4 键盘矩阵按键序号
0004 ; //-----------------------------------------------------------------
0004 ; // 说明: 本例运行时,数码管会显示所按下的任意按键在键盘矩阵上的位置.
0004 ; // 扫描程序首先判断按键发生在哪一列,然后判断按键发生在哪一行,
0004 ; // 由列号和行号即可得到键盘按键序号.
0004 ; //
0004 ; //-----------------------------------------------------------------
0004 ; #include <iom16v.h>
0004 ; #include <macros.h>
0004 ; #define uchar unsigned char
0004 ; #define uint unsigned int
0004 ; //=============================
0004 ; void delay_ms(uint k) //毫秒级的延时子函数
0004 ; {
0004 .dbline 17
0004 ; uint i,j;
0004 ; for(i=0;i<k;i++)
0004 4427 clr R20
0006 5527 clr R21
0008 0BC0 xjmp L5
000A L2:
000A .dbline 18
000A ; {
000A .dbline 19
000A ; for(j=0;j<1140;j++)
000A 6627 clr R22
000C 7727 clr R23
000E 02C0 xjmp L9
0010 L6:
0010 .dbline 20
0010 L7:
0010 .dbline 19
0010 6F5F subi R22,255 ; offset = 1
0012 7F4F sbci R23,255
0014 L9:
0014 .dbline 19
0014 6437 cpi R22,116
0016 E4E0 ldi R30,4
0018 7E07 cpc R23,R30
001A D0F3 brlo L6
001C .dbline 21
001C L3:
001C .dbline 17
001C 4F5F subi R20,255 ; offset = 1
001E 5F4F sbci R21,255
0020 L5:
0020 .dbline 17
0020 4017 cp R20,R16
0022 5107 cpc R21,R17
0024 90F3 brlo L2
0026 .dbline -2
0026 L1:
0026 0E940000 xcall pop_gset2
002A .dbline 0 ; func end
002A 0895 ret
002C .dbsym r i 20 i
002C .dbsym r j 22 i
002C .dbsym r k 16 i
002C .dbend
.area lit(rom, con, rel)
0000 _SEG_CODE::
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 .dbsym e SEG_CODE _SEG_CODE A[16:16]kc
.area data(ram, con, rel)
0000 .dbfile H:\39数码~1\4X4key.c
0000 _KeyNo::
0000 .blkb 1
.area idata
0000 10 .byte 16
.area data(ram, con, rel)
0001 .dbfile H:\39数码~1\4X4key.c
0001 .dbsym e KeyNo _KeyNo c
.area text(rom, con, rel)
002C .dbfile H:\39数码~1\4X4key.c
002C .dbfunc e KeyMatrix_Down _KeyMatrix_Down fc
.even
002C _KeyMatrix_Down::
002C 0E940000 xcall push_gset1
0030 .dbline -1
0030 .dbline 40
0030 ; ;
0030 ; }
0030 ; }
0030 ;
0030 ; #define BEEP() PORTD ^= BIT(PD7) //蜂鸣器
0030 ;
0030 ; //0-9,A-F的数码管段码
0030 ; const uchar SEG_CODE[] =
0030 ; {
0030 ; 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
0030 ; 0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71
0030 ; };
0030 ;
0030 ; //当前按键序号,该矩阵中序号范围为0-15,16表示无按键
0030 ; uchar KeyNo = 16 ;
0030 ;
0030 ; //-----------------------------------------------------------------
0030 ; // 判断键盘矩阵是否有键按下
0030 ; //-----------------------------------------------------------------
0030 ; uchar KeyMatrix_Down()
0030 ; {
0030 .dbline 42
0030 ; //高4位输出,低4位输入,高4位先置0
0030 ; DDRB=0xF0;
0030 80EF ldi R24,240
0032 87BB out 0x17,R24
0034 .dbline 43
0034 ; PORTB=0x0F;
0034 8FE0 ldi R24,15
0036 88BB out 0x18,R24
0038 .dbline 44
0038 ; delay_ms(2);
0038 02E0 ldi R16,2
003A 10E0 ldi R17,0
003C E1DF xcall _delay_ms
003E .dbline 45
003E ; return PINB !=0x0F? 1:0; //如PINB为0x0F,则return 1 ,否则return 0
003E 86B3 in R24,0x16
0040 8F30 cpi R24,15
0042 19F0 breq L11
0044 41E0 ldi R20,1
0046 50E0 ldi R21,0
0048 02C0 xjmp L12
004A L11:
004A 4427 clr R20
004C 5527 clr R21
004E L12:
004E 042F mov R16,R20
0050 .dbline -2
0050 L10:
0050 0E940000 xcall pop_gset1
0054 .dbline 0 ; func end
0054 0895 ret
0056 .dbend
0056 .dbfunc e Keys_Scan _Keys_Scan fV
.even
0056 _Keys_Scan::
0056 0E940000 xcall push_gset1
005A .dbline -1
005A .dbline 52
005A ; }
005A ;
005A ; //-----------------------------------------------------------------
005A ; // 键盘矩阵扫描子程序
005A ; //-----------------------------------------------------------------
005A ; void Keys_Scan()
005A ; {
005A .dbline 54
005A ; //下面判断按键发生于0~3列中的哪一列
005A ; switch(PINB)
005A 46B3 in R20,0x16
005C 5527 clr R21
005E 4730 cpi R20,7
0060 E0E0 ldi R30,0
0062 5E07 cpc R21,R30
0064 C9F0 breq L20
0066 4B30 cpi R20,11
0068 E0E0 ldi R30,0
006A 5E07 cpc R21,R30
006C 89F0 breq L19
006E 4D30 cpi R20,13
0070 E0E0 ldi R30,0
0072 5E07 cpc R21,R30
0074 49F0 breq L18
0076 4E30 cpi R20,14
0078 E0E0 ldi R30,0
007A 5E07 cpc R21,R30
007C 09F0 breq L17
007E 10C0 xjmp L14
0080 X0:
0080 .dbline 55
0080 ; {
0080 L17:
0080 .dbline 56
0080 ; case 0B00001110: KeyNo=0;break;
0080 2224 clr R2
0082 20920000 sts _KeyNo,R2
0086 .dbline 56
0086 0FC0 xjmp L15
0088 L18:
0088 .dbline 57
0088 ; case 0B00001101: KeyNo=1;break;
0088 81E0 ldi R24,1
008A 80930000 sts _KeyNo,R24
008E .dbline 57
008E 0BC0 xjmp L15
0090 L19:
0090 .dbline 58
0090 ; case 0B00001011: KeyNo=2;break;
0090 82E0 ldi R24,2
0092 80930000 sts _KeyNo,R24
0096 .dbline 58
0096 07C0 xjmp L15
0098 L20:
0098 .dbline 59
0098 ; case 0B00000111: KeyNo=3;break;
0098 83E0 ldi R24,3
009A 80930000 sts _KeyNo,R24
009E .dbline 59
009E 03C0 xjmp L15
00A0 L14:
00A0 .dbline 60
00A0 ; default:KeyNo=0xFF;
00A0 8FEF ldi R24,255
00A2 80930000 sts _KeyNo,R24
00A6 .dbline 61
00A6 ; }
00A6 L15:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -