📄 正弦波.lst
字号:
__text_start:
__start:
006B E5CF LDI R28,0x5F
006C E0D4 LDI R29,4
006D BFCD OUT 0x3D,R28
006E BFDE OUT 0x3E,R29
006F 51C0 SUBI R28,0x10
0070 40D0 SBCI R29,0
0071 EA0A LDI R16,0xAA
0072 8308 STD Y+0,R16
0073 2400 CLR R0
0074 EEE1 LDI R30,0xE1
0075 E0F0 LDI R31,0
0076 E010 LDI R17,0
0077 3EE1 CPI R30,0xE1
0078 07F1 CPC R31,R17
0079 F011 BEQ 0x007C
007A 9201 ST R0,Z+
007B CFFB RJMP 0x0077
007C 8300 STD Z+0,R16
007D E5E4 LDI R30,0x54
007E E0F0 LDI R31,0
007F E6A0 LDI R26,0x60
0080 E0B0 LDI R27,0
0081 E010 LDI R17,0
0082 3DE5 CPI R30,0xD5
0083 07F1 CPC R31,R17
0084 F021 BEQ 0x0089
0085 95C8 LPM
0086 9631 ADIW R30,1
0087 920D ST R0,X+
0088 CFF9 RJMP 0x0082
0089 940E00FF CALL _main
_exit:
008B CFFF RJMP _exit
FILE: C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\正弦波\delay.h
(0001) #define xtal 8 //8MS
(0002) /************************************************************
(0003) * 函数名称:void DelayUS(unsigned int time)
(0004) * 功 能:软件延时1.1Us
(0005) * 入口参数:time 延时时间
(0006) * 出口参数:无
(0007) ************************************************************/
(0008) void DelayUS(unsigned int time)
(0009) {
_DelayUS:
time --> R16
008C C002 RJMP 0x008F
(0010) while(time>1)
(0011) time--;
008D 5001 SUBI R16,1
008E 4010 SBCI R17,0
008F E081 LDI R24,1
0090 E090 LDI R25,0
0091 1780 CP R24,R16
0092 0791 CPC R25,R17
0093 F3C8 BCS 0x008D
0094 9508 RET
_DelayMS:
i --> R20
time --> R16
0095 940E010C CALL push_gset1
(0012) }
(0013) /************************************************************
(0014) * 函数名称:void DelayMS(unsigned int time)
(0015) * 功 能:软件延时 1/1000s
(0016) * 入口参数:time 延时时间 MS
(0017) * 出口参数:无
(0018) ************************************************************/
(0019) void DelayMS (unsigned int time)
(0020) {
0097 C009 RJMP 0x00A1
(0021) unsigned int i;
(0022) while(time--)
(0023) {
(0024) for(i=1;i<(unsigned int)(xtal*143-2);i++)
0098 E041 LDI R20,1
0099 E050 LDI R21,0
009A C002 RJMP 0x009D
009B 5F4F SUBI R20,0xFF
009C 4F5F SBCI R21,0xFF
009D 3746 CPI R20,0x76
009E E0E4 LDI R30,4
009F 075E CPC R21,R30
00A0 F3D0 BCS 0x009B
00A1 0118 MOVW R2,R16
00A2 5001 SUBI R16,1
00A3 4010 SBCI R17,0
00A4 2022 TST R2
00A5 F791 BNE 0x0098
00A6 2033 TST R3
00A7 F781 BNE 0x0098
00A8 940E010F CALL pop_gset1
00AA 9508 RET
FILE: C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\正弦波\正弦波.c
(0001) //内部晶振 8M
(0002) #include <ioM16v.h>
(0003) #include <macros.h>
(0004) #include"delay.h"
(0005)
(0006)
(0007)
(0008) /*------宏定义------*/
(0009) #define uchar unsigned char
(0010) #define uint unsigned int
(0011)
(0012) char x=0;
(0013) char auc_SinParam[128]={
(0014) 128,134,140,147,153,159,165,171,177,182,188,193,198,204,208,213,
(0015) 218,222,226,230,233,237,240,242,245,247,249,251,252,253,254,254,
(0016) 254,254,253,252,251,250,248,246,244,241,238,235,232,228,224,220,
(0017) 215,211,206,201,196,191,185,179,174,168,162,156,150,144,137,131,
(0018) 125,119,112,106,100,94,88,82,77,71,65,60,55,50,45,41,
(0019) 36,32,28,24,21,18,15,12,10,8,6,5,4,3,2,2,
(0020) 2,2,3,4,5,7,9,11,14,16,19,23,26,30,34,38,
(0021) 43,48,52,57,63,68,74,79,85,91,97,103,109,116,122,128
(0022) };//128点正弦波样本值
(0023)
(0024) //端口初始化
(0025) void port_init(void)
(0026) {
(0027) PORTA = 0x00;//设置端口方向和数据
_port_init:
00AB 2422 CLR R2
00AC BA2B OUT 0x1B,R2
(0028) DDRA = 0x00;
00AD BA2A OUT 0x1A,R2
(0029) PORTB = 0x00;
00AE BA28 OUT 0x18,R2
(0030) DDRB = 0x00;
00AF BA27 OUT 0x17,R2
(0031) PORTC = 0x00;
00B0 BA25 OUT 0x15,R2
(0032) DDRC = 0x00;
00B1 BA24 OUT 0x14,R2
(0033) PORTD = 0x00;
00B2 BA22 OUT 0x12,R2
(0034) DDRD = 0x20;
00B3 E280 LDI R24,0x20
00B4 BB81 OUT 0x11,R24
00B5 9508 RET
(0035) }
(0036)
(0037)
(0038) //定时T1初始化
(0039) void timer1_init(void)
(0040) {
(0041) TCCR1B = 0x00;//停止定时器
_timer1_init:
00B6 2422 CLR R2
00B7 BC2E OUT 0x2E,R2
(0042) TIMSK |= 0x04;//中断允许
00B8 B789 IN R24,0x39
00B9 6084 ORI R24,4
00BA BF89 OUT 0x39,R24
(0043) TIFR = 0x00;//中断标志位
00BB BE28 OUT 0x38,R2
(0044) TCNT1H = 0x00;
00BC BC2D OUT 0x2D,R2
(0045) TCNT1L = 0x00;//初始值
00BD BC2C OUT 0x2C,R2
(0046) OCR1AH = 0x00;
00BE BC2B OUT 0x2B,R2
(0047) OCR1AL = 0xD0;//匹配A值
00BF ED80 LDI R24,0xD0
00C0 BD8A OUT 0x2A,R24
(0048) OCR1BH = 0x00;
00C1 BC29 OUT 0x29,R2
(0049) OCR1BL = 0x7F;//匹配B值
00C2 E78F LDI R24,0x7F
00C3 BD88 OUT 0x28,R24
(0050) ICR1H = 0xFF;
00C4 EF8F LDI R24,0xFF
00C5 BD87 OUT 0x27,R24
(0051) ICR1L = 0xFF;//输入捕捉匹配值
00C6 BD86 OUT 0x26,R24
(0052) TCCR1A = 0x81;
00C7 E881 LDI R24,0x81
00C8 BD8F OUT 0x2F,R24
(0053) TCCR1B = 0x09;//启动定时器
00C9 E089 LDI R24,0x9
00CA BD8E OUT 0x2E,R24
00CB 9508 RET
_timer1_ovf_isr:
00CC 922A ST R2,-Y
00CD 923A ST R3,-Y
00CE 938A ST R24,-Y
00CF 939A ST R25,-Y
00D0 93EA ST R30,-Y
00D1 93FA ST R31,-Y
00D2 B62F IN R2,0x3F
00D3 922A ST R2,-Y
(0054) }
(0055)
(0056)
(0057) //定时器T1溢出中断服务程序
(0058) #pragma interrupt_handler timer1_ovf_isr:9
(0059) void timer1_ovf_isr(void)
(0060) {
(0061) x=x+1;
00D4 91800060 LDS R24,x
00D6 5F8F SUBI R24,0xFF
00D7 93800060 STS x,R24
(0062) if (x>128)
00D9 E880 LDI R24,0x80
00DA 90200060 LDS R2,x
00DC 1582 CP R24,R2
00DD F418 BCC 0x00E1
(0063) x=0;
00DE 2422 CLR R2
00DF 92200060 STS x,R2
(0064) OCR1A=auc_SinParam[x];//auc_SinParam[x];取样点指针到比较匹配寄存器
00E1 E681 LDI R24,0x61
00E2 E090 LDI R25,0
00E3 91E00060 LDS R30,x
00E5 27FF CLR R31
00E6 0FE8 ADD R30,R24
00E7 1FF9 ADC R31,R25
00E8 8020 LDD R2,Z+0
00E9 2433 CLR R3
00EA BC3B OUT 0x2B,R3
00EB BC2A OUT 0x2A,R2
00EC 9029 LD R2,Y+
00ED BE2F OUT 0x3F,R2
00EE 91F9 LD R31,Y+
00EF 91E9 LD R30,Y+
00F0 9199 LD R25,Y+
00F1 9189 LD R24,Y+
00F2 9039 LD R3,Y+
00F3 9029 LD R2,Y+
00F4 9518 RETI
(0065) }
(0066)
(0067)
(0068) void init_devices(void)
(0069) {
(0070) CLI(); //禁止所有中断
_init_devices:
00F5 94F8 BCLR 7
(0071) MCUCR = 0x00;//INT0、INT1中断触发方式
00F6 2422 CLR R2
00F7 BE25 OUT 0x35,R2
(0072) MCUCSR = 0x80;//禁止JTAG
00F8 E880 LDI R24,0x80
00F9 BF84 OUT 0x34,R24
(0073) GICR = 0x00;//外部中断使能
00FA BE2B OUT 0x3B,R2
(0074) port_init();
00FB DFAF RCALL _port_init
(0075) timer1_init();
00FC DFB9 RCALL _timer1_init
(0076) SEI();//开全局中断
00FD 9478 BSET 7
00FE 9508 RET
(0077) }
(0078) //主函数
(0079) void main(void)
(0080) {
(0081) init_devices();
_main:
00FF DFF5 RCALL _init_devices
0100 C001 RJMP 0x0102
(0082) //在这继续添加你的代码
(0083) while(1)
(0084) {
(0085) NOP();
FILE: <library>
0101 0000 NOP
0102 CFFE RJMP 0x0101
0103 9508 RET
push_gset5:
0104 92FA ST R15,-Y
0105 92EA ST R14,-Y
push_gset4:
0106 92DA ST R13,-Y
0107 92CA ST R12,-Y
push_gset3:
0108 92BA ST R11,-Y
0109 92AA ST R10,-Y
push_gset2:
010A 937A ST R23,-Y
010B 936A ST R22,-Y
push_gset1:
010C 935A ST R21,-Y
010D 934A ST R20,-Y
010E 9508 RET
pop_gset1:
010F E0E1 LDI R30,1
pop:
0110 9149 LD R20,Y+
0111 9159 LD R21,Y+
0112 FDE0 SBRC R30,0
0113 9508 RET
0114 9169 LD R22,Y+
0115 9179 LD R23,Y+
0116 FDE1 SBRC R30,1
0117 9508 RET
0118 90A9 LD R10,Y+
0119 90B9 LD R11,Y+
011A FDE2 SBRC R30,2
011B 9508 RET
011C 90C9 LD R12,Y+
011D 90D9 LD R13,Y+
011E FDE3 SBRC R30,3
011F 9508 RET
0120 90E9 LD R14,Y+
0121 90F9 LD R15,Y+
0122 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -