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

📄 dianziqin.lst

📁 很好的avr单片机入门程序
💻 LST
字号:
__start:
__text_start:
      4B EFCF      LDI	R28,0xFF
      4C E1D0      LDI	R29,0x10
      4D BFCD      OUT	0x3D,R28
      4E BFDE      OUT	0x3E,R29
      4F 51CE      SUBI	R28,0x1E
      50 40D0      SBCI	R29,0
      51 EA0A      LDI	R16,0xAA
      52 8308      STD	Y+0,R16
      53 2400      CLR	R0
      54 E0E1      LDI	R30,1
      55 E0F1      LDI	R31,1
      56 E011      LDI	R17,1
      57 30E3      CPI	R30,3
      58 07F1      CPC	R31,R17
      59 F011      BEQ	0x005C
      5A 9201      ST	R0,Z+
      5B CFFB      RJMP	0x0057
      5C 8300      STD	Z+0,R16
      5D E9E5      LDI	R30,0x95
      5E E0F0      LDI	R31,0
      5F E0A0      LDI	R26,0
      60 E0B1      LDI	R27,1
      61 E010      LDI	R17,0
      62 E000      LDI	R16,0
      63 BF0B      OUT	0x3B,R16
      64 39E6      CPI	R30,0x96
      65 07F1      CPC	R31,R17
      66 F021      BEQ	0x006B
      67 95C8      LPM
      68 9631      ADIW	R30,1
      69 920D      ST	R0,X+
      6A CFF9      RJMP	0x0064
      6B 940E 011B CALL	_main
_exit:
      6D CFFF      RJMP	_exit
FILE: C:\DOCUME~1\Administrator\桌面\AVR程序\电子琴\delay.h
(0001) /* 1MHz 下延时程序*/
(0002) 
(0003) #ifndef DELAY_H_H
(0004) #define DELAY_H_H
(0005) 
(0006) void delay_1ms(void)             //1ms 延时
(0007) {
(0008)   unsigned int i;
(0009)  /* 
(0010)   for(i=1;i<140;i++)   //1MHz
(0011)   ;
(0012) 
(0013)   for(i=1331;i>0;i--)   // 8MHz
(0014) ;
(0015)  */
(0016)  for(i=0;i<2;i++)   //1MHz,24us
_delay_1ms:
  i                    --> R16
      6E 2700      CLR	R16
      6F 2711      CLR	R17
      70 C002      RJMP	0x0073
      71 5F0F      SUBI	R16,0xFF
      72 4F1F      SBCI	R17,0xFF
      73 3002      CPI	R16,2
      74 E0E0      LDI	R30,0
      75 071E      CPC	R17,R30
      76 F3D0      BCS	0x0071
      77 9508      RET
_delay:
  i                    --> R20
  n                    --> R10
      78 940E 014D CALL	push_xgset300C
      7A 0158      MOVW	R10,R16
(0017) ;
(0018) }
(0019) 
(0020) void delay(unsigned int n)
(0021) {
(0022)  unsigned int i=0;
      7B 2744      CLR	R20
      7C 2755      CLR	R21
(0023)  for(i=0;i<n;i++)
      7D C003      RJMP	0x0081
(0024)  delay_1ms();
      7E DFEF      RCALL	_delay_1ms
      7F 5F4F      SUBI	R20,0xFF
      80 4F5F      SBCI	R21,0xFF
      81 154A      CP	R20,R10
      82 055B      CPC	R21,R11
      83 F3D0      BCS	0x007E
      84 940C 0152 JMP	pop_xgset300C
_delay_ms:
  i                    --> R20
  n                    --> R16
      86 934A      ST	R20,-Y
      87 935A      ST	R21,-Y
(0025) }
(0026) 
(0027) void delay_ms(int n)
(0028) {
(0029)  int i;
(0030)  for(i=0;i<n;i++)
      88 2744      CLR	R20
      89 2755      CLR	R21
      8A C00A      RJMP	0x0095
(0031)  {
(0032)   for(i=0;i<140;i++)
      8B 2744      CLR	R20
      8C 2755      CLR	R21
      8D 5F4F      SUBI	R20,0xFF
      8E 4F5F      SBCI	R21,0xFF
      8F 384C      CPI	R20,0x8C
      90 E0E0      LDI	R30,0
      91 075E      CPC	R21,R30
      92 F3D4      BLT	0x008D
      93 5F4F      SUBI	R20,0xFF
      94 4F5F      SBCI	R21,0xFF
      95 1740      CP	R20,R16
      96 0751      CPC	R21,R17
      97 F39C      BLT	0x008B
      98 9159      LD	R21,Y+
      99 9149      LD	R20,Y+
      9A 9508      RET
_scan_key:
  intKey               --> R22
  i                    --> R20
  tmp                  --> R10
      9B 940E 0157 CALL	push_xgsetF00C
FILE: C:\DOCUME~1\Administrator\桌面\AVR程序\电子琴\dianziqin.c
(0001) /*模拟电子琴,0、1、2、4、5、6、8 分别模拟do re mi fa so la xi*/
(0002) 
(0003) #include <iom128v.h>
(0004) #include <macros.h>
(0005) #include "delay.h"
(0006) 
(0007) char count=0x00;
(0008) char sound_signal;//定义音符大小 
(0009) char sound_pace;//定义节拍大小 
(0010) const char music_key[]={0x27,0x23,0x1f,0x00,0x1d,0x1a,0x17,0x00,0x15};
(0011) char scan_key()
(0012) {
(0013)  char i=0;
      9D 2744      CLR	R20
(0014)  char tmp=0x00;
      9E 24AA      CLR	R10
(0015)  char intKey=0x00;
      9F 2766      CLR	R22
(0016)  DDRB=0x8f;
      A0 E88F      LDI	R24,0x8F
      A1 BB87      OUT	0x17,R24
(0017)  PORTB=0xf8;
      A2 EF88      LDI	R24,0xF8
      A3 BB88      OUT	0x18,R24
(0018)   
(0019)  for(i=0;i<3;i++)
      A4 C05A      RJMP	0x00FF
(0020)  {
(0021)  PORTB=~(1<<i);
      A5 E001      LDI	R16,1
      A6 2F14      MOV	R17,R20
      A7 940E 0165 CALL	lsl8
      A9 2E20      MOV	R2,R16
      AA 9420      COM	R2
      AB BA28      OUT	0x18,R2
(0022)  delay(10);    //等待低电平稳定
      AC E00A      LDI	R16,0xA
      AD E010      LDI	R17,0
      AE DFC9      RCALL	_delay
(0023)  tmp=PINB&0xf0;
      AF B386      IN	R24,0x16
      B0 7F80      ANDI	R24,0xF0
      B1 2EA8      MOV	R10,R24
(0024)  if(tmp!=0xf0)  //有键按下,延时10ms去抖
      B2 3F80      CPI	R24,0xF0
      B3 F031      BEQ	0x00BA
(0025)  {
(0026)  delay_ms(10);
      B4 E00A      LDI	R16,0xA
      B5 E010      LDI	R17,0
      B6 DFCF      RCALL	_delay_ms
(0027)  tmp=PINB&0xf0;
      B7 B386      IN	R24,0x16
      B8 7F80      ANDI	R24,0xF0
      B9 2EA8      MOV	R10,R24
(0028)  }
(0029)  if(tmp!=0xf0) //确有键按下
      BA 2D8A      MOV	R24,R10
      BB 3F80      CPI	R24,0xF0
      BC F409      BNE	0x00BE
      BD C040      RJMP	0x00FE
(0030)  {
(0031)  tmp&=0xf0;
      BE 7F80      ANDI	R24,0xF0
      BF 2EA8      MOV	R10,R24
(0032)  switch(tmp)
      C0 24BB      CLR	R11
      C1 01C5      MOVW	R24,R10
      C2 3B80      CPI	R24,0xB0
      C3 E0E0      LDI	R30,0
      C4 079E      CPC	R25,R30
      C5 F139      BEQ	0x00ED
      C6 EB80      LDI	R24,0xB0
      C7 158A      CP	R24,R10
      C8 059B      CPC	R25,R11
      C9 F034      BLT	0x00D0
      CA 01C5      MOVW	R24,R10
      CB 3780      CPI	R24,0x70
      CC E0E0      LDI	R30,0
      CD 079E      CPC	R25,R30
      CE F129      BEQ	0x00F4
      CF C02B      RJMP	0x00FB
      D0 01C5      MOVW	R24,R10
      D1 3D80      CPI	R24,0xD0
      D2 E0E0      LDI	R30,0
      D3 079E      CPC	R25,R30
      D4 F089      BEQ	0x00E6
      D5 3D80      CPI	R24,0xD0
      D6 E0E0      LDI	R30,0
      D7 079E      CPC	R25,R30
      D8 F114      BLT	0x00FB
      D9 01C5      MOVW	R24,R10
      DA 3E80      CPI	R24,0xE0
      DB E0E0      LDI	R30,0
      DC 079E      CPC	R25,R30
      DD F009      BEQ	0x00DF
      DE C01C      RJMP	0x00FB
(0033)  {
(0034)   case 0xe0: 
(0035)   	   intKey=12-4*(3-i);
      DF E083      LDI	R24,3
      E0 1B84      SUB	R24,R20
      E1 0F88      LSL	R24
      E2 0F88      LSL	R24
      E3 E06C      LDI	R22,0xC
      E4 1B68      SUB	R22,R24
(0036) 	   break;
      E5 C016      RJMP	0x00FC
(0037)   case 0xd0:   //1 or 5
(0038)   	   intKey=13-4*(3-i);
      E6 E083      LDI	R24,3
      E7 1B84      SUB	R24,R20
      E8 0F88      LSL	R24
      E9 0F88      LSL	R24
      EA E06D      LDI	R22,0xD
      EB 1B68      SUB	R22,R24
(0039) 	   break;
      EC C00F      RJMP	0x00FC
(0040)   case 0xb0:
(0041)   	   intKey=14-4*(3-i);
      ED E083      LDI	R24,3
      EE 1B84      SUB	R24,R20
      EF 0F88      LSL	R24
      F0 0F88      LSL	R24
      F1 E06E      LDI	R22,0xE
      F2 1B68      SUB	R22,R24
(0042) 	   break;
      F3 C008      RJMP	0x00FC
(0043)   case 0x70:
(0044)   	   intKey=15-4*(3-i);
      F4 E083      LDI	R24,3
      F5 1B84      SUB	R24,R20
      F6 0F88      LSL	R24
      F7 0F88      LSL	R24
      F8 E06F      LDI	R22,0xF
      F9 1B68      SUB	R22,R24
(0045) 	   break;
      FA C001      RJMP	0x00FC
(0046)   default:
(0047)   	   intKey=0xf0;
      FB EF60      LDI	R22,0xF0
(0048) 	   break;
(0049)  }
(0050)  return intKey;
      FC 2F06      MOV	R16,R22
      FD C005      RJMP	0x0103
      FE 9543      INC	R20
      FF 3043      CPI	R20,3
     100 F408      BCC	0x0102
     101 CFA3      RJMP	0x00A5
(0051)  }
(0052)  }
(0053)  return 0xf0;
     102 EF00      LDI	R16,0xF0
     103 940C 015E JMP	pop_xgsetF00C
_timer1_isr:
     105 922A      ST	R2,-Y
     106 923A      ST	R3,-Y
     107 938A      ST	R24,-Y
     108 939A      ST	R25,-Y
     109 B62F      IN	R2,0x3F
     10A 922A      ST	R2,-Y
(0054) }
(0055) 
(0056) #pragma interrupt_handler timer1_isr:13
(0057) void timer1_isr()       // 50ms
(0058) { 
(0059)   count=count+1;
     10B 9180 0100 LDS	R24,count
     10D 5F8F      SUBI	R24,0xFF
     10E 9380 0100 STS	count,R24
(0060)   TCNT1=0x00;
     110 2422      CLR	R2
     111 2433      CLR	R3
     112 BC3D      OUT	0x2D,R3
     113 BC2C      OUT	0x2C,R2
     114 9029      LD	R2,Y+
     115 BE2F      OUT	0x3F,R2
     116 9199      LD	R25,Y+
     117 9189      LD	R24,Y+
     118 9039      LD	R3,Y+
     119 9029      LD	R2,Y+
     11A 9518      RETI
(0061)  
(0062) }
(0063) void main()
(0064) {
(0065) 
(0066)  char key=0x00;
_main:
  intKey               --> R10
  key                  --> R20
     11B 2744      CLR	R20
(0067)  char intKey=0x00;
     11C 24AA      CLR	R10
(0068)  DDRB=0x8f;
     11D E88F      LDI	R24,0x8F
     11E BB87      OUT	0x17,R24
(0069)  PORTB=0xf8;
     11F EF88      LDI	R24,0xF8
     120 BB88      OUT	0x18,R24
(0070)  
(0071)   TCNT1H=0x00;
     121 2422      CLR	R2
     122 BC2D      OUT	0x2D,R2
(0072)   TCNT1L=0x00;
     123 BC2C      OUT	0x2C,R2
(0073)   OCR1AH=0x00;
     124 BC2B      OUT	0x2B,R2
(0074)   OCR1AL=0x30;
     125 E380      LDI	R24,0x30
     126 BD8A      OUT	0x2A,R24
(0075)   TIMSK=0x10;
     127 E180      LDI	R24,0x10
     128 BF87      OUT	0x37,R24
(0076)   TCCR1A=0x00;
     129 BC2F      OUT	0x2F,R2
(0077)   SEI();
     12A 9478      BSET	7
     12B C01F      RJMP	0x014B
(0078)  
(0079)  while(1)
(0080)  {
(0081) 
(0082)  key=scan_key();
     12C DF6E      RCALL	_scan_key
     12D 2F40      MOV	R20,R16
(0083)  if(key!=0xf0)  //有键按下
     12E 3F00      CPI	R16,0xF0
     12F F0B9      BEQ	0x0147
(0084)  {
(0085)   TCCR1B=0x05;
     130 E085      LDI	R24,5
     131 BD8E      OUT	0x2E,R24
     132 C010      RJMP	0x0143
(0086)   while(count!=4){
(0087) 
(0088)   PORTB^=0x80;
     133 E880      LDI	R24,0x80
     134 E090      LDI	R25,0
     135 B228      IN	R2,0x18
     136 2433      CLR	R3
     137 2628      EOR	R2,R24
     138 2639      EOR	R3,R25
     139 BA28      OUT	0x18,R2
(0089)   delay(music_key[key]);}
     13A E88C      LDI	R24,0x8C
     13B E090      LDI	R25,0
     13C 2FE4      MOV	R30,R20
     13D 27FF      CLR	R31
     13E 0FE8      ADD	R30,R24
     13F 1FF9      ADC	R31,R25
     140 9106      ELPM	R16,0(Z)
     141 2711      CLR	R17
     142 DF35      RCALL	_delay
     143 9180 0100 LDS	R24,count
     145 3084      CPI	R24,4
     146 F761      BNE	0x0133
(0090)  }
(0091)   TCCR1B=0x00;
     147 2422      CLR	R2
     148 BC2E      OUT	0x2E,R2
(0092)    count=0;
FILE: <library>
     149 9220 0100 STS	count,R2
     14B CFE0      RJMP	0x012C
     14C 9508      RET
push_xgset300C:
     14D 935A      ST	R21,-Y
     14E 934A      ST	R20,-Y
     14F 92BA      ST	R11,-Y
     150 92AA      ST	R10,-Y
     151 9508      RET
pop_xgset300C:
     152 90A9      LD	R10,Y+
     153 90B9      LD	R11,Y+
     154 9149      LD	R20,Y+
     155 9159      LD	R21,Y+
     156 9508      RET
push_xgsetF00C:
     157 937A      ST	R23,-Y
     158 936A      ST	R22,-Y
     159 935A      ST	R21,-Y
     15A 934A      ST	R20,-Y
     15B 92BA      ST	R11,-Y
     15C 92AA      ST	R10,-Y
     15D 9508      RET
pop_xgsetF00C:
     15E 90A9      LD	R10,Y+
     15F 90B9      LD	R11,Y+
     160 9149      LD	R20,Y+
     161 9159      LD	R21,Y+
     162 9169      LD	R22,Y+
     163 9179      LD	R23,Y+
     164 9508      RET
lsl8:
     165 2311      TST	R17
     166 F019      BEQ	0x016A
     167 0F00      LSL	R16
     168 951A      DEC	R17
     169 CFFB      RJMP	lsl8
     16A 9508      RET

⌨️ 快捷键说明

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