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

📄 keyscan.lst

📁 一个解决5个IO口扫描25个按键的解决方法,完整文件包,有参考意义,C51.
💻 LST
📖 第 1 页 / 共 4 页
字号:
__start:
__text_start:
      34 E5CF      LDI	R28,0x5F
      35 E0D4      LDI	R29,4
      36 BFCD      OUT	0x3D,R28
      37 BFDE      OUT	0x3E,R29
      38 52C0      SUBI	R28,0x20
      39 40D0      SBCI	R29,0
      3A EA0A      LDI	R16,0xAA
      3B 8308      STD	Y+0,R16
      3C 2400      CLR	R0
      3D E6E5      LDI	R30,0x65
      3E E0F0      LDI	R31,0
      3F E010      LDI	R17,0
      40 36E5      CPI	R30,0x65
      41 07F1      CPC	R31,R17
      42 F011      BEQ	0x0045
      43 9201      ST	R0,Z+
      44 CFFB      RJMP	0x0040
      45 8300      STD	Z+0,R16
      46 E6E2      LDI	R30,0x62
      47 E0F0      LDI	R31,0
      48 E6A0      LDI	R26,0x60
      49 E0B0      LDI	R27,0
      4A E010      LDI	R17,0
      4B E000      LDI	R16,0
      4C BF0B      OUT	0x3B,R16
      4D 36E7      CPI	R30,0x67
      4E 07F1      CPC	R31,R17
      4F F021      BEQ	0x0054
      50 95C8      LPM
      51 9631      ADIW	R30,1
      52 920D      ST	R0,X+
      53 CFF9      RJMP	0x004D
      54 D210      RCALL	_main
_exit:
      55 CFFF      RJMP	_exit
FILE: F:\AVR\按键扫描\EX_Support.c
(0001) /***********************************************************
(0002) *   函数库说明:底层硬件初始化驱动函数库                   *
(0003) *   版本:                                                 *
(0004) *   作者:                                                 *
(0005) *   创建日期:                                             *
(0006) * -------------------------------------------------------- *
(0007) *  [硬件说明]                                              *
(0008) *   处理器:                                               *
(0009) *   系统时钟:                                             *
(0010) * -------------------------------------------------------- *
(0011) *  [支 持 库]                                              *
(0012) *   支持库名称:HD_Support.h                               *
(0013) *   需要版本:  -----                                      *
(0014) *   支持库说明:底层硬件初始化声明库                       *
(0015) *                                                          *
(0016) *   支持库名称:EX_Support.h                               *
(0017) *   需要版本:  -----                                      *
(0018) *   支持库说明:底层硬件初始化驱动声明库                   *
(0019) *                                                          *
(0020) *   支持库名称:PF_Config.h                                *
(0021) *   需要版本:  -----                                      *
(0022) *   支持库说明:硬件平台配置声明库                         *
(0023) * -------------------------------------------------------- *
(0024) *  [版本更新]                                              *
(0025) *   修改:                                                 *
(0026) *   修改日期:                                             *
(0027) *   版本:                                                 *
(0028) * -------------------------------------------------------- *
(0029) *  [版本历史]                                              *
(0030) * -------------------------------------------------------- *
(0031) *  [使用说明]                                              *
(0032) ***********************************************************/
(0033) 
(0034) /********************
(0035) * 头 文 件 配 置 区 *
(0036) ********************/
(0037) //# define _USE_VIRTUAL_SPI_SND_CODE
(0038) # include "PF_Config.h"
(0039) # include "Ex_Support.h"
(0040) 
(0041) /********************
(0042) *   系 统 宏 定 义  *
(0043) ********************/
(0044) 
(0045) /*------------------*
(0046) *   常 数 宏 定 义  *
(0047) *------------------*/
(0048) 
(0049) /*------------------*
(0050) *   动 作 宏 定 义  *
(0051) *------------------*/
(0052) /*
(0053) # define VSPI_WAIT_SIGNAL_LOW(__SIGNAL)  \
(0054)             do\
(0055)             {\
(0056)                 while((__SIGNAL));\
(0057)                 Delay_MS(50);\
(0058)             }\
(0059)             while((__SIGNAL));
(0060) # define VSPI_WAIT_SIGNAL_HIGH(__SIGNAL)  \
(0061)             do\
(0062)             {\
(0063)                 while(!(__SIGNAL));\
(0064)                 Delay_MS(50);\
(0065)             }\
(0066)             while(!(__SIGNAL));
(0067) */
(0068) # define VSPI_WAIT_SIGNAL_LOW(__SIGNAL)  while((__SIGNAL));
(0069) # define VSPI_WAIT_SIGNAL_HIGH(__SIGNAL) while(!(__SIGNAL));
(0070) /********************
(0071) *  模块结构体定义区 *
(0072) ********************/
(0073) 
(0074) /********************
(0075) *   函 数 声 明 区  *
(0076) ********************/
(0077) void Insert_Timer0_OVF_ISR_Code(void);
(0078) void Driver_INIT(void);
(0079) void Delay_MS(uint16 wTime);
(0080) UINT8 Key_Scan(void);
(0081) #ifdef _USE_VIRTUAL_SPI_RCV_CODE
(0082) UINT8 chVirtualSPIReceiver(void);
(0083) #endif
(0084) #ifdef _USE_VIRTUAL_SPI_SND_CODE
(0085) void chVirtualSPISender(UINT8 chData);
(0086) #endif
(0087) /********************
(0088) *   模块函数声明区  *
(0089) ********************/
(0090) 
(0091) 
(0092) /********************
(0093) *   模块变量声明区  *
(0094) ********************/
(0095) static uint16 s_wSystemDelayTimerCounter = 0;
(0096) /********************
(0097) *   全局变量声明区  *
(0098) ********************/
(0099) uint16 g_wSystemTimer = 0;
(0100) 
(0101) /***********************************************************
(0102) *   函数说明:软件驱动初始化函数                           *
(0103) *   输入:    无                                           *
(0104) *   输出:    无                                           *
(0105) *   调用函数:无                                           *
(0106) ***********************************************************/
(0107) void Driver_INIT(void)
(0108) {
_Driver_INIT:
      56 9508      RET
(0109)     //*在这里插入你的各类软件驱动初始化代码*//
(0110) }
(0111) 
(0112) /***********************************************************
(0113) *   函数说明:系统毫秒延时函数                             *
(0114) *   输入:    需要延时的时间长度                           *
(0115) *   输出:    无                                           *
(0116) *   调用函数:无                                           *
(0117) ***********************************************************/
(0118) void Delay_MS(uint16 wTime)
(0119) {
(0120)     s_wSystemDelayTimerCounter = wTime;
_Delay_MS:
  wTime                --> R16
      57 9310 0061 STS	0x0061,R17
      59 9300 0060 STS	0x0060,R16
(0121)     
(0122)     while(s_wSystemDelayTimerCounter);
      5B 9020 0060 LDS	R2,0x0060
      5D 9030 0061 LDS	R3,0x0061
      5F 2022      TST	R2
      60 F7D1      BNE	0x005B
      61 2033      TST	R3
      62 F7C1      BNE	0x005B
      63 9508      RET
(0123) }
(0124) 
(0125) /***********************************************************
(0126) *   函数说明:定时器0中断处理程序代码插入函数              *
(0127) *   输入:    无                                           *
(0128) *   输出:    无                                           *
(0129) *   调用函数:无                                           *
(0130) ***********************************************************/
(0131) void Insert_Timer0_OVF_ISR_Code(void)
(0132) {
(0133)     static UINT8 n = 0;
(0134)     g_wSystemTimer++;
_Insert_Timer0_OVF_ISR_Code:
      64 9180 0062 LDS	R24,g_wSystemTimer
      66 9190 0063 LDS	R25,g_wSystemTimer+1
      68 9601      ADIW	R24,1
      69 9390 0063 STS	g_wSystemTimer+1,R25
      6B 9380 0062 STS	g_wSystemTimer,R24
(0135) 
(0136)     if (s_wSystemDelayTimerCounter)
      6D 9020 0060 LDS	R2,0x0060
      6F 9030 0061 LDS	R3,0x0061
      71 2022      TST	R2
      72 F411      BNE	0x0075
      73 2033      TST	R3
      74 F031      BEQ	0x007B
(0137)     {
(0138)         s_wSystemDelayTimerCounter--;
      75 01C1      MOVW	R24,R2
      76 9701      SBIW	R24,1
      77 9390 0061 STS	0x0061,R25
      79 9380 0060 STS	0x0060,R24
(0139)     }
(0140)     
(0141)     if (!(g_wSystemTimer & (BIT(7) - 1)))
      7B 9180 0062 LDS	R24,g_wSystemTimer
      7D 9190 0063 LDS	R25,g_wSystemTimer+1
      7F 778F      ANDI	R24,0x7F
      80 7090      ANDI	R25,0
      81 3080      CPI	R24,0
      82 0789      CPC	R24,R25
      83 F469      BNE	0x0091
(0142)     {
(0143)         n++;
      84 9180 0064 LDS	R24,EX_Support.c:n
      86 5F8F      SUBI	R24,0xFF
      87 9380 0064 STS	EX_Support.c:n,R24
(0144)         n &= BIT(3)-1;
      89 7087      ANDI	R24,7
      8A 9380 0064 STS	EX_Support.c:n,R24
(0145)         chVirtualSPISender(~BIT(n));
      8C 2F18      MOV	R17,R24
      8D E001      LDI	R16,1
      8E D1DF      RCALL	lsl8
      8F 9500      COM	R16
      90 D001      RCALL	_chVirtualSPISender
(0146)     }
      91 9508      RET
_chVirtualSPISender:
  chBITCounter1        --> R20
  chData               --> R10
      92 92AA      ST	R10,-Y
      93 934A      ST	R20,-Y
      94 2EA0      MOV	R10,R16
(0147) }
(0148) 
(0149) 
(0150) 
(0151) #ifdef _USE_VIRTUAL_SPI_RCV_CODE
(0152) /***********************************************************
(0153) *   函数说明:虚拟SPI接收机                                *
(0154) *   输入:    无                                           *
(0155) *   输出:    接收到的数据                                 *
(0156) *   调用函数:无                                           *
(0157) ***********************************************************/
(0158) UINT8 chVirtualSPIReceiver(void)
(0159) {
(0160)     UINT8 chRCVData = 0;
(0161)     UINT8 chCounter = 0;
(0162)     
(0163)     VSPI_WAIT_SIGNAL_LOW(VSPI_SS)
(0164)     //PORTC &= ~BIT(PC0);
(0165)     while(!VSPI_SS)
(0166)     {
(0167)         VSPI_WAIT_SIGNAL_LOW(VSPI_CLK)
(0168)         PORTC ^= BIT(PC0);
(0169)         chRCVData <<= 1;
(0170)         chRCVData |= VSPI_DATA;
(0171)         chCounter++;
(0172)         VSPI_WAIT_SIGNAL_HIGH(VSPI_CLK)
(0173)         if (chCounter == 8)
(0174)         {
(0175)             break;
(0176)         }   
(0177)     }
(0178)     PORTC &= ~BIT(PC0);
(0179)     return chRCVData;
(0180)     
(0181) }
(0182) #endif
(0183) 
(0184) #ifdef _USE_VIRTUAL_SPI_SND_CODE
(0185) /***********************************************************
(0186) *   函数说明:虚拟SPI发送函数                              *
(0187) *   输入:    要发送的字节                                 *
(0188) *   输出:    无                                           *
(0189) *   调用函数:无                                           *
(0190) ***********************************************************/
(0191) void chVirtualSPISender(UINT8 chData)
(0192) {
(0193)     UINT8 chBITCounter = 0;
(0194)     
(0195)     CLR_VSPI_SS
      95 98C3      CBI	0x18,3
(0196)     
(0197)     for (chBITCounter = 0;chBITCounter < 8;chBITCounter++)
      96 2744      CLR	R20
      97 C012      RJMP	0x00AA
(0198)     {
(0199)         SET_VSPI_CLK
      98 9AC2      SBI	0x18,2
(0200)         if (chData & BIT(chBITCounter))
      99 E001      LDI	R16,1
      9A 2F14      MOV	R17,R20
      9B D1D2      RCALL	lsl8
      9C 2C2A      MOV	R2,R10
      9D 2220      AND	R2,R16
      9E F011      BEQ	0x00A1
(0201)         {
(0202)             SET_VSPI_DATA
      9F 9AC1      SBI	0x18,1
(0203)         }
      A0 C001      RJMP	0x00A2
(0204)         else
(0205)         {
(0206)             CLR_VSPI_DATA
      A1 98C1      CBI	0x18,1
(0207)         }
(0208)         Delay_MS(5);
      A2 E005      LDI	R16,5
      A3 E010      LDI	R17,0
      A4 DFB2      RCALL	_Delay_MS
(0209)         CLR_VSPI_CLK
      A5 98C2      CBI	0x18,2
(0210)         
(0211)         Delay_MS(5);
      A6 E005      LDI	R16,5
      A7 E010      LDI	R17,0
      A8 DFAE      RCALL	_Delay_MS
      A9 9543      INC	R20
      AA 3048      CPI	R20,0x8
      AB F360      BCS	0x0098
(0212)     }
(0213)     
(0214)     SET_VSPI_SS
      AC 9AC3      SBI	0x18,3
      AD 9149      LD	R20,Y+
      AE 90A9      LD	R10,Y+
      AF 9508      RET
(0215) }
(0216) #endif
(0217) 
(0218) /***********************************************************
(0219) *   函数说明:按键扫描函数                                 *
(0220) *   输入:    无                                           *
(0221) *   输出:    按键的扫描码(如果无按键返回KEY_NULL)       *
(0222) #   调用函数:无                                           *
(0223) ***********************************************************/
(0224) UINT8 Key_Scan(void)
(0225) {
(0226)    UINT8 chTempKeyCode = KEY_NULL;
_Key_Scan:
  chTempKeyCode0       --> R16
      B0 EF0F      LDI	R16,0xFF
(0227)    //填写扫描代码
(0228)    
(0229)    //首先扫描A列
(0230)    CLR_A;
      B1 B385      IN	R24,0x15
      B2 6388      ORI	R24,0x38
      B3 BB85      OUT	0x15,R24
      B4 98AB      CBI	0x15,3
      B5 0000      NOP
(0231)    
(0232)    if (!READ_PINX)                                         
      B6 9B99      SBIS	0x13,1
      B7 C002      RJMP	0x00BA
      B8 E021      LDI	R18,1
      B9 C001      RJMP	0x00BB
      BA 2722      CLR	R18
      BB 2322      TST	R18
      BC F411      BNE	0x00BF
(0233)    {
(0234)        chTempKeyCode = 0x00;
      BD 2700      CLR	R16
(0235)    }
      BE C008      RJMP	0x00C7
(0236)    else if (!READ_PINY)
      BF 9B9A      SBIS	0x13,2
      C0 C002      RJMP	0x00C3
      C1 E021      LDI	R18,1
      C2 C001      RJMP	0x00C4
      C3 2722      CLR	R18
      C4 2322      TST	R18
      C5 F409      BNE	0x00C7
(0237)    {
(0238)        chTempKeyCode = 0x03;
      C6 E003      LDI	R16,3
(0239)    }
(0240)    
(0241)    CLR_B;
      C7 B385      IN	R24,0x15

⌨️ 快捷键说明

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