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

📄 demo.lst

📁 一个关于AVR单片机的例程
💻 LST
📖 第 1 页 / 共 5 页
字号:
__start:
__text_start:
    004B E5CF      LDI	R28,0x5F
    004C E0D4      LDI	R29,4
    004D BFCD      OUT	0x3D,R28
    004E BFDE      OUT	0x3E,R29
    004F 51C0      SUBI	R28,0x10
    0050 40D0      SBCI	R29,0
    0051 EA0A      LDI	R16,0xAA
    0052 8308      STD	Y+0,R16
    0053 2400      CLR	R0
    0054 E6E0      LDI	R30,0x60
    0055 E0F0      LDI	R31,0
    0056 E010      LDI	R17,0
    0057 36E2      CPI	R30,0x62
    0058 07F1      CPC	R31,R17
    0059 F011      BEQ	0x005C
    005A 9201      ST	R0,Z+
    005B CFFB      RJMP	0x0057
    005C 8300      STD	Z+0,R16
    005D E9E6      LDI	R30,0x96
    005E E0F0      LDI	R31,0
    005F E6A0      LDI	R26,0x60
    0060 E0B0      LDI	R27,0
    0061 E010      LDI	R17,0
    0062 39E6      CPI	R30,0x96
    0063 07F1      CPC	R31,R17
    0064 F021      BEQ	0x0069
    0065 95C8      LPM
    0066 9631      ADIW	R30,1
    0067 920D      ST	R0,X+
    0068 CFF9      RJMP	0x0062
    0069 940E0149  CALL	_main
_exit:
    006B CFFF      RJMP	_exit
FILE: C:\DOCUME~1\administrator\桌面\教程\7断数码管\delay.c
(0001) /**********************************
(0002) ** file_name delay.c             **
(0003) ** describe  软件延时函数        **
(0004) ** auther    古欣 www.avrvi.com  **
(0005) ** Time      2007-1-31           **
(0006) ***********************************/
(0007) #include "config.h"
(0008) /***********************
(0009) ** 8M晶振下 1us
(0010) ** 也可以宏定义 8个asm("nop");
(0011) ** #define delay_1us asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
(0012) ***********************/
(0013) void delay_1us(void)
(0014) {
(0015)  asm("nop");
_delay_1us:
    006C 0000      NOP
    006D 9508      RET
(0016) }
(0017) 
(0018) /***********************
(0019) **8M时为 1000.25us
(0020) **4M时为 999.5us
(0021) **xtal 为晶振频率,单位为Mhz
(0022) ************************/
(0023) void delay_1ms(void)
(0024) {
(0025)  unsigned int i;
(0026)  for(i=(xtal*143-2);i>0;i--)
_delay_1ms:
  i                    --> R16
    006E E706      LDI	R16,0x76
    006F E014      LDI	R17,4
    0070 C002      RJMP	0x0073
    0071 5001      SUBI	R16,1
    0072 4010      SBCI	R17,0
    0073 3000      CPI	R16,0
    0074 0701      CPC	R16,R17
    0075 F7D9      BNE	0x0071
    0076 9508      RET
_delay_1s:
  i                    --> R20
    0077 940E0962  CALL	push_gset1
(0027)   ;
(0028) }
(0029) 
(0030) /***********************
(0031) ** 1S延时,误差可能稍大
(0032) ** 250ms*4=1000ms
(0033) ************************/
(0034) void delay_1s(void)
(0035) {
(0036)  unsigned int i;
(0037)    for(i=250;i>0;i--)   //250ms*4=1000ms
    0079 EF4A      LDI	R20,0xFA
    007A E050      LDI	R21,0
    007B C003      RJMP	0x007F
(0038)    delay_1ms();
    007C DFF1      RCALL	_delay_1ms
    007D 5041      SUBI	R20,1
    007E 4050      SBCI	R21,0
    007F 3040      CPI	R20,0
    0080 0745      CPC	R20,R21
    0081 F7D1      BNE	0x007C
(0039)    for(i=250;i>0;i--)
    0082 EF4A      LDI	R20,0xFA
    0083 E050      LDI	R21,0
    0084 C003      RJMP	0x0088
(0040)    delay_1ms();
    0085 DFE8      RCALL	_delay_1ms
    0086 5041      SUBI	R20,1
    0087 4050      SBCI	R21,0
    0088 3040      CPI	R20,0
    0089 0745      CPC	R20,R21
    008A F7D1      BNE	0x0085
(0041)    for(i=250;i>0;i--)
    008B EF4A      LDI	R20,0xFA
    008C E050      LDI	R21,0
    008D C003      RJMP	0x0091
(0042)    delay_1ms();
    008E DFDF      RCALL	_delay_1ms
    008F 5041      SUBI	R20,1
    0090 4050      SBCI	R21,0
    0091 3040      CPI	R20,0
    0092 0745      CPC	R20,R21
    0093 F7D1      BNE	0x008E
(0043)    for(i=250;i>0;i--)
    0094 EF4A      LDI	R20,0xFA
    0095 E050      LDI	R21,0
    0096 C003      RJMP	0x009A
(0044)    delay_1ms();
    0097 DFD6      RCALL	_delay_1ms
    0098 5041      SUBI	R20,1
    0099 4050      SBCI	R21,0
    009A 3040      CPI	R20,0
    009B 0745      CPC	R20,R21
    009C F7D1      BNE	0x0097
    009D 940E0965  CALL	pop_gset1
    009F 9508      RET
_delay_us:
  i                    --> R20
  n                    --> R22
    00A0 940E0960  CALL	push_gset2
    00A2 01B8      MOVW	R22,R16
(0045) }
(0046) 
(0047) /***********************
(0048) **微秒级延时
(0049) ************************/
(0050) void delay_us(unsigned int n)
(0051) {
(0052)  unsigned int i;
(0053)  for(i=n;i>0;i--)
    00A3 01AB      MOVW	R20,R22
    00A4 C003      RJMP	0x00A8
(0054)  delay_1us();
    00A5 DFC6      RCALL	_delay_1us
    00A6 5041      SUBI	R20,1
    00A7 4050      SBCI	R21,0
    00A8 3040      CPI	R20,0
    00A9 0745      CPC	R20,R21
    00AA F7D1      BNE	0x00A5
    00AB 940E0954  CALL	pop_gset2
    00AD 9508      RET
_delay_ms:
  i                    --> R20
  n                    --> R22
    00AE 940E0960  CALL	push_gset2
    00B0 01B8      MOVW	R22,R16
(0055) }
(0056) 
(0057) /***********************
(0058) **毫秒级延时
(0059) ************************/
(0060) void delay_ms(unsigned int n)
(0061) {
(0062)  unsigned int i;
(0063)  for(i=n;i>0;i--)
    00B1 01AB      MOVW	R20,R22
    00B2 C003      RJMP	0x00B6
(0064)  delay_1ms();
    00B3 DFBA      RCALL	_delay_1ms
    00B4 5041      SUBI	R20,1
    00B5 4050      SBCI	R21,0
    00B6 3040      CPI	R20,0
    00B7 0745      CPC	R20,R21
    00B8 F7D1      BNE	0x00B3
    00B9 940E0954  CALL	pop_gset2
    00BB 9508      RET
_delay_s:
  j                    --> R20
  i                    --> R22
  n                    --> R22
    00BC 940E0960  CALL	push_gset2
    00BE 01B8      MOVW	R22,R16
(0065) }
(0066) 
(0067) /***********************
(0068) **秒级延时,太浪费资源,不建议使用
(0069) ************************/
(0070) void delay_s(unsigned int n)
(0071) {
(0072)  unsigned int i,j;
(0073)  for(j=n;j>0;j--)
    00BF 01AB      MOVW	R20,R22
    00C0 C026      RJMP	0x00E7
(0074)   {
(0075)    for(i=250;i>0;i--)   //250ms*4=1000ms
    00C1 EF6A      LDI	R22,0xFA
    00C2 E070      LDI	R23,0
    00C3 C003      RJMP	0x00C7
(0076)    delay_1ms();
    00C4 DFA9      RCALL	_delay_1ms
    00C5 5061      SUBI	R22,1
    00C6 4070      SBCI	R23,0
    00C7 3060      CPI	R22,0
    00C8 0767      CPC	R22,R23
    00C9 F7D1      BNE	0x00C4
(0077)    for(i=250;i>0;i--)
    00CA EF6A      LDI	R22,0xFA
    00CB E070      LDI	R23,0
    00CC C003      RJMP	0x00D0
(0078)    delay_1ms();
    00CD DFA0      RCALL	_delay_1ms
    00CE 5061      SUBI	R22,1
    00CF 4070      SBCI	R23,0
    00D0 3060      CPI	R22,0
    00D1 0767      CPC	R22,R23
    00D2 F7D1      BNE	0x00CD
(0079)    for(i=250;i>0;i--)
    00D3 EF6A      LDI	R22,0xFA
    00D4 E070      LDI	R23,0
    00D5 C003      RJMP	0x00D9
(0080)    delay_1ms();
    00D6 DF97      RCALL	_delay_1ms
    00D7 5061      SUBI	R22,1
    00D8 4070      SBCI	R23,0
    00D9 3060      CPI	R22,0
    00DA 0767      CPC	R22,R23
    00DB F7D1      BNE	0x00D6
(0081)    for(i=250;i>0;i--)
    00DC EF6A      LDI	R22,0xFA
    00DD E070      LDI	R23,0
    00DE C003      RJMP	0x00E2
(0082)    delay_1ms();
    00DF DF8E      RCALL	_delay_1ms
    00E0 5061      SUBI	R22,1
    00E1 4070      SBCI	R23,0
    00E2 3060      CPI	R22,0
    00E3 0767      CPC	R22,R23
    00E4 F7D1      BNE	0x00DF
    00E5 5041      SUBI	R20,1
    00E6 4050      SBCI	R21,0
    00E7 3040      CPI	R20,0
    00E8 0745      CPC	R20,R21
    00E9 F6B9      BNE	0x00C1
    00EA 940E0954  CALL	pop_gset2
    00EC 9508      RET
FILE: C:\DOCUME~1\administrator\桌面\教程\7断数码管\main.c
(0001) // ICC-AVR application builder : 2007-2-14 21:34:00
(0002) // Target : M16
(0003) // Crystal: 7.3728Mhz
(0004) // 工程DEMO 七段数码管显示演示
(0005) 
(0006) #include "config.h"
(0007) 
(0008) extern const led_data[16]; //声明外部led显示数据,led_data在led.c中
(0009) uint16 countdata;
(0010) 
(0011) void port_init(void)
(0012) {
(0013)  PORTA = 0x00;
_port_init:
    00ED 2422      CLR	R2
    00EE BA2B      OUT	0x1B,R2
(0014)  DDRA  = 0x00;
    00EF BA2A      OUT	0x1A,R2
(0015)  PORTB = 0x00;
    00F0 BA28      OUT	0x18,R2
(0016)  DDRB  = 0x00;
    00F1 BA27      OUT	0x17,R2
(0017)  PORTC = 0x00; //m103 output only
    00F2 BA25      OUT	0x15,R2
(0018)  DDRC  = 0x00;
    00F3 BA24      OUT	0x14,R2
(0019)  PORTD = 0x00;
    00F4 BA22      OUT	0x12,R2
(0020)  DDRD  = 0x00;
    00F5 BA21      OUT	0x11,R2
    00F6 9508      RET
(0021) }
(0022) /***************************************************************/
(0023) //定时器1用于一秒刷新 countdata 的值,达到从1-9999计秒的功能
(0024) //TIMER1 initialize - prescale:1024
(0025) // WGM: 0) Normal, TOP=0xFFFF
(0026) // desired value: 1Sec
(0027) // actual value:  1.000Sec (0.0%)
(0028) void timer1_init(void)
(0029) {
(0030)  TCCR1B = 0x00; //stop
_timer1_init:
    00F7 2422      CLR	R2
    00F8 BC2E      OUT	0x2E,R2
(0031)  TCNT1H = 0xE3; //setup
    00F9 EE83      LDI	R24,0xE3
    00FA BD8D      OUT	0x2D,R24
(0032)  TCNT1L = 0xE1;
    00FB EE81      LDI	R24,0xE1
    00FC BD8C      OUT	0x2C,R24
(0033)  OCR1AH = 0x1C;
    00FD E18C      LDI	R24,0x1C
    00FE BD8B      OUT	0x2B,R24
(0034)  OCR1AL = 0x1F;
    00FF E18F      LDI	R24,0x1F
    0100 BD8A      OUT	0x2A,R24
(0035)  OCR1BH = 0x1C;
    0101 E18C      LDI	R24,0x1C
    0102 BD89      OUT	0x29,R24
(0036)  OCR1BL = 0x1F;
    0103 E18F      LDI	R24,0x1F
    0104 BD88      OUT	0x28,R24
(0037)  ICR1H  = 0x1C;
    0105 E18C      LDI	R24,0x1C
    0106 BD87      OUT	0x27,R24
(0038)  ICR1L  = 0x1F;
    0107 E18F      LDI	R24,0x1F
    0108 BD86      OUT	0x26,R24
(0039)  TCCR1A = 0x00;
    0109 BC2F      OUT	0x2F,R2
(0040)  TCCR1B = 0x05; //start Timer
    010A E085      LDI	R24,5
    010B BD8E      OUT	0x2E,R24
    010C 9508      RET
_timer1_ovf_isr:
    010D 922A      ST	R2,-Y
    010E 923A      ST	R3,-Y
    010F 938A      ST	R24,-Y
    0110 939A      ST	R25,-Y
    0111 93EA      ST	R30,-Y
    0112 B62F      IN	R2,0x3F
    0113 922A      ST	R2,-Y
(0041) }
(0042) 
(0043) #pragma interrupt_handler timer1_ovf_isr:9
(0044) void timer1_ovf_isr(void)
(0045) {
(0046)  //TIMER1 has overflowed
(0047)  TCNT1H = 0xE3; //reload counter high value
    0114 EE83      LDI	R24,0xE3
    0115 BD8D      OUT	0x2D,R24
(0048)  TCNT1L = 0xE1; //reload counter low value
    0116 EE81      LDI	R24,0xE1
    0117 BD8C      OUT	0x2C,R24
(0049)  countdata++;
    0118 91800060  LDS	R24,countdata
    011A 91900061  LDS	R25,countdata+1
    011C 9601      ADIW	R24,1
    011D 93900061  STS	countdata+1,R25
    011F 93800060  STS	countdata,R24
(0050)  if(countdata==9999) countdata=0;
    0121 308F      CPI	R24,0xF
    0122 E2E7      LDI	R30,0x27
    0123 079E      CPC	R25,R30
    0124 F431      BNE	0x012B
    0125 2422      CLR	R2
    0126 2433      CLR	R3
    0127 92300061  STS	countdata+1,R3
    0129 92200060  STS	countdata,R2
    012B 9029      LD	R2,Y+
    012C BE2F      OUT	0x3F,R2
    012D 91E9      LD	R30,Y+
    012E 9199      LD	R25,Y+
    012F 9189      LD	R24,Y+
    0130 9039      LD	R3,Y+
    0131 9029      LD	R2,Y+
    0132 9518      RETI
(0051) }
(0052) 
(0053) 
(0054) //call this routine to initialize all peripherals
(0055) void init_devices(void)
(0056) {
(0057)  //stop errant interrupts until set up
(0058)  CLI(); //disable all interrupts
_init_devices:
    0133 94F8      BCLR	7
(0059)  port_init();
    0134 DFB8      RCALL	_port_init
(0060)  led_init(); //7段数码管显示
    0135 940E0154  CALL	_led_init
(0061)  
(0062)  MCUCR = 0x00;
    0137 2422      CLR	R2
    0138 BE25      OUT	0x35,R2
(0063)  GICR  = 0x00;
    0139 BE2B      OUT	0x3B,R2
(0064)  TIMSK = 0x00; //timer interrupt sources
    013A BE29      OUT	0x39,R2
(0065)  SEI(); //re-enable interrupts
    013B 9478      BSET	7
    013C 9508      RET
(0066)  //all peripherals are now initialized
(0067) }
(0068) 
(0069) /**************************************************/
(0070) //只有综合应用才用到本函数
(0071) //call this routine to initialize all peripherals
(0072) void init_devices2(void)
(0073) {
(0074)  //stop errant interrupts until set up
(0075)  CLI(); //disable all interrupts
_init_devices2:
    013D 94F8      BCLR	7
(0076)  port_init();
    013E DFAE      RCALL	_port_init
(0077)  led_init(); //7段数码管显示
    013F 940E0154  CALL	_led_init
(0078)  timer1_init(); //定时器1用于更新countdata的值,从1到9999变化
    0141 DFB5      RCALL	_timer1_init
(0079)  
(0080)  MCUCR = 0x00;
    0142 2422      CLR	R2
    0143 BE25      OUT	0x35,R2
(0081)  GICR  = 0x00;
    0144 BE2B      OUT	0x3B,R2

⌨️ 快捷键说明

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