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

📄 keyboard.lst

📁 一个关于AVR单片机的例程
💻 LST
字号:
__start:
__text_start:
    0034 E5CF      LDI	R28,0x5F
    0035 E0D4      LDI	R29,4
    0036 BFCD      OUT	0x3D,R28
    0037 BFDE      OUT	0x3E,R29
    0038 51C0      SUBI	R28,0x10
    0039 40D0      SBCI	R29,0
    003A EA0A      LDI	R16,0xAA
    003B 8308      STD	Y+0,R16
    003C 2400      CLR	R0
    003D E6E4      LDI	R30,0x64
    003E E0F0      LDI	R31,0
    003F E010      LDI	R17,0
    0040 36E5      CPI	R30,0x65
    0041 07F1      CPC	R31,R17
    0042 F011      BEQ	0x0045
    0043 9201      ST	R0,Z+
    0044 CFFB      RJMP	0x0040
    0045 8300      STD	Z+0,R16
    0046 E6E4      LDI	R30,0x64
    0047 E0F0      LDI	R31,0
    0048 E6A0      LDI	R26,0x60
    0049 E0B0      LDI	R27,0
    004A E010      LDI	R17,0
    004B 36E8      CPI	R30,0x68
    004C 07F1      CPC	R31,R17
    004D F021      BEQ	0x0052
    004E 95C8      LPM
    004F 9631      ADIW	R30,1
    0050 920D      ST	R0,X+
    0051 CFF9      RJMP	0x004B
    0052 940E006D  CALL	_main
_exit:
    0054 CFFF      RJMP	_exit
FILE: D:\桌面\interrupt_wake_keyboard_4-4\main.c
(0001) //ICC-AVR application builder : 2007-5-16 5:50:45
(0002) // Target : M16
(0003) // Crystal: 4.0000Mhz
(0004) 
(0005) #include <iom16v.h>
(0006) #include <macros.h>
(0007) extern void delay_ms (int time);
(0008) void port_init(void)
(0009) {
(0010)  PORTA = 0x00;
_port_init:
    0055 2422      CLR	R2
    0056 BA2B      OUT	0x1B,R2
(0011)  DDRA  = 0xFF;
    0057 EF8F      LDI	R24,0xFF
    0058 BB8A      OUT	0x1A,R24
(0012)  PORTB = 0xF0;
    0059 EF80      LDI	R24,0xF0
    005A BB88      OUT	0x18,R24
(0013)  DDRB  = 0x0F;
    005B E08F      LDI	R24,0xF
    005C BB87      OUT	0x17,R24
(0014)  PORTC = 0x80; //m103 output only
    005D E880      LDI	R24,0x80
    005E BB85      OUT	0x15,R24
(0015)  DDRC  = 0x80;
    005F BB84      OUT	0x14,R24
(0016)  PORTD = 0x04;
    0060 E084      LDI	R24,4
    0061 BB82      OUT	0x12,R24
(0017)  DDRD  = 0x00;
    0062 BA21      OUT	0x11,R2
    0063 9508      RET
(0018) }
(0019) 
(0020) //call this routine to initialize all peripherals
(0021) void init_devices(void)
(0022) {
(0023)  //stop errant interrupts until set up
(0024)  CLI(); //disable all interrupts
_init_devices:
    0064 94F8      BCLR	7
(0025)  port_init();
    0065 DFEF      RCALL	_port_init
(0026) 
(0027)  MCUCR = 0x00;
    0066 2422      CLR	R2
    0067 BE25      OUT	0x35,R2
(0028)  GICR  = 0x40;
    0068 E480      LDI	R24,0x40
    0069 BF8B      OUT	0x3B,R24
(0029)  TIMSK = 0x00; //timer interrupt sources
    006A BE29      OUT	0x39,R2
(0030)  SEI(); //re-enable interrupts
    006B 9478      BSET	7
    006C 9508      RET
(0031)  //all peripherals are now initialized
(0032) }
(0033) 
(0034) 
(0035) const unsigned char table[]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b,0x77,0x1f,0x4e,0x3d,0x4f,0x47};
(0036) unsigned char position[]={0x80,0x80,0x80,0x80};
(0037) unsigned char key;
(0038) void main(void)
(0039) {
(0040) 
(0041) init_devices();
_main:
    006D DFF6      RCALL	_init_devices
    006E C009      RJMP	0x0078
(0042) while(1)
(0043) {
(0044)  PORTA=table[key];
    006F E584      LDI	R24,0x54
    0070 E090      LDI	R25,0
    0071 91E00064  LDS	R30,key
    0073 27FF      CLR	R31
    0074 0FE8      ADD	R30,R24
    0075 1FF9      ADC	R31,R25
    0076 91E4      LPM	R30,0(Z)
    0077 BBEB      OUT	0x1B,R30
    0078 CFF6      RJMP	0x006F
    0079 9508      RET
_scan_key:
    007A 940E012C  CALL	push_lset
    007C 940E0115  CALL	push_gset1
(0045)  }
(0046) }
(0047) /*
(0048) void main(void)
(0049) {
(0050) init_devices();
(0051)  for(;;)
(0052)  {
(0053)   unsigned char i;
(0054)   for(i=0;i<4;i++)
(0055)   {PORTC|=position[i];
(0056)    PORTA=table[key];
(0057)    delay_ms(2); 
(0058)   }
(0059)  }
(0060) } 
(0061) #pragma interrupt_handler scan_key:2
(0062)  void scan_key(void)
(0063)  { CLI();
(0064)   switch(PINB)
(0065)    {
(0066)     case 0x70:key=0;break;
(0067)     case 0xb0:key=1;break;
(0068)     case 0xd0:key=2;break;
(0069)     case 0xe0:key=3;break;
(0070)    }
(0071)   PORTB=0x0F;
(0072)   DDRB=0xF0;
(0073)   delay_ms(1);
(0074)   switch(PINB&0X0F)
(0075)     {
(0076) 	case 0x07:key=key+0;break;
(0077) 	case 0x0b:key=key+4;break;
(0078) 	case 0x0d:key=key+8;break;
(0079) 	case 0x0e:key=key+12;break;
(0080) 	}
(0081) 	PORTB=0xF0;
(0082)     DDRB=0x0F;
(0083) 	SEI();
(0084)  }
(0085) */
(0086) #pragma interrupt_handler scan_key:2
(0087)  void scan_key(void)
(0088) {
(0089) NOP();
    007E 0000      NOP
(0090)  NOP();
    007F 0000      NOP
(0091) 	PORTB=0xF0;
    0080 EF80      LDI	R24,0xF0
    0081 BB88      OUT	0x18,R24
(0092)     DDRB=0x0F;
    0082 E08F      LDI	R24,0xF
    0083 BB87      OUT	0x17,R24
(0093)   NOP();
    0084 0000      NOP
(0094)   if(PINB!=0xF0)
    0085 B386      IN	R24,0x16
    0086 3F80      CPI	R24,0xF0
    0087 F409      BNE	0x0089
    0088 C066      RJMP	0x00EF
(0095)   {
(0096)   delay_ms(10);
    0089 E00A      LDI	R16,0xA
    008A E010      LDI	R17,0
    008B 940E00FC  CALL	_delay_ms
(0097)   if(PINB!=0xF0)
    008D B386      IN	R24,0x16
    008E 3F80      CPI	R24,0xF0
    008F F409      BNE	0x0091
    0090 C05E      RJMP	0x00EF
(0098)   {
(0099)   //key=0;
(0100)    switch(PINB)
    0091 B346      IN	R20,0x16
    0092 2755      CLR	R21
    0093 3B40      CPI	R20,0xB0
    0094 E0E0      LDI	R30,0
    0095 075E      CPC	R21,R30
    0096 F0D9      BEQ	0x00B2
    0097 EB80      LDI	R24,0xB0
    0098 E090      LDI	R25,0
    0099 1784      CP	R24,R20
    009A 0795      CPC	R25,R21
    009B F02C      BLT	0x00A1
    009C 3740      CPI	R20,0x70
    009D E0E0      LDI	R30,0
    009E 075E      CPC	R21,R30
    009F F071      BEQ	0x00AE
    00A0 C01C      RJMP	0x00BD
    00A1 3D40      CPI	R20,0xD0
    00A2 E0E0      LDI	R30,0
    00A3 075E      CPC	R21,R30
    00A4 F089      BEQ	0x00B6
    00A5 3D40      CPI	R20,0xD0
    00A6 E0E0      LDI	R30,0
    00A7 075E      CPC	R21,R30
    00A8 F0A4      BLT	0x00BD
    00A9 3E40      CPI	R20,0xE0
    00AA E0E0      LDI	R30,0
    00AB 075E      CPC	R21,R30
    00AC F069      BEQ	0x00BA
    00AD C00F      RJMP	0x00BD
(0101)    {
(0102)     case 0x70:key=0;break;
    00AE 2422      CLR	R2
    00AF 92200064  STS	key,R2
    00B1 C00B      RJMP	0x00BD
(0103)     case 0xb0:key=1;break;
    00B2 E081      LDI	R24,1
    00B3 93800064  STS	key,R24
    00B5 C007      RJMP	0x00BD
(0104)     case 0xd0:key=2;break;
    00B6 E082      LDI	R24,2
    00B7 93800064  STS	key,R24
    00B9 C003      RJMP	0x00BD
(0105)     case 0xe0:key=3;break;
    00BA E083      LDI	R24,3
    00BB 93800064  STS	key,R24
(0106) 	default: break;
(0107)    }
(0108)   PORTB=0x0F;
    00BD E08F      LDI	R24,0xF
    00BE BB88      OUT	0x18,R24
(0109)   DDRB=0xF0;
    00BF EF80      LDI	R24,0xF0
    00C0 BB87      OUT	0x17,R24
(0110)   NOP();
    00C1 0000      NOP
(0111)   switch(PINB&0X0F)
    00C2 B346      IN	R20,0x16
    00C3 2755      CLR	R21
    00C4 704F      ANDI	R20,0xF
    00C5 7050      ANDI	R21,0
    00C6 3047      CPI	R20,7
    00C7 E0E0      LDI	R30,0
    00C8 075E      CPC	R21,R30
    00C9 F069      BEQ	0x00D7
    00CA 304B      CPI	R20,0xB
    00CB E0E0      LDI	R30,0
    00CC 075E      CPC	R21,R30
    00CD F071      BEQ	0x00DC
    00CE 304D      CPI	R20,0xD
    00CF E0E0      LDI	R30,0
    00D0 075E      CPC	R21,R30
    00D1 F081      BEQ	0x00E2
    00D2 304E      CPI	R20,0xE
    00D3 E0E0      LDI	R30,0
    00D4 075E      CPC	R21,R30
    00D5 F091      BEQ	0x00E8
    00D6 C016      RJMP	0x00ED
(0112)     {
(0113) 	case 0x07:key=key+0;break;
    00D7 90200064  LDS	R2,key
    00D9 92200064  STS	key,R2
    00DB C011      RJMP	0x00ED
(0114) 	case 0x0b:key=key+4;break;
    00DC 91800064  LDS	R24,key
    00DE 5F8C      SUBI	R24,0xFC
    00DF 93800064  STS	key,R24
    00E1 C00B      RJMP	0x00ED
(0115) 	case 0x0d:key=key+8;break;
    00E2 91800064  LDS	R24,key
    00E4 5F88      SUBI	R24,0xF8
    00E5 93800064  STS	key,R24
    00E7 C005      RJMP	0x00ED
(0116) 	case 0x0e:key=key+12;break;
    00E8 91800064  LDS	R24,key
    00EA 5F84      SUBI	R24,0xF4
    00EB 93800064  STS	key,R24
(0117) 	default: break;
(0118) 	}
(0119)   NOP();
    00ED 0000      NOP
(0120)   NOP();
    00EE 0000      NOP
(0121)   }
(0122)   }
    00EF 940E0118  CALL	pop_gset1
    00F1 940E0143  CALL	pop_lset
    00F3 9518      RETI
FILE: D:\桌面\interrupt_wake_keyboard_4-4\delay.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) extern void delay_us (int time);
(0004) void delay_us (int time)//微秒级延时
(0005) {do
(0006)  time--;
_delay_us:
  time                 --> R16
    00F4 5001      SUBI	R16,1
    00F5 4010      SBCI	R17,0
(0007)  while(time>0);
    00F6 2422      CLR	R2
    00F7 2433      CLR	R3
    00F8 1620      CP	R2,R16
    00F9 0631      CPC	R3,R17
    00FA F3CC      BLT	0x00F4
    00FB 9508      RET
_delay_ms:
  time                 --> R20
    00FC 940E0115  CALL	push_gset1
    00FE 01A8      MOVW	R20,R16
(0008) }
(0009) extern void delay_ms (int time)//毫秒级延时
(0010) {for(;time>0;time--)
    00FF C005      RJMP	0x0105
(0011)   delay_us(1000);
FILE: <library>
    0100 EE08      LDI	R16,0xE8
    0101 E013      LDI	R17,3
    0102 DFF1      RCALL	_delay_us
    0103 5041      SUBI	R20,1
    0104 4050      SBCI	R21,0
    0105 2422      CLR	R2
    0106 2433      CLR	R3
    0107 1624      CP	R2,R20
    0108 0635      CPC	R3,R21
    0109 F3B4      BLT	0x0100
    010A 940E0118  CALL	pop_gset1
    010C 9508      RET
push_gset5:
    010D 92FA      ST	R15,-Y
    010E 92EA      ST	R14,-Y
push_gset4:
    010F 92DA      ST	R13,-Y
    0110 92CA      ST	R12,-Y
push_gset3:
    0111 92BA      ST	R11,-Y
    0112 92AA      ST	R10,-Y
push_gset2:
    0113 937A      ST	R23,-Y
    0114 936A      ST	R22,-Y
push_gset1:
    0115 935A      ST	R21,-Y
    0116 934A      ST	R20,-Y
    0117 9508      RET
pop_gset1:
    0118 E0E1      LDI	R30,1
pop:
    0119 9149      LD	R20,Y+
    011A 9159      LD	R21,Y+
    011B FDE0      SBRC	R30,0
    011C 9508      RET
    011D 9169      LD	R22,Y+
    011E 9179      LD	R23,Y+
    011F FDE1      SBRC	R30,1
    0120 9508      RET
    0121 90A9      LD	R10,Y+
    0122 90B9      LD	R11,Y+
    0123 FDE2      SBRC	R30,2
    0124 9508      RET
    0125 90C9      LD	R12,Y+
    0126 90D9      LD	R13,Y+
    0127 FDE3      SBRC	R30,3
    0128 9508      RET
    0129 90E9      LD	R14,Y+
    012A 90F9      LD	R15,Y+
    012B 9508      RET
push_lset:
    012C 93FA      ST	R31,-Y
    012D 93EA      ST	R30,-Y
    012E 93BA      ST	R27,-Y
    012F 93AA      ST	R26,-Y
    0130 939A      ST	R25,-Y
    0131 938A      ST	R24,-Y
    0132 933A      ST	R19,-Y
    0133 932A      ST	R18,-Y
    0134 931A      ST	R17,-Y
    0135 930A      ST	R16,-Y
    0136 929A      ST	R9,-Y
    0137 928A      ST	R8,-Y
    0138 927A      ST	R7,-Y
    0139 926A      ST	R6,-Y
    013A 925A      ST	R5,-Y
    013B 924A      ST	R4,-Y
    013C 923A      ST	R3,-Y
    013D 922A      ST	R2,-Y
    013E 921A      ST	R1,-Y
    013F 920A      ST	R0,-Y
    0140 B60F      IN	R0,0x3F
    0141 920A      ST	R0,-Y
    0142 9508      RET
pop_lset:
    0143 9009      LD	R0,Y+
    0144 BE0F      OUT	0x3F,R0
    0145 9009      LD	R0,Y+
    0146 9019      LD	R1,Y+
    0147 9029      LD	R2,Y+
    0148 9039      LD	R3,Y+
    0149 9049      LD	R4,Y+
    014A 9059      LD	R5,Y+
    014B 9069      LD	R6,Y+
    014C 9079      LD	R7,Y+
    014D 9089      LD	R8,Y+
    014E 9099      LD	R9,Y+
    014F 9109      LD	R16,Y+
    0150 9119      LD	R17,Y+
    0151 9129      LD	R18,Y+
    0152 9139      LD	R19,Y+
    0153 9189      LD	R24,Y+
    0154 9199      LD	R25,Y+
    0155 91A9      LD	R26,Y+
    0156 91B9      LD	R27,Y+
    0157 91E9      LD	R30,Y+
    0158 91F9      LD	R31,Y+
    0159 9508      RET

⌨️ 快捷键说明

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