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

📄 atmega16_8led.lst

📁 AVR单片机来驱动8位数码管
💻 LST
📖 第 1 页 / 共 2 页
字号:
__text_start:
__start:
    0043 E5CF      LDI	R28,0x5F
    0044 E0D4      LDI	R29,4
    0045 BFCD      OUT	0x3D,R28
    0046 BFDE      OUT	0x3E,R29
    0047 51C0      SUBI	R28,0x10
    0048 40D0      SBCI	R29,0
    0049 EA0A      LDI	R16,0xAA
    004A 8308      STD	Y+0,R16
    004B 2400      CLR	R0
    004C E6E8      LDI	R30,0x68
    004D E0F0      LDI	R31,0
    004E E010      LDI	R17,0
    004F 36EC      CPI	R30,0x6C
    0050 07F1      CPC	R31,R17
    0051 F011      BEQ	0x0054
    0052 9201      ST	R0,Z+
    0053 CFFB      RJMP	0x004F
    0054 8300      STD	Z+0,R16
    0055 E7EE      LDI	R30,0x7E
    0056 E0F0      LDI	R31,0
    0057 E6A0      LDI	R26,0x60
    0058 E0B0      LDI	R27,0
    0059 E010      LDI	R17,0
    005A 38E6      CPI	R30,0x86
    005B 07F1      CPC	R31,R17
    005C F021      BEQ	0x0061
    005D 95C8      LPM
    005E 9631      ADIW	R30,1
    005F 920D      ST	R0,X+
    0060 CFF9      RJMP	0x005A
    0061 940E0156  CALL	_main
_exit:
    0063 CFFF      RJMP	_exit
FILE: E:\AVR单片机程序调试\ATMEGA16_8LED\delay.h
(0001) /*-----------------------------------------------------------------------
(0002) 延时函数
(0003) 系统时钟:8M
(0004) -----------------------------------------------------------------------*/
(0005) void delay_1us(void)                 //1us延时函数
(0006)   {
(0007)    asm("nop");
_delay_1us:
    0064 0000      NOP
    0065 9508      RET
_delay_nus:
  i                    --> R20
  n                    --> R22
    0066 940E0218  CALL	push_gset2
    0068 01B8      MOVW	R22,R16
(0008)   }
(0009) 
(0010) void delay_nus(unsigned int n)       //N us延时函数
(0011)   {
(0012)    unsigned int i=0;
    0069 2744      CLR	R20
    006A 2755      CLR	R21
(0013)    for (i=0;i<n;i++)
    006B C003      RJMP	0x006F
(0014)    delay_1us();
    006C DFF7      RCALL	_delay_1us
    006D 5F4F      SUBI	R20,0xFF
    006E 4F5F      SBCI	R21,0xFF
    006F 1746      CP	R20,R22
    0070 0757      CPC	R21,R23
    0071 F3D0      BCS	0x006C
    0072 940E020C  CALL	pop_gset2
    0074 9508      RET
(0015)   }
(0016)   
(0017) void delay_1ms(void)                 //1ms延时函数
(0018)   {
(0019)    unsigned int i;
(0020)    for (i=0;i<1140;i++);
_delay_1ms:
  i                    --> R16
    0075 2700      CLR	R16
    0076 2711      CLR	R17
    0077 C002      RJMP	0x007A
    0078 5F0F      SUBI	R16,0xFF
    0079 4F1F      SBCI	R17,0xFF
    007A 3704      CPI	R16,0x74
    007B E0E4      LDI	R30,4
    007C 071E      CPC	R17,R30
    007D F3D0      BCS	0x0078
    007E 9508      RET
_delay_nms:
  i                    --> R20
  n                    --> R22
    007F 940E0218  CALL	push_gset2
    0081 01B8      MOVW	R22,R16
(0021)   }
(0022)   
(0023) void delay_nms(unsigned int n)       //N ms延时函数
(0024)   {
(0025)    unsigned int i=0;
    0082 2744      CLR	R20
    0083 2755      CLR	R21
(0026)    for (i=0;i<n;i++)
    0084 C003      RJMP	0x0088
(0027)    delay_1ms();
    0085 DFEF      RCALL	_delay_1ms
    0086 5F4F      SUBI	R20,0xFF
    0087 4F5F      SBCI	R21,0xFF
    0088 1746      CP	R20,R22
    0089 0757      CPC	R21,R23
    008A F3D0      BCS	0x0085
    008B 940E020C  CALL	pop_gset2
    008D 9508      RET
FILE: E:\AVR单片机程序调试\ATMEGA16_8LED\ATMEGA16_8LED.C
(0001) //ICC-AVR application builder : 2009-3-3 14:58:49
(0002) // Target : M16
(0003) // Crystal: 8.0000Mhz
(0004) 
(0005) #include <iom16v.h>
(0006) #include <macros.h>
(0007) #include "delay.h"
(0008) #define uchar unsigned char
(0009) #define uint  unsigned int
(0010) #define ulong  unsigned long
(0011) 
(0012) #define CLK_1  PORTA|=(1<<0)
(0013) #define CLK_0  PORTA&=~(1<<0)
(0014) #define RCLK_1  PORTA|=(1<<1) 
(0015) #define RCLK_0  PORTA&=~(1<<1)
(0016) #define DAT_1  PORTA|=(1<<2) 
(0017) #define DAT_0  PORTA&=~(1<<2) 
(0018) 
(0019) const char tab[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0};//0-9,
(0020) const char seg[9]={0x08,0x04,0x02,0x01,0x10,0x20,0x40,0x80,0x00};
(0021) const char off[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
(0022) const char on[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
(0023) uchar display_buff[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
(0024) uint i,number;
(0025) 
(0026) 
(0027) void port_init(void)
(0028) {
(0029)  PORTA = 0x00;
_port_init:
    008E 2422      CLR	R2
    008F BA2B      OUT	0x1B,R2
(0030)  DDRA  = 0x07;
    0090 E087      LDI	R24,7
    0091 BB8A      OUT	0x1A,R24
    0092 9508      RET
(0031) }
(0032) //call this routine to initialize all peripherals
(0033) void init_devices(void)
(0034) {
(0035)  //stop errant interrupts until set up
(0036)  CLI(); //disable all interrupts
_init_devices:
    0093 94F8      BCLR	7
(0037)  port_init();
    0094 DFF9      RCALL	_port_init
(0038) 
(0039)  MCUCR = 0x00;
    0095 2422      CLR	R2
    0096 BE25      OUT	0x35,R2
(0040)  GICR  = 0x00;
    0097 BE2B      OUT	0x3B,R2
(0041)  TIMSK = 0x00; //timer interrupt sources
    0098 BE29      OUT	0x39,R2
(0042)  SEI(); //re-enable interrupts
    0099 9478      BSET	7
    009A 9508      RET
_BINtoBCD:
  temp                 --> R10
  i                    --> R12
  count                --> Y+8
    009B 940E0196  CALL	push_arg4
    009D 940E0214  CALL	push_gset4
(0043)  //all peripherals are now initialized
(0044) }
(0045) 
(0046) void BINtoBCD(ulong count)
(0047) { 
(0048)   uint temp,i;
(0049)   temp=count;
    009F 01FE      MOVW	R30,R28
    00A0 84A0      LDD	R10,Z+8
    00A1 84B1      LDD	R11,Z+9
(0050)   for (i=0;i<8;i++)
    00A2 24CC      CLR	R12
    00A3 24DD      CLR	R13
    00A4 C037      RJMP	0x00DC
(0051)   {
(0052)    temp=count%10;
    00A5 E04A      LDI	R20,0xA
    00A6 E050      LDI	R21,0
    00A7 E060      LDI	R22,0
    00A8 E070      LDI	R23,0
    00A9 01FE      MOVW	R30,R28
    00AA 8420      LDD	R2,Z+8
    00AB 8431      LDD	R3,Z+9
    00AC 8442      LDD	R4,Z+10
    00AD 8453      LDD	R5,Z+11
    00AE 937A      ST	R23,-Y
    00AF 936A      ST	R22,-Y
    00B0 935A      ST	R21,-Y
    00B1 934A      ST	R20,-Y
    00B2 0181      MOVW	R16,R2
    00B3 0192      MOVW	R18,R4
    00B4 940E019D  CALL	mod32u
    00B6 0158      MOVW	R10,R16
(0053)    display_buff[i]=tab[temp];
    00B7 E584      LDI	R24,0x54
    00B8 E090      LDI	R25,0
    00B9 01F5      MOVW	R30,R10
    00BA 0FE8      ADD	R30,R24
    00BB 1FF9      ADC	R31,R25
    00BC 91E4      LPM	R30,0(Z)
    00BD E680      LDI	R24,0x60
    00BE E090      LDI	R25,0
    00BF 01D6      MOVW	R26,R12
    00C0 0FA8      ADD	R26,R24
    00C1 1FB9      ADC	R27,R25
    00C2 93EC      ST	R30,0(X)
(0054)    count=count/10; 
    00C3 E04A      LDI	R20,0xA
    00C4 E050      LDI	R21,0
    00C5 E060      LDI	R22,0
    00C6 E070      LDI	R23,0
    00C7 01FE      MOVW	R30,R28
    00C8 8420      LDD	R2,Z+8
    00C9 8431      LDD	R3,Z+9
    00CA 8442      LDD	R4,Z+10
    00CB 8453      LDD	R5,Z+11
    00CC 937A      ST	R23,-Y
    00CD 936A      ST	R22,-Y
    00CE 935A      ST	R21,-Y
    00CF 934A      ST	R20,-Y
    00D0 0181      MOVW	R16,R2
    00D1 0192      MOVW	R18,R4
    00D2 940E019B  CALL	div32u
    00D4 01FE      MOVW	R30,R28
    00D5 8700      STD	Z+8,R16
    00D6 8711      STD	Z+9,R17
    00D7 8722      STD	Z+10,R18
    00D8 8733      STD	Z+11,R19
    00D9 01C6      MOVW	R24,R12
    00DA 9601      ADIW	R24,1
    00DB 016C      MOVW	R12,R24
    00DC 01C6      MOVW	R24,R12
    00DD 3088      CPI	R24,0x8
    00DE E0E0      LDI	R30,0
    00DF 079E      CPC	R25,R30
    00E0 F408      BCC	0x00E2
    00E1 CFC3      RJMP	0x00A5
    00E2 940E020F  CALL	pop_gset4
    00E4 9624      ADIW	R28,4
    00E5 9508      RET
_write_595:
  temp                 --> R20
  i                    --> R22
  data                 --> R16
    00E6 940E0218  CALL	push_gset2
(0055)    }
(0056) }
(0057) //发送一个字节
(0058) void write_595 (uchar data)
(0059) {
(0060)  uchar i,temp;
(0061)  temp=data;
    00E8 2F40      MOV	R20,R16
(0062)  for (i=0;i<8;i++)
    00E9 2766      CLR	R22
    00EA C009      RJMP	0x00F4
(0063)  {
(0064)   CLK_0;
    00EB 98D8      CBI	0x1B,0
(0065)   if (temp&0x80)DAT_1;
    00EC FF47      SBRS	R20,7
    00ED C002      RJMP	0x00F0
    00EE 9ADA      SBI	0x1B,2
    00EF C001      RJMP	0x00F1
(0066)   else DAT_0;
    00F0 98DA      CBI	0x1B,2
(0067)   temp<<=1;
    00F1 0F44      LSL	R20
(0068)   CLK_1;
    00F2 9AD8      SBI	0x1B,0
    00F3 9563      INC	R22
    00F4 3068      CPI	R22,0x8
    00F5 F3A8      BCS	0x00EB
    00F6 940E020C  CALL	pop_gset2
    00F8 9508      RET
(0069)  }
(0070) }
(0071) 
(0072) void out_595 ()
(0073) {
(0074)  RCLK_0;
_out_595:
    00F9 98D9      CBI	0x1B,1
(0075)  RCLK_1;
    00FA 9AD9      SBI	0x1B,1
    00FB 9508      RET
_display:
  i                    --> R20
    00FC 940E021A  CALL	push_gset1
(0076) }
(0077) 
(0078) //发送并显示四个字节
(0079) void display ()
(0080) {
(0081)  uchar i;
(0082)  for (i=0;i<4;i++)
    00FE 2744      CLR	R20
    00FF C015      RJMP	0x0115
(0083)  {
(0084)   write_595 (seg[i]);
    0100 E685      LDI	R24,0x65
    0101 E090      LDI	R25,0
    0102 2FE4      MOV	R30,R20
    0103 27FF      CLR	R31
    0104 0FE8      ADD	R30,R24
    0105 1FF9      ADC	R31,R25
    0106 9104      LPM	R16,0(Z)
    0107 DFDE      RCALL	_write_595
(0085)   write_595 (display_buff[i]);
    0108 E680      LDI	R24,0x60
    0109 E090      LDI	R25,0
    010A 2FE4      MOV	R30,R20
    010B 27FF      CLR	R31
    010C 0FE8      ADD	R30,R24
    010D 1FF9      ADC	R31,R25
    010E 8100      LDD	R16,Z+0
    010F DFD6      RCALL	_write_595
(0086)   out_595 ();

⌨️ 快捷键说明

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