📄 ac19-1.lst
字号:
__text_start:
__start:
0049 E5CF LDI R28,0x5F
004A E0D4 LDI R29,4
004B BFCD OUT 0x3D,R28
004C BFDE OUT 0x3E,R29
004D 51C0 SUBI R28,0x10
004E 40D0 SBCI R29,0
004F EA0A LDI R16,0xAA
0050 8308 STD Y+0,R16
0051 2400 CLR R0
0052 E6E4 LDI R30,0x64
0053 E0F0 LDI R31,0
0054 E010 LDI R17,0
0055 37EE CPI R30,0x7E
0056 07F1 CPC R31,R17
0057 F011 BEQ 0x005A
0058 9201 ST R0,Z+
0059 CFFB RJMP 0x0055
005A 8300 STD Z+0,R16
005B E8EE LDI R30,0x8E
005C E0F0 LDI R31,0
005D E6A0 LDI R26,0x60
005E E0B0 LDI R27,0
005F E010 LDI R17,0
0060 39E2 CPI R30,0x92
0061 07F1 CPC R31,R17
0062 F021 BEQ 0x0067
0063 95C8 LPM
0064 9631 ADIW R30,1
0065 920D ST R0,X+
0066 CFF9 RJMP 0x0060
0067 940E00D3 CALL _main
_exit:
0069 CFFF RJMP _exit
FILE: d:\MYDOCU~1\ac19-1\main.c
(0001) //ICC-AVR application builder : 2007-9-20 10:30:53
(0002) // Target : m16
(0003) // Crystal: 8.0000Mhz
(0004)
(0005) #include <iom16v.h>
(0006) #include <macros.h>
(0007) #include "head.h"
(0008) #define uchar unsigned char
(0009) #define uint unsigned int
(0010) #define xtal 8
(0011)
(0012) extern void WaitForEnable(void);
(0013) extern void LcdWriteData(uchar W);
(0014) extern void LcdWriteCommand(uchar CMD,uchar Attribc);
(0015) extern void InitLcd(void);
(0016) extern void Display(uchar dd);
(0017) extern void DisplayOneChar(uchar x,uchar y,uchar Wdata);
(0018) extern void ePutstr(uchar x,uchar y,uchar const *ptr);
(0019)
(0020)
(0021) uchar Start=0,WorkFlag;
(0022) uint WorkTime,DisTime,Counter;
(0023) uint DisVal;
(0024) uint cnt;
(0025) uchar Flag,IntFlag,JS=0;
(0026) uint tx,cx;
(0027) uint disx[4];
(0028) uchar DisFlag=1,EndFlag,BeginFlag=0;
(0029)
(0030) const uchar cs0[]={"ShangHai"};//欢迎界面
(0031) const uchar cs1[]={"-Tester-"};//欢迎界面
(0032) const uchar cs2[]={"Testing-"};//测试界面
(0033) const uchar dsp[]={"RPM: "};//测试界面
(0034)
(0035) //TIMER2 initialize - prescale:64
(0036) // WGM: Normal
(0037) // desired value: 1mSec
(0038) // actual value: 1.000mSec (0.0%)
(0039) void timer2_init(void)
(0040) {
(0041) TCCR2 = 0x00; //stop
_timer2_init:
006A 2422 CLR R2
006B BC25 OUT 0x25,R2
(0042) ASSR = 0x00; //set async mode
006C BC22 OUT 0x22,R2
(0043) TCNT2 = 0x83; //setup
006D E883 LDI R24,0x83
006E BD84 OUT 0x24,R24
(0044) OCR2 = 0x7D;
006F E78D LDI R24,0x7D
0070 BD83 OUT 0x23,R24
(0045) TCCR2 = 0x04; //start
0071 E084 LDI R24,4
0072 BD85 OUT 0x25,R24
0073 9508 RET
(0046) }
(0047)
(0048) void port_init(void)
(0049) {
(0050) PORTA = 0x00;
_port_init:
0074 2422 CLR R2
0075 BA2B OUT 0x1B,R2
(0051) DDRA = 0xFF;
0076 EF8F LDI R24,0xFF
0077 BB8A OUT 0x1A,R24
(0052) PORTB = 0x00;
0078 BA28 OUT 0x18,R2
(0053) DDRB = 0xFF;
0079 BB87 OUT 0x17,R24
(0054) PORTC = 0x00; //m103 output only
007A BA25 OUT 0x15,R2
(0055) DDRC = 0x00;
007B BA24 OUT 0x14,R2
(0056) PORTD = 0xFF;
007C BB82 OUT 0x12,R24
(0057) DDRD = 0xFF;
007D BB81 OUT 0x11,R24
(0058) DDRD = 0x63;
007E E683 LDI R24,0x63
007F BB81 OUT 0x11,R24
0080 9508 RET
(0059) }
(0060)
(0061) //call this routine to initialize all peripherals
(0062) void init_devices(void)
(0063) {
(0064) //stop errant interrupts until set up
(0065) CLI(); //disable all interrupts
_init_devices:
0081 94F8 BCLR 7
(0066) port_init();
0082 DFF1 RCALL _port_init
(0067) timer2_init();
0083 DFE6 RCALL _timer2_init
(0068)
(0069) MCUCR = 0x01;
0084 E081 LDI R24,1
0085 BF85 OUT 0x35,R24
(0070) GICR = 0x40;
0086 E480 LDI R24,0x40
0087 BF8B OUT 0x3B,R24
(0071) TIMSK = 0x40; //timer interrupt sources
0088 BF89 OUT 0x39,R24
(0072) SEI(); //re-enable interrupts
0089 9478 BSET 7
008A 9508 RET
_display1:
008B 9722 SBIW R28,2
(0073) //all peripherals are now initialized
(0074) }
(0075)
(0076) /**********************欢迎界面********************/
(0077) void display1(void)
(0078) {
(0079) LcdWriteCommand(0x01,1); //清屏,检测忙信号
008C E021 LDI R18,1
008D E001 LDI R16,1
008E 940E0380 CALL _LcdWriteCommand
(0080) ePutstr(0,0,cs0);
0090 E584 LDI R24,0x54
0091 E090 LDI R25,0
0092 8399 STD Y+1,R25
0093 8388 STD Y+0,R24
0094 2722 CLR R18
0095 2700 CLR R16
0096 940E02F3 CALL _ePutstr
(0081) ePutstr(0,1,cs1);
0098 E58D LDI R24,0x5D
0099 E090 LDI R25,0
009A 8399 STD Y+1,R25
009B 8388 STD Y+0,R24
009C E021 LDI R18,1
009D 2700 CLR R16
009E 940E02F3 CALL _ePutstr
00A0 9622 ADIW R28,2
00A1 9508 RET
_display2:
00A2 9722 SBIW R28,2
(0082) }
(0083)
(0084) void display2(void)
(0085) {
(0086) LcdWriteCommand(0x01,1); //清屏,检测忙信号
00A3 E021 LDI R18,1
00A4 E001 LDI R16,1
00A5 940E0380 CALL _LcdWriteCommand
(0087) ePutstr(0,0,cs2);
00A7 E686 LDI R24,0x66
00A8 E090 LDI R25,0
00A9 8399 STD Y+1,R25
00AA 8388 STD Y+0,R24
00AB 2722 CLR R18
00AC 2700 CLR R16
00AD 940E02F3 CALL _ePutstr
(0088) ePutstr(0,1,dsp);
00AF E68F LDI R24,0x6F
00B0 E090 LDI R25,0
00B1 8399 STD Y+1,R25
00B2 8388 STD Y+0,R24
00B3 E021 LDI R18,1
00B4 2700 CLR R16
00B5 940E02F3 CALL _ePutstr
00B7 9622 ADIW R28,2
00B8 9508 RET
(0089) }
(0090)
(0091) //****************************************
(0092) void Delay_1ms(void) //1mS延时子函数
(0093) { uint i;
(0094) for(i=1;i<(uint)(xtal*124);i++)
_Delay_1ms:
i --> R16
00B9 E001 LDI R16,1
00BA E010 LDI R17,0
00BB C002 RJMP 0x00BE
00BC 5F0F SUBI R16,0xFF
00BD 4F1F SBCI R17,0xFF
00BE 3E00 CPI R16,0xE0
00BF E0E3 LDI R30,3
00C0 071E CPC R17,R30
00C1 F3D0 BCS 0x00BC
00C2 9508 RET
_Delay_nms:
i --> R20
n --> R22
00C3 940E03EF CALL push_gset2
00C5 01B8 MOVW R22,R16
(0095) ;
(0096) }
(0097) //=============================================
(0098) void Delay_nms(uint n) //n*1mS延时子函数
(0099) {
(0100) uint i=0;
00C6 2744 CLR R20
00C7 2755 CLR R21
00C8 C004 RJMP 0x00CD
(0101) while(i<n)
(0102) {Delay_1ms();WDR();
00C9 DFEF RCALL _Delay_1ms
00CA 95A8 WDR
(0103) i++;
00CB 5F4F SUBI R20,0xFF
00CC 4F5F SBCI R21,0xFF
00CD 1746 CP R20,R22
00CE 0757 CPC R21,R23
00CF F3C8 BCS 0x00C9
00D0 940E03E0 CALL pop_gset2
00D2 9508 RET
_main:
time --> Y+9
count --> Y+5
x --> Y+1
temp --> R10
00D3 972D SBIW R28,0xD
(0104) }
(0105) }
(0106)
(0107) /**********************主函数*****************************/
(0108) void main(void)
(0109) { uchar temp;
(0110) float count,time,x;
(0111) Delay_nms(400);
00D4 E900 LDI R16,0x90
00D5 E011 LDI R17,1
00D6 DFEC RCALL _Delay_nms
(0112) init_devices();
00D7 DFA9 RCALL _init_devices
(0113) InitLcd();
00D8 940E034B CALL _InitLcd
(0114) display1(); //显示Test界面
00DA DFB0 RCALL _display1
(0115) Delay_nms(2000);
00DB ED00 LDI R16,0xD0
00DC E017 LDI R17,7
00DD DFE5 RCALL _Delay_nms
(0116) display2(); //显示Work状态
00DE DFC3 RCALL _display2
(0117) DisFlag=1;
00DF E081 LDI R24,1
00E0 93800062 STS DisFlag,R24
00E2 C163 RJMP 0x0246
(0118)
(0119) /********************************************/
(0120) while(1) //无限循环
(0121) { WDR();
00E3 95A8 WDR
(0122)
(0123) if(DisFlag==1)//如果显示标志为1
00E4 91800062 LDS R24,DisFlag
00E6 3081 CPI R24,1
00E7 F009 BEQ 0x00E9
00E8 C133 RJMP 0x021C
(0124) {
(0125) time=(float)tx;count=(float)cx;
00E9 E800 LDI R16,0x80
00EA E010 LDI R17,0
00EB 940E0411 CALL lpm32
00ED 933A ST R19,-Y
00EE 932A ST R18,-Y
00EF 931A ST R17,-Y
00F0 930A ST R16,-Y
00F1 9100006F LDS R16,tx
00F3 91100070 LDS R17,tx+1
00F5 9516 LSR R17
00F6 9507 ROR R16
00F7 940E046D CALL int2fp
00F9 933A ST R19,-Y
00FA 932A ST R18,-Y
00FB 931A ST R17,-Y
00FC 930A ST R16,-Y
00FD 940E05B6 CALL empy32fs
00FF 9100006F LDS R16,tx
0101 91100070 LDS R17,tx+1
0103 7001 ANDI R16,1
0104 7010 ANDI R17,0
0105 940E046D CALL int2fp
0107 933A ST R19,-Y
0108 932A ST R18,-Y
0109 931A ST R17,-Y
010A 930A ST R16,-Y
010B 940E04CA CALL add32f
010D 01FE MOVW R30,R28
010E 8701 STD Z+9,R16
010F 8712 STD Z+10,R17
0110 8723 STD Z+11,R18
0111 8734 STD Z+12,R19
0112 E800 LDI R16,0x80
0113 E010 LDI R17,0
0114 940E0411 CALL lpm32
0116 933A ST R19,-Y
0117 932A ST R18,-Y
0118 931A ST R17,-Y
0119 930A ST R16,-Y
011A 9100006D LDS R16,cx
011C 9110006E LDS R17,cx+1
011E 9516 LSR R17
011F 9507 ROR R16
0120 940E046D CALL int2fp
0122 933A ST R19,-Y
0123 932A ST R18,-Y
0124 931A ST R17,-Y
0125 930A ST R16,-Y
0126 940E05B6 CALL empy32fs
0128 9100006D LDS R16,cx
012A 9110006E LDS R17,cx+1
012C 7001 ANDI R16,1
012D 7010 ANDI R17,0
012E 940E046D CALL int2fp
0130 933A ST R19,-Y
0131 932A ST R18,-Y
0132 931A ST R17,-Y
0133 930A ST R16,-Y
0134 940E04CA CALL add32f
0136 01FE MOVW R30,R28
0137 8305 STD Z+5,R16
0138 8316 STD Z+6,R17
0139 8327 STD Z+7,R18
013A 8730 STD Z+8,R19
(0126) x=count/time;x=x*30000;DisVal=(uint)x;//数学计算
013B 01FE MOVW R30,R28
013C 8025 LDD R2,Z+5
013D 8036 LDD R3,Z+6
013E 8047 LDD R4,Z+7
013F 8450 LDD R5,Z+8
0140 925A ST R5,-Y
0141 924A ST R4,-Y
0142 923A ST R3,-Y
0143 922A ST R2,-Y
0144 01FE MOVW R30,R28
0145 8425 LDD R2,Z+13
0146 8436 LDD R3,Z+14
0147 8447 LDD R4,Z+15
0148 8850 LDD R5,Z+16
0149 925A ST R5,-Y
014A 924A ST R4,-Y
014B 923A ST R3,-Y
014C 922A ST R2,-Y
014D 940E052B CALL div32f
014F 01FE MOVW R30,R28
0150 8301 STD Z+1,R16
0151 8312 STD Z+2,R17
0152 8323 STD Z+3,R18
0153 8334 STD Z+4,R19
0154 E70C LDI R16,0x7C
0155 E010 LDI R17,0
0156 940E0411 CALL lpm32
0158 933A ST R19,-Y
0159 932A ST R18,-Y
015A 931A ST R17,-Y
015B 930A ST R16,-Y
015C 01FE MOVW R30,R28
015D 8025 LDD R2,Z+5
015E 8036 LDD R3,Z+6
015F 8047 LDD R4,Z+7
0160 8450 LDD R5,Z+8
0161 925A ST R5,-Y
0162 924A ST R4,-Y
0163 923A ST R3,-Y
0164 922A ST R2,-Y
0165 940E05B9 CALL empy32f
0167 01FE MOVW R30,R28
0168 8301 STD Z+1,R16
0169 8312 STD Z+2,R17
016A 8323 STD Z+3,R18
016B 8334 STD Z+4,R19
016C 01FE MOVW R30,R28
016D 8021 LDD R2,Z+1
016E 8032 LDD R3,Z+2
016F 8043 LDD R4,Z+3
0170 8054 LDD R5,Z+4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -