📄 main.lst
字号:
__text_start:
__start:
0067 EFCF LDI R28,0xFF
0068 E1D0 LDI R29,0x10
0069 BFCD OUT 0x3D,R28
006A BFDE OUT 0x3E,R29
006B 51C0 SUBI R28,0x10
006C 40D0 SBCI R29,0
006D EA0A LDI R16,0xAA
006E 8308 STD Y+0,R16
006F 2400 CLR R0
0070 E0E0 LDI R30,0
0071 E0F1 LDI R31,1
0072 E011 LDI R17,1
0073 30E7 CPI R30,7
0074 07F1 CPC R31,R17
0075 F011 BEQ 0x0078
0076 9201 ST R0,Z+
0077 CFFB RJMP 0x0073
0078 8300 STD Z+0,R16
0079 ECEE LDI R30,0xCE
007A E0F0 LDI R31,0
007B E0A0 LDI R26,0
007C E0B1 LDI R27,1
007D E010 LDI R17,0
007E 3CEE CPI R30,0xCE
007F 07F1 CPC R31,R17
0080 F021 BEQ 0x0085
0081 95C8 LPM
0082 9631 ADIW R30,1
0083 920D ST R0,X+
0084 CFF9 RJMP 0x007E
0085 940E0088 CALL _main
_exit:
0087 CFFF RJMP _exit
FILE: F:\芯生光盘资料\范例代码\ADC\main.c
(0001) //ICC-AVR application builder : 2007-8-13 15:05:41
(0002) // Target : M128
(0003) // Crystal: 7.3728Mhz
(0004)
(0005) #include <iom128v.h>
(0006) #include <macros.h>
(0007) #include "port.h"
(0008) #include "adc.h"
(0009) #include "led.h"
(0010)
(0011)
(0012) /*call this routine to initialize all peripherals */
(0013) void main(void)
(0014) {
(0015) UNS8 i;
(0016) //stop errant interrupts until set up
(0017) CLI(); //disable all interrupts
_main:
i --> Y+1
0088 94F8 BCLR 7
(0018)
(0019) port_init();
0089 940E009D CALL _port_init
(0020) led_init(); //7段数码管显示
008B 940E00C8 CALL _led_init
(0021)
(0022) MCUCR = 0x00;//IO
008D 2422 CLR R2
008E BE25 OUT 0x35,R2
(0023)
(0024) adc_init();
008F 940E089C CALL _adc_init
(0025)
(0026) /*
(0027) Set_Bit(PORTE,7);
(0028) transmit_byte(0xaa);
(0029) delay(10000);
(0030) Clr_Bit(PORTE,7);
(0031) */
(0032)
(0033) SEI(); //re-enable interrupts
0091 9478 BSET 7
(0034) //all peripherals are now initialized
(0035)
(0036)
(0037) for(;;)
(0038) {
(0039) system_protect();
0092 940E08C2 CALL _system_protect
(0040) display(adc0_value,0); //普通模式,显示countdata的值,countdata将在timer3定时一秒溢出时改变
0094 2722 CLR R18
0095 91000105 LDS R16,adc0_value
0097 91100106 LDS R17,adc0_value+1
0099 940E00EE CALL _display
009B CFF6 RJMP 0x0092
009C 9508 RET
FILE: F:\芯生光盘资料\范例代码\ADC\port\port.c
(0001) #include <iom128v.h>
(0002)
(0003)
(0004) void port_init(void)//修改
(0005) {
(0006) PORTA = 0x00;
_port_init:
009D 2422 CLR R2
009E BA2B OUT 0x1B,R2
(0007) DDRA = 0x00;
009F BA2A OUT 0x1A,R2
(0008) PORTB = 0x00;
00A0 BA28 OUT 0x18,R2
(0009) DDRB = 0x00;
00A1 BA27 OUT 0x17,R2
(0010) PORTC = 0x00;//m103 output only
00A2 BA25 OUT 0x15,R2
(0011) DDRC = 0x00;
00A3 BA24 OUT 0x14,R2
(0012) PORTD = 0x00;
00A4 BA22 OUT 0x12,R2
(0013) DDRD = 0x00;
00A5 BA21 OUT 0x11,R2
(0014) PORTE = 0x00;
00A6 B823 OUT 0x03,R2
(0015) DDRE = 0x00;
00A7 B822 OUT 0x02,R2
(0016) PORTF = 0x00;//ADC1
00A8 92200062 STS 0x62,R2
(0017) DDRF = 0x00;
00AA 92200061 STS 0x61,R2
(0018) PORTG = 0x00;
00AC 92200065 STS 0x65,R2
(0019) DDRG = 0x00;
00AE 92200064 STS 0x64,R2
00B0 9508 RET
FILE: F:\芯生光盘资料\范例代码\ADC\4led\led.c
(0001) /**********************************
(0002) ** file_name led.c **
(0003) ** describe 七段数码管函数 **
(0004) ** auther 芯生 **
(0005) ** Time 2007-12-14 **
(0006) ***********************************/
(0007)
(0008) #include <iom128v.h>
(0009) #include <macros.h>
(0010) #include "stdtypes.h"
(0011) #include "led.h"
(0012)
(0013) //共阳极,LED数据 不显点,亮的段为1,连接为P0~P7对应a~g,dp
(0014) const led_data[16]={
(0015) 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
(0016) 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e
(0017) };
(0018)
(0019) /***********************
(0020) **8M时为 1000.25us
(0021) **4M时为 999.5us
(0022) **xtal 为晶振频率,单位为Mhz
(0023) ************************/
(0024) void delay_1ms(void)
(0025) {
(0026) unsigned int i;
(0027) for(i=200;i>0;i--)
_delay_1ms:
i --> R16
00B1 EC08 LDI R16,0xC8
00B2 E010 LDI R17,0
00B3 C002 RJMP 0x00B6
00B4 5001 SUBI R16,1
00B5 4010 SBCI R17,0
00B6 3000 CPI R16,0
00B7 0701 CPC R16,R17
00B8 F7D9 BNE 0x00B4
00B9 9508 RET
_delay_ms:
i --> R20
n --> R22
00BA 940E0926 CALL push_gset2
00BC 01B8 MOVW R22,R16
(0028) ;
(0029) }
(0030) /***********************
(0031) **毫秒级延时
(0032) ************************/
(0033) void delay_ms(unsigned int n)
(0034) {
(0035) unsigned int i;
(0036) for(i=n;i>0;i--)
00BD 01AB MOVW R20,R22
00BE C003 RJMP 0x00C2
(0037) delay_1ms();
00BF DFF1 RCALL _delay_1ms
00C0 5041 SUBI R20,1
00C1 4050 SBCI R21,0
00C2 3040 CPI R20,0
00C3 0745 CPC R20,R21
00C4 F7D1 BNE 0x00BF
00C5 940E091A CALL pop_gset2
00C7 9508 RET
(0038) }
(0039)
(0040) /***********************
(0041) ** 初始化对应端口为输出
(0042) ** ABCD 和 abcdefg dpi 共12个IO口
(0043) ** 默认为 PD(4567) 和 PA(012345678)
(0044) ***********************/
(0045) void led_init(void)
(0046) {
(0047) led_ddr = 0xFF; //abcdefg dpi 各位设为输出
_led_init:
00C8 EF8F LDI R24,0xFF
00C9 BB8A OUT 0x1A,R24
(0048) led_contrl_ddr |= (1<<led_a)|(1<<led_b)|(1<<led_c)|(1<<led_d); //ABCD四个控制设为输出
00CA B381 IN R24,0x11
00CB 6F80 ORI R24,0xF0
00CC BB81 OUT 0x11,R24
(0049)
(0050) //初始化全灭
(0051) led_port = 0xFF;
00CD EF8F LDI R24,0xFF
00CE BB8B OUT 0x1B,R24
(0052) led_contrl_port |= (1<<led_a)|(1<<led_b)|(1<<led_c)|(1<<led_d);
00CF B382 IN R24,0x12
00D0 6F80 ORI R24,0xF0
00D1 BB82 OUT 0x12,R24
00D2 9508 RET
_display_one:
data --> R20
count --> R22
00D3 940E0926 CALL push_gset2
00D5 2F42 MOV R20,R18
00D6 2F60 MOV R22,R16
(0053) }
(0054)
(0055) /***********************
(0056) ** 显示一位
(0057) ** 输入:count显示在第几位(3210),data 要显示的数(0~f)
(0058) ************************/
(0059) void display_one(UNS8 count, UNS8 data)
(0060) {
(0061)
(0062) led_contrl_port &= ~(1<<count); //选中对应要显示的位,从右至左,4567
00D7 E001 LDI R16,1
00D8 2F16 MOV R17,R22
00D9 940E095C CALL lsl8
00DB 2E20 MOV R2,R16
00DC 9420 COM R2
00DD B232 IN R3,0x12
00DE 2032 AND R3,R2
00DF BA32 OUT 0x12,R3
(0063) led_port = led_data[data]; //显示的数
00E0 E082 LDI R24,2
00E1 9F84 MUL R24,R20
00E2 01F0 MOVW R30,R0
00E3 E88C LDI R24,0x8C
00E4 E090 LDI R25,0
00E5 0FE8 ADD R30,R24
00E6 1FF9 ADC R31,R25
00E7 9005 LPM R0,Z+
00E8 9014 LPM R1,0(Z)
00E9 01F0 MOVW R30,R0
00EA BBEB OUT 0x1B,R30
00EB 940E091A CALL pop_gset2
00ED 9508 RET
_display:
temp --> R20
mode --> R10
data --> R22
00EE 940E0924 CALL push_gset3
00F0 2EA2 MOV R10,R18
00F1 01B8 MOVW R22,R16
(0064)
(0065) //如果对位进行了调整,就不在是4567,而是对应的值
(0066) }
(0067)
(0068) /***********************
(0069) ** 显示四位整数
(0070) ** 输入:要显示的四位数data,显示模式mode,1为补零显示模式,默认不显示零
(0071) ** 说明:可以小于四位数,mode=1时 自动补零
(0072) ************************/
(0073) void display(UNS16 data,UNS8 mode)
(0074) {
(0075) UNS8 temp;
(0076) //千位
(0077) if(data>=1000)
00F2 3E68 CPI R22,0xE8
00F3 E0E3 LDI R30,3
00F4 077E CPC R23,R30
00F5 F070 BCS 0x0104
(0078) {//补零
(0079) temp=data/1000;
00F6 EE28 LDI R18,0xE8
00F7 E033 LDI R19,3
00F8 018B MOVW R16,R22
00F9 940E0900 CALL div16u
00FB 2F40 MOV R20,R16
(0080) display_one(7,temp);
00FC 2F24 MOV R18,R20
00FD E007 LDI R16,7
00FE DFD4 RCALL _display_one
(0081) delay_ms(6); //6ms 是个经验值,刚好无闪烁,并且亮度较高
00FF E006 LDI R16,6
0100 E010 LDI R17,0
0101 DFB8 RCALL _delay_ms
(0082) led_contrl_port |= (1<<7);
0102 9A97 SBI 0x12,7
(0083)
(0084) }
0103 C00A RJMP 0x010E
(0085) else
(0086) { if(mode==1)
0104 2D8A MOV R24,R10
0105 3081 CPI R24,1
0106 F439 BNE 0x010E
(0087) {
(0088) display_one(7,0);
0107 2722 CLR R18
0108 E007 LDI R16,7
0109 DFC9 RCALL _display_one
(0089) delay_ms(6);
010A E006 LDI R16,6
010B E010 LDI R17,0
010C DFAD RCALL _delay_ms
(0090) led_contrl_port |= (1<<7);
010D 9A97 SBI 0x12,7
(0091) }
(0092) }
(0093)
(0094) //百位
(0095) if(data>=100)
010E 3664 CPI R22,0x64
010F E0E0 LDI R30,0
0110 077E CPC R23,R30
0111 F090 BCS 0x0124
(0096) {
(0097) temp=(data%1000)/100;
0112 EE28 LDI R18,0xE8
0113 E033 LDI R19,3
0114 018B MOVW R16,R22
0115 940E08FE CALL mod16u
0117 E624 LDI R18,0x64
0118 E030 LDI R19,0
0119 940E0900 CALL div16u
011B 2F40 MOV R20,R16
(0098) display_one(6,temp);
011C 2F24 MOV R18,R20
011D E006 LDI R16,6
011E DFB4 RCALL _display_one
(0099) delay_ms(6);
011F E006 LDI R16,6
0120 E010 LDI R17,0
0121 DF98 RCALL _delay_ms
(0100) led_contrl_port |= (1<<6);
0122 9A96 SBI 0x12,6
(0101) }
0123 C00A RJMP 0x012E
(0102) else
(0103) {
(0104) if(mode==1)
0124 2D8A MOV R24,R10
0125 3081 CPI R24,1
0126 F439 BNE 0x012E
(0105) {
(0106) display_one(6,0);
0127 2722 CLR R18
0128 E006 LDI R16,6
0129 DFA9 RCALL _display_one
(0107) delay_ms(6);
012A E006 LDI R16,6
012B E010 LDI R17,0
012C DF8D RCALL _delay_ms
(0108) led_contrl_port |= (1<<6);
012D 9A96 SBI 0x12,6
(0109) }
(0110) }
(0111) //十位
(0112) if(data>=10)
012E 306A CPI R22,0xA
012F E0E0 LDI R30,0
0130 077E CPC R23,R30
0131 F090 BCS 0x0144
(0113) {
(0114) temp=(data%100)/10;
0132 E624 LDI R18,0x64
0133 E030 LDI R19,0
0134 018B MOVW R16,R22
0135 940E08FE CALL mod16u
0137 E02A LDI R18,0xA
0138 E030 LDI R19,0
0139 940E0900 CALL div16u
013B 2F40 MOV R20,R16
(0115) display_one(5,temp);
013C 2F24 MOV R18,R20
013D E005 LDI R16,5
013E DF94 RCALL _display_one
(0116) delay_ms(6);
013F E006 LDI R16,6
0140 E010 LDI R17,0
0141 DF78 RCALL _delay_ms
(0117) led_contrl_port |= (1<<5);
0142 9A95 SBI 0x12,5
(0118) }
0143 C00A RJMP 0x014E
(0119) else
(0120) {
(0121) if(mode==1)
0144 2D8A MOV R24,R10
0145 3081 CPI R24,1
0146 F439 BNE 0x014E
(0122) {
(0123) display_one(5,0);
0147 2722 CLR R18
0148 E005 LDI R16,5
0149 DF89 RCALL _display_one
(0124) delay_ms(6);
014A E006 LDI R16,6
014B E010 LDI R17,0
014C DF6D RCALL _delay_ms
(0125) led_contrl_port |= (1<<5);
014D 9A95 SBI 0x12,5
(0126) }
(0127) }
(0128) //个位
(0129) temp=data%10;
014E E02A LDI R18,0xA
014F E030 LDI R19,0
0150 018B MOVW R16,R22
0151 940E08FE CALL mod16u
0153 2F40 MOV R20,R16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -