ex_support.lis

来自「一个解决5个IO口扫描25个按键的解决方法,完整文件包,有参考意义,C51.」· LIS 代码 · 共 1,572 行 · 第 1/5 页

LIS
1,572
字号
 007E           ; 
 007E           ; #ifdef _USE_VIRTUAL_SPI_SND_CODE
 007E           ; /***********************************************************
 007E           ; *   函数说明:虚拟SPI发送函数                              *
 007E           ; *   输入:    要发送的字节                                 *
 007E           ; *   输出:    无                                           *
 007E           ; *   调用函数:无                                           *
 007E           ; ***********************************************************/
 007E           ; void chVirtualSPISender(UINT8 chData)
 007E           ; {
 007E                   .dbline 193
 007E           ;     UINT8 chBITCounter = 0;
 007E                   .dbline 195
 007E           ;     
 007E           ;     CLR_VSPI_SS
 007E C398              cbi 0x18,3
 0080                   .dbline 197
 0080           ;     
 0080           ;     for (chBITCounter = 0;chBITCounter < 8;chBITCounter++)
 0080 4427              clr R20
 0082 12C0              rjmp L16
 0084           L13:
 0084                   .dbline 198
 0084           ;     {
 0084                   .dbline 199
 0084           ;         SET_VSPI_CLK
 0084 C29A              sbi 0x18,2
 0086                   .dbline 200
 0086           ;         if (chData & BIT(chBITCounter))
 0086 01E0              ldi R16,1
 0088 142F              mov R17,R20
 008A 00D0              rcall lsl8
 008C 2A2C              mov R2,R10
 008E 2022              and R2,R16
 0090 11F0              breq L17
 0092           X3:
 0092                   .dbline 201
 0092           ;         {
 0092                   .dbline 202
 0092           ;             SET_VSPI_DATA
 0092 C19A              sbi 0x18,1
 0094                   .dbline 203
 0094           ;         }
 0094 01C0              rjmp L18
 0096           L17:
 0096                   .dbline 205
 0096           ;         else
 0096           ;         {
 0096                   .dbline 206
 0096           ;             CLR_VSPI_DATA
 0096 C198              cbi 0x18,1
 0098                   .dbline 207
 0098           ;         }
 0098           L18:
 0098                   .dbline 208
 0098           ;         Delay_MS(5);
 0098 05E0              ldi R16,5
 009A 10E0              ldi R17,0
 009C B2DF              rcall _Delay_MS
 009E                   .dbline 209
 009E           ;         CLR_VSPI_CLK
 009E C298              cbi 0x18,2
 00A0                   .dbline 211
 00A0           ;         
 00A0           ;         Delay_MS(5);
 00A0 05E0              ldi R16,5
 00A2 10E0              ldi R17,0
 00A4 AEDF              rcall _Delay_MS
 00A6                   .dbline 212
 00A6           ;     }
 00A6           L14:
 00A6                   .dbline 197
 00A6 4395              inc R20
 00A8           L16:
 00A8                   .dbline 197
 00A8 4830              cpi R20,8
 00AA 60F3              brlo L13
 00AC           X4:
 00AC                   .dbline 214
 00AC           ;     
 00AC           ;     SET_VSPI_SS
 00AC C39A              sbi 0x18,3
 00AE                   .dbline -2
 00AE           L12:
 00AE                   .dbline 0 ; func end
 00AE 4991              ld R20,y+
 00B0 A990              ld R10,y+
 00B2 0895              ret
 00B4                   .dbsym r chBITCounter1 20 c
 00B4                   .dbsym r chData 10 c
 00B4                   .dbend
 00B4                   .dbfunc e Key_Scan _Key_Scan fc
 00B4           ; chTempKeyCode0 -> R16
                        .even
 00B4           _Key_Scan::
 00B4                   .dbline -1
 00B4                   .dbline 225
 00B4           ; }
 00B4           ; #endif
 00B4           ; 
 00B4           ; /***********************************************************
 00B4           ; *   函数说明:按键扫描函数                                 *
 00B4           ; *   输入:    无                                           *
 00B4           ; *   输出:    按键的扫描码(如果无按键返回KEY_NULL)       *
 00B4           ; #   调用函数:无                                           *
 00B4           ; ***********************************************************/
 00B4           ; UINT8 Key_Scan(void)
 00B4           ; {
 00B4                   .dbline 226
 00B4           ;    UINT8 chTempKeyCode = KEY_NULL;
 00B4 0FEF              ldi R16,255
 00B6                   .dbline 230
 00B6           ;    //填写扫描代码
 00B6           ;    
 00B6           ;    //首先扫描A列
 00B6           ;    CLR_A;
 00B6 85B3              in R24,0x15
 00B8 8863              ori R24,56
 00BA 85BB              out 0x15,R24
 00BC                   .dbline 230
 00BC                   .dbline 230
 00BC AB98              cbi 0x15,3
 00BE                   .dbline 230
 00BE 0000              nop
 00C0                   .dbline 230
 00C0                   .dbline 232
 00C0           ;    
 00C0           ;    if (!READ_PINX)                                         
 00C0 999B              sbis 0x13,1
 00C2 02C0              rjmp L22
 00C4           X5:
 00C4 21E0              ldi R18,1
 00C6 01C0              rjmp L23
 00C8           L22:
 00C8 2227              clr R18
 00CA           L23:
 00CA 2223              tst R18
 00CC 11F4              brne L20
 00CE           X6:
 00CE                   .dbline 233
 00CE           ;    {
 00CE                   .dbline 234
 00CE           ;        chTempKeyCode = 0x00;
 00CE 0027              clr R16
 00D0                   .dbline 235
 00D0           ;    }
 00D0 08C0              rjmp L21
 00D2           L20:
 00D2                   .dbline 236
 00D2           ;    else if (!READ_PINY)
 00D2 9A9B              sbis 0x13,2
 00D4 02C0              rjmp L26
 00D6           X7:
 00D6 21E0              ldi R18,1
 00D8 01C0              rjmp L27
 00DA           L26:
 00DA 2227              clr R18
 00DC           L27:
 00DC 2223              tst R18
 00DE 09F4              brne L24
 00E0           X8:
 00E0                   .dbline 237
 00E0           ;    {
 00E0                   .dbline 238
 00E0           ;        chTempKeyCode = 0x03;
 00E0 03E0              ldi R16,3
 00E2                   .dbline 239
 00E2           ;    }
 00E2           L24:
 00E2           L21:
 00E2                   .dbline 241
 00E2           ;    
 00E2           ;    CLR_B;
 00E2 85B3              in R24,0x15
 00E4 8863              ori R24,56
 00E6 85BB              out 0x15,R24
 00E8                   .dbline 241
 00E8                   .dbline 241
 00E8 AC98              cbi 0x15,4
 00EA                   .dbline 241
 00EA 0000              nop
 00EC                   .dbline 241
 00EC                   .dbline 242
 00EC           ;    if (!READ_PINX)                                         
 00EC 999B              sbis 0x13,1
 00EE 02C0              rjmp L30
 00F0           X9:
 00F0 21E0              ldi R18,1
 00F2 01C0              rjmp L31
 00F4           L30:
 00F4 2227              clr R18
 00F6           L31:
 00F6 2223              tst R18
 00F8 11F4              brne L28
 00FA           X10:
 00FA                   .dbline 243
 00FA           ;    {
 00FA                   .dbline 244
 00FA           ;        chTempKeyCode = 0x01;
 00FA 01E0              ldi R16,1
 00FC                   .dbline 245
 00FC           ;    }
 00FC 08C0              rjmp L29
 00FE           L28:
 00FE                   .dbline 246
 00FE           ;    else if (!READ_PINY)
 00FE 9A9B              sbis 0x13,2
 0100 02C0              rjmp L34
 0102           X11:
 0102 21E0              ldi R18,1
 0104 01C0              rjmp L35
 0106           L34:
 0106 2227              clr R18
 0108           L35:
 0108 2223              tst R18
 010A 09F4              brne L32
 010C           X12:
 010C                   .dbline 247
 010C           ;    {
 010C                   .dbline 248
 010C           ;        chTempKeyCode = 0x04;
 010C 04E0              ldi R16,4
 010E                   .dbline 249
 010E           ;    }
 010E           L32:
 010E           L29:
 010E                   .dbline 251
 010E           ;    
 010E           ;    CLR_C;
 010E 85B3              in R24,0x15
 0110 8863              ori R24,56
 0112 85BB              out 0x15,R24
 0114                   .dbline 251
 0114                   .dbline 251
 0114 AD98              cbi 0x15,5
 0116                   .dbline 251
 0116 0000              nop
 0118                   .dbline 251
 0118                   .dbline 252
 0118           ;    if (!READ_PINX)                                          
 0118 999B              sbis 0x13,1
 011A 02C0              rjmp L38
 011C           X13:
 011C 21E0              ldi R18,1
 011E 01C0              rjmp L39
 0120           L38:
 0120 2227              clr R18
 0122           L39:
 0122 2223              tst R18
 0124 11F4              brne L36
 0126           X14:
 0126                   .dbline 253
 0126           ;    {
 0126                   .dbline 254
 0126           ;        chTempKeyCode = 0x02;
 0126 02E0              ldi R16,2
 0128                   .dbline 255
 0128           ;    }
 0128 08C0              rjmp L37
 012A           L36:
 012A                   .dbline 256
 012A           ;    else if (!READ_PINY)
 012A 9A9B              sbis 0x13,2
 012C 02C0              rjmp L42
 012E           X15:
 012E 21E0              ldi R18,1
 0130 01C0              rjmp L43
 0132           L42:
 0132 2227              clr R18
 0134           L43:
 0134 2223              tst R18
 0136 09F4              brne L40
 0138           X16:
 0138                   .dbline 257
 0138           ;    {
 0138                   .dbline 258
 0138           ;        chTempKeyCode = 0x05;
 0138 05E0              ldi R16,5
 013A                   .dbline 259
 013A           ;    }
 013A           L40:
 013A           L37:
 013A                   .dbline 261
 013A           ;    
 013A           ;    return chTempKeyCode;
 013A                   .dbline -2
 013A           L19:
 013A                   .dbline 0 ; func end
 013A 0895              ret
 013C                   .dbsym r chTempKeyCode0 16 c
 013C                   .dbend
 013C                   .dbfunc e Key_Scan_New _Key_Scan_New fc
                        .even
 013C           _Key_Scan_New::
 013C                   .dbline -1
 013C                   .dbline 265
 013C           ; }
 013C           ; ////////////////////////////////////////////////////////////////////////////
 013C           ; UINT8 Key_Scan_New(void)
 013C           ; {
 013C                   .dbline 266
 013C           ;    UINT8 chTempKeyCode = KEY_NULL;                                            //为按键的编码设初值
 013C                   .dbline 270
 013C           ;    
 013C           ;    
 013C           ;    //先对21-25按钮进行扫描
 013C           ;    DDRC &= ~(BIT(1) | BIT(2) | BIT(3) |
 013C 84B3              in R24,0x14
 013E 817C              andi R24,193
 0140 84BB              out 0x14,R24
 0142                   .dbline 273
 0142           ;              BIT(4) | BIT(5));                                                        //把端口pc1-pc5都置为输入
 0142           ;                        
 0142           ;    PORTC |=  BIT(1) | BIT(2) | BIT(3) |
 0142 85B3              in R24,0x15

⌨️ 快捷键说明

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