📄 atmega16_8led.lst
字号:
__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 + -