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

📄 4x4key.lis

📁 39 数码管显示4×4键盘矩阵按键(修改后)
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .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 + -