📄 低频频率计.lst
字号:
__start:
__text_start:
0036 E5CF LDI R28,0x5F
0037 E0D4 LDI R29,4
0038 BFCD OUT 0x3D,R28
0039 BFDE OUT 0x3E,R29
003A 51C0 SUBI R28,0x10
003B 40D0 SBCI R29,0
003C EA0A LDI R16,0xAA
003D 8308 STD Y+0,R16
003E 2400 CLR R0
003F E6E0 LDI R30,0x60
0040 E0F0 LDI R31,0
0041 E010 LDI R17,0
0042 36E4 CPI R30,0x64
0043 07F1 CPC R31,R17
0044 F011 BEQ 0x0047
0045 9201 ST R0,Z+
0046 CFFB RJMP 0x0042
0047 8300 STD Z+0,R16
0048 E6EC LDI R30,0x6C
0049 E0F0 LDI R31,0
004A E6A0 LDI R26,0x60
004B E0B0 LDI R27,0
004C E010 LDI R17,0
004D 36EC CPI R30,0x6C
004E 07F1 CPC R31,R17
004F F021 BEQ 0x0054
0050 95C8 LPM
0051 9631 ADIW R30,1
0052 920D ST R0,X+
0053 CFF9 RJMP 0x004D
0054 940E00E9 CALL _main
_exit:
0056 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
0057 C002 RJMP 0x005A
(0010) while(time>1)
(0011) time--;
0058 5001 SUBI R16,1
0059 4010 SBCI R17,0
005A E081 LDI R24,1
005B E090 LDI R25,0
005C 1780 CP R24,R16
005D 0791 CPC R25,R17
005E F3C8 BCS 0x0058
005F 9508 RET
_DelayMS:
i --> R20
time --> R16
0060 940E0271 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) {
0062 C009 RJMP 0x006C
(0021) unsigned int i;
(0022) while(time--)
(0023) {
(0024) for(i=1;i<(unsigned int)(xtal*143-2);i++)
0063 E041 LDI R20,1
0064 E050 LDI R21,0
0065 C002 RJMP 0x0068
0066 5F4F SUBI R20,0xFF
0067 4F5F SBCI R21,0xFF
0068 3746 CPI R20,0x76
0069 E0E4 LDI R30,4
006A 075E CPC R21,R30
006B F3D0 BCS 0x0066
006C 0118 MOVW R2,R16
006D 5001 SUBI R16,1
006E 4010 SBCI R17,0
006F 2022 TST R2
0070 F791 BNE 0x0063
0071 2033 TST R3
0072 F781 BNE 0x0063
0073 940E0274 CALL pop_gset1
0075 9508 RET
FILE: C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\低频频率计\低频频率计.c
(0001) //包含所需头文件
(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) uint m,value;
(0012) const uchar led_date[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
(0013) const uchar led_seg[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
(0014)
(0015) //端口初始化
(0016) void port_init(void)
(0017) {
(0018) PORTA = 0xFF;
_port_init:
0076 EF8F LDI R24,0xFF
0077 BB8B OUT 0x1B,R24
(0019) DDRA = 0xFF;
0078 BB8A OUT 0x1A,R24
(0020) PORTB = 0xFF;
0079 BB88 OUT 0x18,R24
(0021) DDRB = 0xFF;
007A BB87 OUT 0x17,R24
(0022) PORTC = 0x00;
007B 2422 CLR R2
007C BA25 OUT 0x15,R2
(0023) DDRC = 0x00;
007D BA24 OUT 0x14,R2
(0024) PORTD = 0x40;
007E E480 LDI R24,0x40
007F BB82 OUT 0x12,R24
(0025) DDRD = 0x00;
0080 BA21 OUT 0x11,R2
0081 9508 RET
(0026) }
(0027)
(0028)
(0029) //定时T1初始化
(0030) void timer1_init(void)
(0031) {
(0032) TCCR1B = 0x00;//停止定时器
_timer1_init:
0082 2422 CLR R2
0083 BC2E OUT 0x2E,R2
(0033) TIMSK |= 0x20;//中断允许
0084 B789 IN R24,0x39
0085 6280 ORI R24,0x20
0086 BF89 OUT 0x39,R24
(0034) TCNT1H = 0x00;
0087 BC2D OUT 0x2D,R2
(0035) TCNT1L = 0x00;//初始值
0088 BC2C OUT 0x2C,R2
(0036) OCR1AH = 0x00;
0089 BC2B OUT 0x2B,R2
(0037) OCR1AL = 0x00;//匹配A值
008A BC2A OUT 0x2A,R2
(0038) OCR1BH = 0x00;
008B BC29 OUT 0x29,R2
(0039) OCR1BL = 0x00;//匹配B值
008C BC28 OUT 0x28,R2
(0040) ICR1H = 0xFF;
008D EF8F LDI R24,0xFF
008E BD87 OUT 0x27,R24
(0041) ICR1L = 0xFF;//输入捕捉匹配值
008F BD86 OUT 0x26,R24
(0042) TCCR1A = 0x00;
0090 BC2F OUT 0x2F,R2
(0043) TCCR1B = 0x42;//启动定时器
0091 E482 LDI R24,0x42
0092 BD8E OUT 0x2E,R24
0093 9508 RET
_timer1_capt_isr:
0094 922A ST R2,-Y
0095 923A ST R3,-Y
0096 924A ST R4,-Y
0097 925A ST R5,-Y
0098 930A ST R16,-Y
0099 931A ST R17,-Y
009A 932A ST R18,-Y
009B 933A ST R19,-Y
009C 938A ST R24,-Y
009D 93EA ST R30,-Y
009E B62F IN R2,0x3F
009F 922A ST R2,-Y
00A0 940E026F CALL push_gset2
(0044) }
(0045)
(0046)
(0047) //定时器T1输入捕捉中断服务程序
(0048) #pragma interrupt_handler timer1_capt_isr:6
(0049) void timer1_capt_isr(void)
(0050) {
(0051) //timer 1 input capture event, read (int)value in ICR1 using;
(0052) TCNT1=0;
00A2 2422 CLR R2
00A3 2433 CLR R3
00A4 BC3D OUT 0x2D,R3
00A5 BC2C OUT 0x2C,R2
(0053) value=ICR1L; //Read low byte first (important)
00A6 B426 IN R2,0x26
00A7 2433 CLR R3
00A8 92300061 STS value+1,R3
00AA 92200060 STS value,R2
(0054) value|=(int)ICR1H << 8; //Read high byte and shift into top byte
00AC B427 IN R2,0x27
00AD 2433 CLR R3
00AE 2C32 MOV R3,R2
00AF 2422 CLR R2
00B0 90400060 LDS R4,value
00B2 90500061 LDS R5,value+1
00B4 2842 OR R4,R2
00B5 2853 OR R5,R3
00B6 92500061 STS value+1,R5
00B8 92400060 STS value,R4
(0055) m=1000000/value;
00BA 0112 MOVW R2,R4
00BB 2444 CLR R4
00BC 2455 CLR R5
00BD E440 LDI R20,0x40
00BE E452 LDI R21,0x42
00BF E06F LDI R22,0xF
00C0 E070 LDI R23,0
00C1 925A ST R5,-Y
00C2 924A ST R4,-Y
00C3 923A ST R3,-Y
00C4 922A ST R2,-Y
00C5 018A MOVW R16,R20
00C6 019B MOVW R18,R22
00C7 940E01FB CALL div32s
00C9 93100063 STS m+1,R17
00CB 93000062 STS m,R16
(0056) TIFR|=BIT(ICF1);//软件写1清中断标志
00CD B788 IN R24,0x38
00CE 6280 ORI R24,0x20
00CF BF88 OUT 0x38,R24
00D0 940E0266 CALL pop_gset2
00D2 9029 LD R2,Y+
00D3 BE2F OUT 0x3F,R2
00D4 91E9 LD R30,Y+
00D5 9189 LD R24,Y+
00D6 9139 LD R19,Y+
00D7 9129 LD R18,Y+
00D8 9119 LD R17,Y+
00D9 9109 LD R16,Y+
00DA 9059 LD R5,Y+
00DB 9049 LD R4,Y+
00DC 9039 LD R3,Y+
00DD 9029 LD R2,Y+
00DE 9518 RETI
(0057) }
(0058)
(0059)
(0060) void init_devices(void)
(0061) {
(0062) CLI(); //禁止所有中断
_init_devices:
00DF 94F8 BCLR 7
(0063) MCUCR = 0x00;
00E0 2422 CLR R2
00E1 BE25 OUT 0x35,R2
(0064) MCUCSR = 0x80;//禁止JTAG
00E2 E880 LDI R24,0x80
00E3 BF84 OUT 0x34,R24
(0065) GICR = 0x00;
00E4 BE2B OUT 0x3B,R2
(0066) port_init();
00E5 DF90 RCALL _port_init
(0067) timer1_init();
00E6 DF9B RCALL _timer1_init
(0068) SEI();//开全局中断
00E7 9478 BSET 7
00E8 9508 RET
(0069) }
(0070) //主函数
(0071) void main(void)
(0072) {
(0073) init_devices();
_main:
00E9 DFF5 RCALL _init_devices
00EA C0EC RJMP 0x01D7
(0074) //在这继续添加你的代码
(0075) while(1)
(0076) {
(0077) PORTB=led_date[m%10];
00EB E02A LDI R18,0xA
00EC E030 LDI R19,0
00ED 91000062 LDS R16,m
00EF 91100063 LDS R17,m+1
00F1 940E01D9 CALL mod16u
00F3 01F8 MOVW R30,R16
00F4 E584 LDI R24,0x54
00F5 E090 LDI R25,0
00F6 0FE8 ADD R30,R24
00F7 1FF9 ADC R31,R25
00F8 91E4 LPM R30,0(Z)
00F9 BBE8 OUT 0x18,R30
(0078) PORTA=0xfe;
00FA EF8E LDI R24,0xFE
00FB BB8B OUT 0x1B,R24
(0079) DelayUS(100);
00FC E604 LDI R16,0x64
00FD E010 LDI R17,0
00FE DF58 RCALL _DelayUS
(0080) PORTB=led_date[m/10%10];
00FF E02A LDI R18,0xA
0100 E030 LDI R19,0
0101 91000062 LDS R16,m
0103 91100063 LDS R17,m+1
0105 940E01DB CALL div16u
0107 E02A LDI R18,0xA
0108 E030 LDI R19,0
0109 940E01D9 CALL mod16u
010B 01F8 MOVW R30,R16
010C E584 LDI R24,0x54
010D E090 LDI R25,0
010E 0FE8 ADD R30,R24
010F 1FF9 ADC R31,R25
0110 91E4 LPM R30,0(Z)
0111 BBE8 OUT 0x18,R30
(0081) PORTA=0xfd;
0112 EF8D LDI R24,0xFD
0113 BB8B OUT 0x1B,R24
(0082) DelayUS(100);
0114 E604 LDI R16,0x64
0115 E010 LDI R17,0
0116 DF40 RCALL _DelayUS
(0083) PORTB=led_date[m/100%10];
0117 E624 LDI R18,0x64
0118 E030 LDI R19,0
0119 91000062 LDS R16,m
011B 91100063 LDS R17,m+1
011D 940E01DB CALL div16u
011F E02A LDI R18,0xA
0120 E030 LDI R19,0
0121 940E01D9 CALL mod16u
0123 01F8 MOVW R30,R16
0124 E584 LDI R24,0x54
0125 E090 LDI R25,0
0126 0FE8 ADD R30,R24
0127 1FF9 ADC R31,R25
0128 91E4 LPM R30,0(Z)
0129 BBE8 OUT 0x18,R30
(0084) PORTA=0xfb;
012A EF8B LDI R24,0xFB
012B BB8B OUT 0x1B,R24
(0085) DelayUS(100);
012C E604 LDI R16,0x64
012D E010 LDI R17,0
012E DF28 RCALL _DelayUS
(0086) PORTB=led_date[m/1000%10];
012F EE28 LDI R18,0xE8
0130 E033 LDI R19,3
0131 91000062 LDS R16,m
0133 91100063 LDS R17,m+1
0135 940E01DB CALL div16u
0137 E02A LDI R18,0xA
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -