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

📄 keyboard.lst

📁 一个关于AVR单片机的例程
💻 LST
📖 第 1 页 / 共 2 页
字号:
__start:
__text_start:
    002A E5CF      LDI	R28,0x5F
    002B E0D4      LDI	R29,4
    002C BFCD      OUT	0x3D,R28
    002D BFDE      OUT	0x3E,R29
    002E 51C0      SUBI	R28,0x10
    002F 40D0      SBCI	R29,0
    0030 EA0A      LDI	R16,0xAA
    0031 8308      STD	Y+0,R16
    0032 2400      CLR	R0
    0033 E6E0      LDI	R30,0x60
    0034 E0F0      LDI	R31,0
    0035 E010      LDI	R17,0
    0036 36E0      CPI	R30,0x60
    0037 07F1      CPC	R31,R17
    0038 F011      BEQ	0x003B
    0039 9201      ST	R0,Z+
    003A CFFB      RJMP	0x0036
    003B 8300      STD	Z+0,R16
    003C E5E4      LDI	R30,0x54
    003D E0F0      LDI	R31,0
    003E E6A0      LDI	R26,0x60
    003F E0B0      LDI	R27,0
    0040 E010      LDI	R17,0
    0041 35E4      CPI	R30,0x54
    0042 07F1      CPC	R31,R17
    0043 F021      BEQ	0x0048
    0044 95C8      LPM
    0045 9631      ADIW	R30,1
    0046 920D      ST	R0,X+
    0047 CFF9      RJMP	0x0041
    0048 940E005E  CALL	_main
_exit:
    004A CFFF      RJMP	_exit
_port_init:
    004B 2422      CLR	R2
    004C BA2B      OUT	0x1B,R2
    004D BA2A      OUT	0x1A,R2
    004E EF8F      LDI	R24,0xFF
    004F BB88      OUT	0x18,R24
    0050 BB87      OUT	0x17,R24
    0051 BA25      OUT	0x15,R2
    0052 BA24      OUT	0x14,R2
    0053 BA22      OUT	0x12,R2
    0054 BA21      OUT	0x11,R2
    0055 9508      RET
_init_devices:
    0056 94F8      BCLR	7
    0057 DFF3      RCALL	_port_init
    0058 2422      CLR	R2
    0059 BE25      OUT	0x35,R2
    005A BE2B      OUT	0x3B,R2
    005B BE29      OUT	0x39,R2
    005C 9478      BSET	7
    005D 9508      RET
_main:
    005E DFF7      RCALL	_init_devices
    005F C003      RJMP	0x0063
    0060 940E0095  CALL	_get_key
    0062 BB08      OUT	0x18,R16
    0063 CFFC      RJMP	0x0060
    0064 9508      RET
_key_scan:
  key                  --> R20
  temp                 --> R22
    0065 940E01A8  CALL	push_gset2
FILE: D:\桌面\教程\keyboard\keyboard.c
(0001) /**************************************
(0002) ** Filename: keyboard.c
(0003) ** Describe: 矩阵键盘程序
(0004) ** Author : 古欣 www.avrvi.com
(0005) ** Time  :   2007-2-15
(0006) **************************************/
(0007) 
(0008) #include "config.h"
(0009) 
(0010) /**************************************
(0011) ** 说明:线翻转法进行键盘扫描
(0012) ** 输出:获得高低位的扫描值
(0013) ** 有键时需要耗时 14ms
(0014) **************************************/
(0015) unsigned char key_scan(void)
(0016) {
(0017)  unsigned char temp=0,key=0;
    0067 2766      CLR	R22
    0068 2744      CLR	R20
(0018)  KEY_DDR  = 0xF0;  //高四位输出0,键按下,则对应的值为0
    0069 EF80      LDI	R24,0xF0
    006A BB8A      OUT	0x1A,R24
(0019)  KEY_PORT = 0x0F;  //低四位输入,内部电阻上拉,没有键按下时为高
    006B E08F      LDI	R24,0xF
    006C BB8B      OUT	0x1B,R24
(0020)  temp = KEY_PIN&0x0F;//与掉高四位
    006D B369      IN	R22,0x19
    006E 706F      ANDI	R22,0xF
(0021)  if(temp==0x0F)
    006F 306F      CPI	R22,0xF
    0070 F411      BNE	0x0073
(0022)  {
(0023)   return 0; // 无按键返回
    0071 2700      CLR	R16
    0072 C01F      RJMP	0x0092
(0024)  }
(0025)  else
(0026)  {
(0027)   delay_ms(10);
    0073 E00A      LDI	R16,0xA
    0074 E010      LDI	R17,0
    0075 940E0160  CALL	_delay_ms
(0028)   temp = KEY_PIN&0x0F; //延时去抖后再检测
    0077 B369      IN	R22,0x19
    0078 706F      ANDI	R22,0xF
(0029)   if(temp==0x0F)
    0079 306F      CPI	R22,0xF
    007A F411      BNE	0x007D
(0030)     return 0;
    007B 2700      CLR	R16
    007C C015      RJMP	0x0092
(0031)   else
(0032)     key=temp; 
    007D 2F46      MOV	R20,R22
(0033)  }
(0034)  //翻转
(0035)  KEY_DDR  = 0x0F;  //低四位输出0,键按下,则对应的值为0
    007E E08F      LDI	R24,0xF
    007F BB8A      OUT	0x1A,R24
(0036)  KEY_PORT = 0xF0;  //高四位输入,内部电阻上拉,没有键按下时为高
    0080 EF80      LDI	R24,0xF0
    0081 BB8B      OUT	0x1B,R24
(0037)  delay_ms(3);     //延时等待稳定
    0082 E003      LDI	R16,3
    0083 E010      LDI	R17,0
    0084 940E0160  CALL	_delay_ms
(0038)  
(0039)  temp = KEY_PIN&0xF0;//与掉低四位
    0086 B369      IN	R22,0x19
    0087 7F60      ANDI	R22,0xF0
(0040)  if(temp==0xF0)
    0088 3F60      CPI	R22,0xF0
    0089 F411      BNE	0x008C
(0041)  {
(0042)   return 0; // 无按键返回
    008A 2700      CLR	R16
    008B C006      RJMP	0x0092
(0043)  }
(0044)  else   //这里不再延时再扫描,因为已经确定了不是抖动才会进入本步操作。
(0045)  {
(0046)     key |= temp; //高低位的键值进入KEY
    008C 2B46      OR	R20,R22
(0047)  }
(0048)  KEY_DDR = 0x00;/*输出复位*/
    008D 2422      CLR	R2
    008E BA2A      OUT	0x1A,R2
(0049)  KEY_PORT = 0xFF;
    008F EF8F      LDI	R24,0xFF
    0090 BB8B      OUT	0x1B,R24
(0050) 
(0051)  return key;
    0091 2F04      MOV	R16,R20
    0092 940E019F  CALL	pop_gset2
    0094 9508      RET
_get_key:
  i                    --> R20
    0095 940E01AA  CALL	push_gset1
(0052) }
(0053) 
(0054) 
(0055) /**************************************
(0056) ** 说明:获得键盘的值  
(0057) ** 内部调用函数key_scan
(0058) ** 输出:实际键值
(0059) **************************************/
(0060) unsigned char get_key(void)
(0061) {
(0062)  unsigned char i=0;
    0097 2744      CLR	R20
(0063)  i=key_scan();
    0098 DFCC      RCALL	_key_scan
    0099 2F40      MOV	R20,R16
(0064)  switch (i) {/*将按键码转换成键值*/
    009A 2755      CLR	R21
    009B 3B47      CPI	R20,0xB7
    009C E0E0      LDI	R30,0
    009D 075E      CPC	R21,R30
    009E F409      BNE	0x00A0
    009F C070      RJMP	0x0110
    00A0 3B4B      CPI	R20,0xBB
    00A1 E0E0      LDI	R30,0
    00A2 075E      CPC	R21,R30
    00A3 F409      BNE	0x00A5
    00A4 C069      RJMP	0x010E
    00A5 3B4D      CPI	R20,0xBD
    00A6 E0E0      LDI	R30,0
    00A7 075E      CPC	R21,R30
    00A8 F409      BNE	0x00AA
    00A9 C062      RJMP	0x010C
    00AA 3B4E      CPI	R20,0xBE
    00AB E0E0      LDI	R30,0
    00AC 075E      CPC	R21,R30
    00AD F409      BNE	0x00AF
    00AE C05B      RJMP	0x010A
    00AF EB8E      LDI	R24,0xBE
    00B0 E090      LDI	R25,0
    00B1 1784      CP	R24,R20
    00B2 0795      CPC	R25,R21
    00B3 F0F4      BLT	0x00D2
    00B4 3040      CPI	R20,0
    00B5 0745      CPC	R20,R21
    00B6 F409      BNE	0x00B8
    00B7 C040      RJMP	0x00F8
    00B8 3040      CPI	R20,0
    00B9 E0E0      LDI	R30,0
    00BA 075E      CPC	R21,R30
    00BB F40C      BGE	0x00BD
    00BC C05D      RJMP	0x011A
    00BD 3747      CPI	R20,0x77
    00BE E0E0      LDI	R30,0
    00BF 075E      CPC	R21,R30
    00C0 F409      BNE	0x00C2
    00C1 C056      RJMP	0x0118
    00C2 374B      CPI	R20,0x7B
    00C3 E0E0      LDI	R30,0
    00C4 075E      CPC	R21,R30
    00C5 F409      BNE	0x00C7
    00C6 C04F      RJMP	0x0116
    00C7 374D      CPI	R20,0x7D
    00C8 E0E0      LDI	R30,0
    00C9 075E      CPC	R21,R30
    00CA F409      BNE	0x00CC
    00CB C048      RJMP	0x0114
    00CC 374E      CPI	R20,0x7E
    00CD E0E0      LDI	R30,0
    00CE 075E      CPC	R21,R30
    00CF F409      BNE	0x00D1
    00D0 C041      RJMP	0x0112
    00D1 C048      RJMP	0x011A
    00D2 3D47      CPI	R20,0xD7
    00D3 E0E0      LDI	R30,0
    00D4 075E      CPC	R21,R30
    00D5 F191      BEQ	0x0108
    00D6 3D4B      CPI	R20,0xDB
    00D7 E0E0      LDI	R30,0
    00D8 075E      CPC	R21,R30
    00D9 F161      BEQ	0x0106
    00DA 3D4D      CPI	R20,0xDD
    00DB E0E0      LDI	R30,0
    00DC 075E      CPC	R21,R30
    00DD F131      BEQ	0x0104
    00DE 3D4E      CPI	R20,0xDE
    00DF E0E0      LDI	R30,0
    00E0 075E      CPC	R21,R30
    00E1 F101      BEQ	0x0102
    00E2 3D47      CPI	R20,0xD7
    00E3 E0E0      LDI	R30,0

⌨️ 快捷键说明

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