📄 test_c.lst
字号:
__start:
__text_start:
001B E5CF LDI R28,0x5F
001C E0D4 LDI R29,4
001D BFCD OUT 0x3D,R28
001E BFDE OUT 0x3E,R29
001F 51C0 SUBI R28,0x10
0020 40D0 SBCI R29,0
0021 EA0A LDI R16,0xAA
0022 8308 STD Y+0,R16
0023 2400 CLR R0
0024 E7E0 LDI R30,0x70
0025 E0F0 LDI R31,0
0026 E010 LDI R17,0
0027 37E2 CPI R30,0x72
0028 07F1 CPC R31,R17
0029 F011 BEQ 0x002C
002A 9201 ST R0,Z+
002B CFFB RJMP 0x0027
002C 8300 STD Z+0,R16
002D E2E6 LDI R30,0x26
002E E0F0 LDI R31,0
002F E6A0 LDI R26,0x60
0030 E0B0 LDI R27,0
0031 E010 LDI R17,0
0032 33E6 CPI R30,0x36
0033 07F1 CPC R31,R17
0034 F021 BEQ 0x0039
0035 95C8 LPM
0036 9631 ADIW R30,1
0037 920D ST R0,X+
0038 CFF9 RJMP 0x0032
0039 D001 RCALL _main
_exit:
003A CFFF RJMP _exit
FILE: E:\avrc\disp.c
(0001) #include <iom8v.h> //和单片机类型相对应的头文件,选择Atmega8做实验;
(0002) #include <macros.h>
(0003) #include <stdio.h>
(0004) #define uchar unsigned char
(0005) #define uint unsigned int
(0006) void send_byte(uchar x);
(0007) void disp_led(uchar buffer,uchar control);
(0008) void delay_1ms(void);
(0009) void delay_nms(unsigned int n);
(0010) uchar disp_table[16] = {
(0011) 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
(0012) 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
(0013) uint count;
(0014) void main(void)
(0015) {
(0016) uint i;
(0017) int j;
(0018) OSCCAL=0X9d;//系统时钟校准,不同的芯片和不同的频率,
_main:
i --> Y+1
j --> R20
003B E98D LDI R24,0x9D
003C BF81 OUT 0x31,R24
(0019) DDRB=0x03; //定义B口的PB0、PB1为输出口
003D E083 LDI R24,3
003E BB87 OUT 0x17,R24
(0020) DDRC=0x30;
003F E380 LDI R24,0x30
0040 BB84 OUT 0x14,R24
(0021) WDR(); //看门狗计数清零
0041 95A8 WDR
(0022) WDTCR=0x0F; //使能watchdog,并且,采用2048K分频,典型溢出时间5V时2.1S
0042 E08F LDI R24,0xF
0043 BD81 OUT 0x21,R24
(0023) ADCSRA=0X00;
0044 2422 CLR R2
0045 B826 OUT 0x06,R2
(0024) ADCSRA = 0x00;
0046 B826 OUT 0x06,R2
(0025) ADMUX =(1<<REFS0)|(1<<REFS1)|(1<<MUX1)|(1<<MUX0);
0047 EC83 LDI R24,0xC3
0048 B987 OUT 0x07,R24
(0026) ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1) ;//64分频
0049 EC8E LDI R24,0xCE
004A B986 OUT 0x06,R24
(0027) SEI();
004B 9478 BSET 7
(0028) //PORTB=0B00000001; //PB0口输出高电平,PB1口输出低电平,绿灯亮
(0029) delay_nms(5000); //延时5秒
004C E808 LDI R16,0x88
004D E113 LDI R17,0x13
004E D0C3 RCALL _delay_nms
(0030) PORTB=0B00000010; //PB1口输出高电平,PB0口输出低电平,关闭绿灯,红灯亮
004F E082 LDI R24,2
0050 BB88 OUT 0x18,R24
(0031) delay_nms(5000); //延时5秒
0051 E808 LDI R16,0x88
0052 E113 LDI R17,0x13
0053 D0BE RCALL _delay_nms
(0032) disp_led(4,0);
0054 2722 CLR R18
0055 E004 LDI R16,4
0056 D040 RCALL _disp_led
0057 C024 RJMP 0x007C
(0033) while(1)
(0034) {
(0035) PORTB=0B00000010;
0058 E082 LDI R24,2
0059 BB88 OUT 0x18,R24
(0036) delay_nms(100);
005A E604 LDI R16,0x64
005B E010 LDI R17,0
005C D0B5 RCALL _delay_nms
(0037) j=((25600/1023)*(ADCH*256+ADCL))/1000;
005D B125 IN R18,0x05
005E 2733 CLR R19
005F E000 LDI R16,0
0060 E011 LDI R17,1
0061 D101 RCALL empy16s
0062 0198 MOVW R18,R16
0063 B024 IN R2,0x04
0064 2433 CLR R3
0065 0D22 ADD R18,R2
0066 1D33 ADC R19,R3
0067 E109 LDI R16,0x19
0068 E010 LDI R17,0
0069 D0F9 RCALL empy16s
006A EE28 LDI R18,0xE8
006B E033 LDI R19,3
006C D0C1 RCALL div16s
006D 01A8 MOVW R20,R16
(0038) count=j;
006E 93500071 STS _count+1,R21
0070 93400070 STS _count,R20
(0039) if(j>24)
0072 E188 LDI R24,0x18
0073 E090 LDI R25,0
0074 1780 CP R24,R16
0075 0791 CPC R25,R17
0076 F414 BGE 0x0079
(0040) PORTB=0B00000011; //翻转PB0和PB1口
0077 E083 LDI R24,3
0078 BB88 OUT 0x18,R24
(0041) disp_led(0,1);
0079 E021 LDI R18,1
007A 2700 CLR R16
007B D01B RCALL _disp_led
007C CFDB RJMP 0x0058
(0042) }
(0043) }
007D 9508 RET
_send_byte:
i --> R20
x --> R22
007E D10F RCALL push_gset2
007F 2F60 MOV R22,R16
(0044) void send_byte(uchar x)
(0045) {
(0046) uchar i;
(0047) for(i=0;i<8;i++)
0080 2744 CLR R20
0081 C011 RJMP 0x0093
(0048) {
(0049) PORTC=0<<5;
0082 2422 CLR R2
0083 BA25 OUT 0x15,R2
(0050) if((x&(1<<(7-i))))
0084 E017 LDI R17,7
0085 1B14 SUB R17,R20
0086 E001 LDI R16,1
0087 D10C RCALL lsl8
0088 2E26 MOV R2,R22
0089 2220 AND R2,R16
008A F019 BEQ 0x008E
(0051) PORTC=1<<4;
008B E180 LDI R24,0x10
008C BB85 OUT 0x15,R24
008D C002 RJMP 0x0090
(0052) else
(0053) PORTC=0<<4;
008E 2422 CLR R2
008F BA25 OUT 0x15,R2
(0054) PORTC=1<<5;
0090 E280 LDI R24,0x20
0091 BB85 OUT 0x15,R24
0092 9543 INC R20
0093 3048 CPI R20,0x8
0094 F368 BCS 0x0082
(0055) }
(0056) }
0095 D0DD RCALL pop_gset2
0096 9508 RET
_disp_led:
temp --> Y+0
tempcount --> R20
i --> R22
control --> R20
buffer --> R10
0097 D0F9 RCALL push_gset3
0098 2F42 MOV R20,R18
0099 2EA0 MOV R10,R16
009A 9726 SBIW R28,6
(0057) void disp_led(uchar buffer,uchar control)
(0058) {
(0059) uchar i,temp[6];
(0060) uint tempcount;
(0061) switch(control)
009B 2755 CLR R21
009C 3040 CPI R20,0
009D 0745 CPC R20,R21
009E F029 BEQ 0x00A4
009F 3041 CPI R20,1
00A0 E0E0 LDI R30,0
00A1 075E CPC R21,R30
00A2 F099 BEQ 0x00B6
00A3 C05E RJMP 0x0102
(0062) {
(0063) case 0: //test
(0064) {
(0065) for(i=0;i<11;i++)
00A4 2766 CLR R22
00A5 C00D RJMP 0x00B3
(0066) send_byte(disp_table[buffer%10]);//显示数字
00A6 E02A LDI R18,0xA
00A7 E030 LDI R19,0
00A8 2D0A MOV R16,R10
00A9 2711 CLR R17
00AA D07F RCALL mod16s
00AB 01F8 MOVW R30,R16
00AC E680 LDI R24,0x60
00AD E090 LDI R25,0
00AE 0FE8 ADD R30,R24
00AF 1FF9 ADC R31,R25
00B0 8100 LDD R16,Z+0
00B1 DFCC RCALL _send_byte
00B2 9563 INC R22
00B3 306B CPI R22,0xB
00B4 F388 BCS 0x00A6
(0067) break;
00B5 C04C RJMP 0x0102
(0068) }
(0069) case 1: //display count
(0070) {
(0071) tempcount=count;
00B6 91400070 LDS R20,_count
00B8 91500071 LDS R21,_count+1
(0072) for(i=0;i<6;i++)
00BA 2766 CLR R22
00BB C010 RJMP 0x00CC
(0073) {
(0074) temp[i]=tempcount%10;
00BC E02A LDI R18,0xA
00BD E030 LDI R19,0
00BE 018A MOVW R16,R20
00BF D087 RCALL mod16u
00C0 01CE MOVW R24,R28
00C1 2FE6 MOV R30,R22
00C2 27FF CLR R31
00C3 0FE8 ADD R30,R24
00C4 1FF9 ADC R31,R25
00C5 8300 STD Z+0,R16
(0075) tempcount/=10;
00C6 E02A LDI R18,0xA
00C7 E030 LDI R19,0
00C8 018A MOVW R16,R20
00C9 D07F RCALL div16u
00CA 01A8 MOVW R20,R16
00CB 9563 INC R22
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -