📄 cycle_1.lst
字号:
__start:
__text_start:
0018 E5CF LDI R28,0x5F
0019 E0D2 LDI R29,2
001A BFCD OUT P3D,R28
001B BFDE OUT P3E,R29
001C 51C0 SUBI R28,0x10
001D 40D0 SBCI R29,0
001E EA0A LDI R16,0xAA
001F 8308 STD R16,0+Y
0020 2400 CLR R0
0021 E6E6 LDI R30,0x66
0022 E0F0 LDI R31,0
0023 E010 LDI R17,0
0024 36EA CPI R30,0x6A
0025 07F1 CPC R31,R17
0026 F011 BEQ 0x0029
0027 9201 ST R0,Z+
0028 CFFB RJMP 0x0024
0029 8300 STD R16,0+Z
002A E2EA LDI R30,0x2A
002B E0F0 LDI R31,0
002C E6A0 LDI R26,0x60
002D E0B0 LDI R27,0
002E E010 LDI R17,0
002F 33E0 CPI R30,0x30
0030 07F1 CPC R31,R17
0031 F021 BEQ 0x0036
0032 95C8 LPM
0033 9631 ADIW R30,1
0034 920D ST R0,X+
0035 CFF9 RJMP 0x002F
0036 D066 RCALL _main
_exit:
0037 CFFF RJMP _exit
FILE: D:\ICC-AVR\examples.sl\CYCLE\cycle_1.c
(0000) /**********************************************
(0001) http://www.sl.com.cn
(0002) 双龙电子公司----占空比测量演示程序(ICCAVR)
(0003) 作者:詹卫前
(0004) 1、学习定时器T1捕捉(捕获)中断的使用
(0005) **********************************************/
(0006) #include <io8515.h>
(0007) #include <math.h>
(0008) #pragma interrupt_handler Icp_timer1:4 // 设置ICP中断
(0009) /* 七段译码字形表 */
(0010) const unsigned char tabel[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
(0011) /* 显示缓冲区 */
(0012) unsigned char ledbuff[]={0x3f,0x3f,0x3f,0x3f,0x3f,0x3f};
(0013) unsigned int count_l;
(0014) unsigned int count_h;
(0015) /******************************
(0016) 1ms延时程序
(0017) ******************************/
(0018) void delay_1ms(void)
(0019) {
(0020) unsigned int i;
(0021) for(i=1;i<1142;i++)
_delay_1ms:
i --> R16
0038 E001 LDI R16,1
0039 E010 LDI R17,0
003A C002 RJMP 0x003D
(0022) ;
003B 5F0F SUBI R16,0xFF
003C 4F1F SBCI R17,0xFF
003D 3706 CPI R16,0x76
003E E0E4 LDI R30,4
003F 071E CPC R17,R30
0040 F3D0 BCS 0x003B
(0023) }
0041 9508 RET
_display:
i --> R20
0042 D0F0 RCALL push_gset1
(0024) /******************************
(0025) 六路动态扫描显示电路
(0026) ******************************/
(0027) void display(void)
(0028) {
(0029) unsigned char i;
(0030) for (i=0;i<6;i++)
0043 2744 CLR R20
0044 C016 RJMP 0x005B
(0031) {
(0032) PORTB=ledbuff[i];//将显示缓冲区数据送PORTB口
0045 E680 LDI R24,0x60
0046 E090 LDI R25,0
0047 2FE4 MOV R30,R20
0048 27FF CLR R31
0049 0FE8 ADD R30,R24
004A 1FF9 ADC R31,R25
004B 8020 LDD R2,0+Z
004C BA28 OUT P18,R2
(0033) PORTD=~(1<<i); //开始显示
004D E001 LDI R16,1
004E 2F14 MOV R17,R20
004F D102 RCALL lsl8
0050 2E20 MOV R2,R16
0051 9420 COM R2
0052 BA22 OUT P12,R2
(0034) delay_1ms(); //每一位显示保持一定时间
0053 DFE4 RCALL _delay_1ms
(0035) PORTD|=(1<<i); //关闭显示
0054 E001 LDI R16,1
0055 2F14 MOV R17,R20
0056 D0FB RCALL lsl8
0057 B222 IN R2,P12
0058 2A20 OR R2,R16
0059 BA22 OUT P12,R2
(0036) }
005A 9543 INC R20
005B 3046 CPI R20,6
005C F340 BCS 0x0045
(0037) }
005D D0D8 RCALL pop_gset1
005E 9508 RET
_hextobcd:
temp --> R20
i --> R22
count --> R10
005F D0ED RCALL push_gset3
0060 2EA0 MOV R10,R16
0061 2EB1 MOV R11,R17
(0038) /************************************
(0039) 将count十六进制数据转换为LED七段码
(0040) ************************************/
(0041) void hextobcd(unsigned int count)
(0042) {
(0043) unsigned char i,temp;
(0044) for (i=0;i<6;i++)
0062 2766 CLR R22
0063 C01F RJMP 0x0083
(0045) {temp=count%10;
0064 E02A LDI R18,0xA
0065 E030 LDI R19,0
0066 2D0A MOV R16,R10
0067 2D1B MOV R17,R11
0068 D0AB RCALL mod16u
0069 2F40 MOV R20,R16
006A 2F51 MOV R21,R17
(0046) ledbuff[i]=tabel[temp];
006B E18A LDI R24,0x1A
006C E090 LDI R25,0
006D 2E24 MOV R2,R20
006E 2433 CLR R3
006F 0E28 ADD R2,R24
0070 1E39 ADC R3,R25
0071 2DE2 MOV R30,R2
0072 2DF3 MOV R31,R3
0073 95C8 LPM
0074 E680 LDI R24,0x60
0075 E090 LDI R25,0
0076 2FE6 MOV R30,R22
0077 27FF CLR R31
0078 0FE8 ADD R30,R24
0079 1FF9 ADC R31,R25
007A 8200 STD R0,0+Z
(0047) count=count/10;
007B E02A LDI R18,0xA
007C E030 LDI R19,0
007D 2D0A MOV R16,R10
007E 2D1B MOV R17,R11
007F D096 RCALL div16u
0080 2EA0 MOV R10,R16
0081 2EB1 MOV R11,R17
(0048) }
0082 9563 INC R22
0083 3066 CPI R22,6
0084 F2F8 BCS 0x0064
(0049) }
0085 D0CA RCALL pop_gset3
0086 9508 RET
(0050) /******************************
(0051) MCU初始化
(0052) ******************************/
(0053) void mcu_init(void)
(0054) {
(0055) DDRD=0x3f;
_mcu_init:
0087 E38F LDI R24,0x3F
0088 BB81 OUT P11,R24
(0056) DDRB=0xff;
0089 EF8F LDI R24,0xFF
008A BB87 OUT P17,R24
(0057) PORTD=0xff;
008B BB82 OUT P12,R24
(0058) PORTB=0xff;//端口初始化
008C BB88 OUT P18,R24
(0059) TIMSK =0x08;//使能T1捕捉中断
008D E088 LDI R24,0x8
008E BF89 OUT P39,R24
(0060) TCCR1A=0x00;
008F 2422 CLR R2
0090 BC2F OUT P2F,R2
(0061) TCCR1B=0xC2;//CK/8,捕捉周期的单位为1us
0091 EC82 LDI R24,0xC2
0092 BD8E OUT P2E,R24
(0062) ICR1=0;
0093 2433 CLR R3
0094 92300045 STS R3,0x45
0096 92200044 STS R2,0x44
(0063) TCNT1=0;
0098 9230004D STS R3,0x4D
009A 9220004C STS R2,0x4C
(0064) }
009C 9508 RET
_main:
y --> Y+4
x --> Y+0
n --> R10
009D 9728 SBIW R28,0x8
(0065) /************************************************
(0066) 主程序:测量ICP引脚上信号的占空比
(0067) ************************************************/
(0068) void main()
(0069) {
(0070) unsigned char n;
(0071) unsigned long x,y;
(0072) mcu_init();
009E DFE8 RCALL _mcu_init
(0073) SREG|=0x80; //使能全局中断
009F 9478 BSET 7
(0074) for(;;)
(0075) {
(0076) x=count_h*100;
00A0 91300067 LDS R19,_count_h+1
00A2 91200066 LDS R18,_count_h
00A4 E604 LDI R16,0x64
00A5 E010 LDI R17,0
00A6 D059 RCALL mpy16s
00A7 2E20 MOV R2,R16
00A8 2E31 MOV R3,R17
00A9 2444 CLR R4
00AA 2455 CLR R5
00AB 2FEC MOV R30,R28
00AC 2FFD MOV R31,R29
00AD 8220 STD R2,0+Z
00AE 8231 STD R3,1+Z
00AF 8242 STD R4,2+Z
00B0 8253 STD R5,3+Z
(0077) y=count_l+count_h;
00B1 90300067 LDS R3,_count_h+1
00B3 90200066 LDS R2,_count_h
00B5 90500069 LDS R5,_count_l+1
00B7 90400068 LDS R4,_count_l
00B9 0C42 ADD R4,R2
00BA 1C53 ADC R5,R3
00BB 2C24 MOV R2,R4
00BC 2C35 MOV R3,R5
00BD 2444 CLR R4
00BE 2455 CLR R5
00BF 8224 STD R2,4+Z
00C0 8235 STD R3,5+Z
00C1 8246 STD R4,6+Z
00C2 8257 STD R5,7+Z
(0078) n=x/y; //计算占空比
00C3 8060 LDD R6,0+Z
00C4 8071 LDD R7,1+Z
00C5 8082 LDD R8,2+Z
00C6 8093 LDD R9,3+Z
00C7 925A ST R5,-Y
00C8 924A ST R4,-Y
00C9 923A ST R3,-Y
00CA 922A ST R2,-Y
00CB 2D06 MOV R16,R6
00CC 2D17 MOV R17,R7
00CD 2D28 MOV R18,R8
00CE 2D39 MOV R19,R9
00CF D0C9 RCALL div32u
00D0 2EA0 MOV R10,R16
(0079) hextobcd(n);
00D1 2711 CLR R17
00D2 DF8C RCALL _hextobcd
(0080) display(); //显示测量值
00D3 DF6E RCALL _display
(0081) }
00D4 CFCB RJMP 0x00A0
00D5 9628 ADIW R28,0x8
00D6 9508 RET
_Icp_timer1:
00D7 922A ST R2,-Y
00D8 923A ST R3,-Y
00D9 938A ST R24,-Y
00DA B62F IN R2,P3F
00DB 922A ST R2,-Y
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -