📄 ad2disp.lst
字号:
__text_start:
__start:
0030 E5CF LDI R28,0x5F
0031 E0D4 LDI R29,4
0032 BFCD OUT 0x3D,R28
0033 BFDE OUT 0x3E,R29
0034 51C0 SUBI R28,0x10
0035 40D0 SBCI R29,0
0036 EA0A LDI R16,0xAA
0037 8308 STD Y+0,R16
0038 2400 CLR R0
0039 E6E8 LDI R30,0x68
003A E0F0 LDI R31,0
003B E010 LDI R17,0
003C 37EC CPI R30,0x7C
003D 07F1 CPC R31,R17
003E F011 BEQ 0x0041
003F 9201 ST R0,Z+
0040 CFFB RJMP 0x003C
0041 8300 STD Z+0,R16
0042 E5E8 LDI R30,0x58
0043 E0F0 LDI R31,0
0044 E6A0 LDI R26,0x60
0045 E0B0 LDI R27,0
0046 E010 LDI R17,0
0047 36E0 CPI R30,0x60
0048 07F1 CPC R31,R17
0049 F021 BEQ 0x004E
004A 95C8 LPM
004B 9631 ADIW R30,1
004C 920D ST R0,X+
004D CFF9 RJMP 0x0047
004E 940E00DB CALL _main
_exit:
0050 CFFF RJMP _exit
_display:
DispContent --> R20
i --> R22
gate --> R10
content --> R12
0051 940E0348 CALL push_gset5
0053 2EA2 MOV R10,R18
0054 0168 MOVW R12,R16
FILE: F:\IccAvr_Pro\Display.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003)
(0004) #include "Display.h"
(0005)
(0006) void display(unsigned int content,unsigned char gate)
(0007) {
(0008) unsigned int DispContent=0;
0055 2744 CLR R20
0056 2755 CLR R21
(0009) unsigned char i;
(0010) for(i=0;i<4;i++) //gain the BCD code of the number
0057 2766 CLR R22
0058 C01C RJMP 0x0075
(0011) {
(0012) DispContent>>=4;
0059 011A MOVW R2,R20
005A 9436 LSR R3
005B 9427 ROR R2
005C 9436 LSR R3
005D 9427 ROR R2
005E 9436 LSR R3
005F 9427 ROR R2
0060 9436 LSR R3
0061 9427 ROR R2
0062 01A1 MOVW R20,R2
(0013) DispContent|=(content%10)<<12;
0063 E02A LDI R18,0xA
0064 E030 LDI R19,0
0065 0186 MOVW R16,R12
0066 940E0255 CALL mod16u
0068 E02C LDI R18,0xC
0069 E030 LDI R19,0
006A 940E0371 CALL lsl16
006C 2B40 OR R20,R16
006D 2B51 OR R21,R17
(0014) content=content/10;
006E E02A LDI R18,0xA
006F E030 LDI R19,0
0070 0186 MOVW R16,R12
0071 940E0257 CALL div16u
0073 0168 MOVW R12,R16
0074 9563 INC R22
0075 3064 CPI R22,4
0076 F310 BCS 0x0059
(0015) }
(0016)
(0017) switch(gate)
0077 2CEA MOV R14,R10
0078 24FF CLR R15
0079 20EE TST R14
007A F411 BNE 0x007D
007B 20FF TST R15
007C F071 BEQ 0x008B
007D 01C7 MOVW R24,R14
007E 3081 CPI R24,1
007F E0E0 LDI R30,0
0080 079E CPC R25,R30
0081 F059 BEQ 0x008D
0082 3082 CPI R24,2
0083 E0E0 LDI R30,0
0084 079E CPC R25,R30
0085 F049 BEQ 0x008F
0086 3083 CPI R24,3
0087 E0E0 LDI R30,0
0088 079E CPC R25,R30
0089 F039 BEQ 0x0091
008A C008 RJMP 0x0093
(0018) {
(0019) case 0: PORTB&=~BIT(Gate0);break; //Open the gate
008B 98C4 CBI 0x18,4
008C C009 RJMP 0x0096
(0020) case 1: PORTB&=~BIT(Gate1);break;
008D 98C5 CBI 0x18,5
008E C007 RJMP 0x0096
(0021) case 2: PORTB&=~BIT(Gate2);break;
008F 98C6 CBI 0x18,6
0090 C005 RJMP 0x0096
(0022) case 3: PORTB&=~BIT(Gate3);break;
0091 98C7 CBI 0x18,7
0092 C003 RJMP 0x0096
(0023) default: PORTB|=0xF0;break;
0093 B388 IN R24,0x18
0094 6F80 ORI R24,0xF0
0095 BB88 OUT 0x18,R24
(0024) }
(0025) for (i=0;i<=15;i++) //Send the number by serial
0096 2766 CLR R22
0097 C011 RJMP 0x00A9
(0026) {
(0027) PORTC|=BIT(DispClk);
0098 9AAE SBI 0x15,6
(0028) NOP();
0099 0000 NOP
(0029) NOP();
009A 0000 NOP
(0030) if(DispContent&0x01)
009B FF40 SBRS R20,0
009C C002 RJMP 0x009F
(0031) PORTC|=BIT(DispData);
009D 9AAF SBI 0x15,7
009E C001 RJMP 0x00A0
(0032) else
(0033) PORTC&=~BIT(DispData);
009F 98AF CBI 0x15,7
(0034) NOP();
00A0 0000 NOP
(0035) NOP();
00A1 0000 NOP
(0036) NOP();
00A2 0000 NOP
(0037) NOP();
00A3 0000 NOP
(0038) asm("clc");
00A4 9488 BCLR 0
(0039) DispContent>>=1;
00A5 9556 LSR R21
00A6 9547 ROR R20
(0040) PORTC&=~BIT(DispClk);
00A7 98AE CBI 0x15,6
00A8 9563 INC R22
00A9 E08F LDI R24,0xF
00AA 1786 CP R24,R22
00AB F760 BCC 0x0098
(0041) }
(0042) PORTB|=0xF0;
00AC B388 IN R24,0x18
00AD 6F80 ORI R24,0xF0
00AE BB88 OUT 0x18,R24
(0043) }
00AF 940E0322 CALL pop_gset5
00B1 9508 RET
(0044)
(0045) void disp_init(void) //Set all control signal high
(0046) {
(0047) DDRB|=0xFF;
_disp_init:
00B2 B387 IN R24,0x17
00B3 6F8F ORI R24,0xFF
00B4 BB87 OUT 0x17,R24
(0048) PORTB|=0xF0;
00B5 B388 IN R24,0x18
00B6 6F80 ORI R24,0xF0
00B7 BB88 OUT 0x18,R24
(0049) PORTC|=BIT(DispData)|BIT(DispClk);
00B8 B385 IN R24,0x15
00B9 6C80 ORI R24,0xC0
00BA BB85 OUT 0x15,R24
(0050) DDRC|=BIT(DispData)|BIT(DispClk);
00BB B384 IN R24,0x14
00BC 6C80 ORI R24,0xC0
00BD BB84 OUT 0x14,R24
(0051) }
00BE 9508 RET
FILE: F:\IccAvr_Pro\Ad2disp.c
(0001) //ICC-AVR application builder : 2005-6-5 18:27:12
(0002) // Target : M16
(0003) // Crystal: 7.3728Mhz
(0004)
(0005) #include <iom16v.h>
(0006) #include <macros.h>
(0007) #include "time.h"
(0008) #include "Display.h"
(0009) #include "key.h"
(0010) #include "ADC.h"
(0011)
(0012) extern const unsigned char ADChannel;
(0013) extern unsigned int AdValue[8];
(0014) extern unsigned char AdP;
(0015) extern unsigned char time_flag;
(0016) extern unsigned char keyflag[4];
(0017) extern unsigned char AdFlag;
(0018) extern unsigned char pwm;
(0019)
(0020) unsigned char Itrans[4]={0,241,100,88};
(0021) void port_init(void)
(0022) {
(0023) PORTA = 0xFF;
_port_init:
00BF EF8F LDI R24,0xFF
00C0 BB8B OUT 0x1B,R24
(0024) DDRA = 0x00;
00C1 2422 CLR R2
00C2 BA2A OUT 0x1A,R2
(0025) PORTB = 0xFF;
00C3 BB88 OUT 0x18,R24
(0026) DDRB = 0x00;
00C4 BA27 OUT 0x17,R2
(0027) PORTC = 0xFF; //m103 output only
00C5 BB85 OUT 0x15,R24
(0028) DDRC = 0x00;
00C6 BA24 OUT 0x14,R2
(0029) PORTD = 0xFF;
00C7 BB82 OUT 0x12,R24
(0030) DDRD = 0x00;
00C8 BA21 OUT 0x11,R2
(0031) }
00C9 9508 RET
(0032)
(0033)
(0034)
(0035)
(0036) //call this routine to initialise all peripherals
(0037) void init_devices(void)
(0038) {
(0039) //stop errant interrupts until set up
(0040) CLI(); //disable all interrupts
_init_devices:
00CA 94F8 BCLR 7
(0041) port_init();
00CB DFF3 RCALL _port_init
(0042) timer1_init();
00CC 940E018A CALL _timer1_init
(0043) disp_init();
00CE 940E00B2 CALL _disp_init
(0044) adc_init();
00D0 940E01ED CALL _adc_init
(0045) timer2_init();
00D2 940E017E CALL _timer2_init
(0046)
(0047)
(0048) MCUCR = 0x00;
00D4 2422 CLR R2
00D5 BE25 OUT 0x35,R2
(0049) GICR = 0x00;
00D6 BE2B OUT 0x3B,R2
(0050) TIMSK = 0x40; //timer interrupt sources
00D7 E480 LDI R24,0x40
00D8 BF89 OUT 0x39,R24
(0051) SEI(); //re-enable interrupts
00D9 9478 BSET 7
(0052) //all peripherals are now initialised
(0053) }
00DA 9508 RET
_main:
result --> Y+0
key --> R10
00DB 9724 SBIW R28,4
(0054)
(0055) //
(0056) void main(void)
(0057) {
(0058) unsigned char key=0;
00DC 24AA CLR R10
(0059) unsigned long result=0;
00DD E040 LDI R20,0
00DE E050 LDI R21,0
00DF E060 LDI R22,0
00E0 E070 LDI R23,0
00E1 01FE MOVW R30,R28
00E2 8340 STD Z+0,R20
00E3 8351 STD Z+1,R21
00E4 8362 STD Z+2,R22
00E5 8373 STD Z+3,R23
(0060)
(0061)
(0062) init_devices();
00E6 DFE3 RCALL _init_devices
00E7 C087 RJMP 0x016F
(0063) //insert your functional code here...
(0064) while(1)
(0065) {
(0066) time_flag=0;
00E8 2422 CLR R2
00E9 92200064 STS 0x64,R2
(0067) AdFlag=0;
00EB 92200067 STS 0x67,R2
(0068)
(0069) adc_start();
00ED 940E0249 CALL _adc_start
(0070)
(0071) while(!AdFlag);
00EF 90200067 LDS R2,0x67
00F1 2022 TST R2
00F2 F3E1 BEQ 0x00EF
(0072) pwm=(unsigned char)(AdValue[7]>>2);
00F3 9020007A LDS R2,0x7A
00F5 9030007B LDS R3,0x7B
00F7 9436 LSR R3
00F8 9427 ROR R2
00F9 9436 LSR R3
00FA 9427 ROR R2
00FB 92200065 STS 0x65,R2
(0073) pwm_change(pwm);
00FD 2D02 MOV R16,R2
00FE 940E01A0 CALL _pwm_change
(0074) if(key)
0100 20AA TST R10
0101 F409 BNE 0x0103
0102 C046 RJMP 0x0149
(0075) {
(0076) if(key==4)
0103 2D8A MOV R24,R10
0104 3084 CPI R24,4
0105 F451 BNE 0x0110
(0077) result=0;
0106 E040 LDI R20,0
0107 E050 LDI R21,0
0108 E060 LDI R22,0
0109 E070 LDI R23,0
010A 01FE MOVW R30,R28
010B 8340 STD Z+0,R20
010C 8351 STD Z+1,R21
010D 8362 STD Z+2,R22
010E 8373 STD Z+3,R23
010F C033 RJMP 0x0143
(0078) else
(0079) {
(0080) result=(10*(long)AdValue[3]*Itrans[key])/AdValue[5];
0110 E680 LDI R24,0x60
0111 E090 LDI R25,0
0112 2DEA MOV R30,R10
0113 27FF CLR R31
0114 0FE8 ADD R30,R24
0115 1FF9 ADC R31,R25
0116 8020 LDD R2,Z+0
0117 2433 CLR R3
0118 2444 CLR R4
0119 2455 CLR R5
011A 90600072 LDS R6,0x72
011C 90700073 LDS R7,0x73
011E 2488 CLR R8
011F 2499 CLR R9
0120 E04A LDI R20,0xA
0121 E050 LDI R21,0
0122 E060 LDI R22,0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -