📄 m64.lst
字号:
(0288) /*void timer1_init(void)
(0289) {
(0290) TCCR1B = 0x00; //stop
(0291) TCNT1H = 0xFF; //setup
(0292) TCNT1L = 0x01;
(0293) OCR1AH = 0x00;
(0294) OCR1AL = 0x0f;
(0295) OCR1BH = 0x00;
(0296) OCR1BL = 0x0f;
(0297) OCR1CH = 0x00;
(0298) OCR1CL = 0x0f;
(0299) ICR1H = 0x00;
(0300) ICR1L = 0xFF;
(0301) TCCR1A = 0xA9;
(0302) TCCR1B = 0x0B; //start Timer
(0303) }*/
(0304) //TIMER1 initialize - prescale:8
(0305) // WGM: 9) PWM phz freq correct, TOP=OCRnA
(0306) // desired value: 40mSec
(0307) // actual value: 40.000mSec (0.0%)
(0308) /*void timer1_init(void)
(0309) {
(0310) TCCR1B = 0x00; //stop
(0311) TCNT1H = 0xB1; //setup
(0312) TCNT1L = 0xE0;
(0313) OCR1AH = 0x4E;
(0314) OCR1AL = 0x20;
(0315) OCR1BH = 0x4E;
(0316) OCR1BL = 0x20;
(0317) OCR1CH = 0x4E;
(0318) OCR1CL = 0x20;
(0319) ICR1H = 0x4E;
(0320) ICR1L = 0x20;
(0321) TCCR1A = 0x01;
(0322) TCCR1B = 0x12; //start Timer
(0323) }*/
(0324) //TIMER1 initialize - prescale:256
(0325) // WGM: 7) PWM 10bit fast, TOP=0x03FF
(0326) // desired value: 40mSec
(0327) // actual value: 32.768mSec (18.1%)
(0328) void timer1_init(void)
(0329) {
(0330) TCCR1B = 0x00; //stop
_timer1_init:
4EC 2422 CLR R2
4ED BC2E OUT 0x2E,R2
(0331) TCNT1H = 0xFC; //setup
4EE EF8C LDI R24,0xFC
4EF BD8D OUT 0x2D,R24
(0332) TCNT1L = 0x01;
4F0 E081 LDI R24,1
4F1 BD8C OUT 0x2C,R24
(0333) OCR1AH = 0x03;
4F2 E083 LDI R24,3
4F3 BD8B OUT 0x2B,R24
(0334) OCR1AL = 0xFF;
4F4 EF8F LDI R24,0xFF
4F5 BD8A OUT 0x2A,R24
(0335) OCR1BH = 0x03;
4F6 E083 LDI R24,3
4F7 BD89 OUT 0x29,R24
(0336) OCR1BL = 0xFF;
4F8 EF8F LDI R24,0xFF
4F9 BD88 OUT 0x28,R24
(0337) OCR1CH = 0x03;
4FA E083 LDI R24,3
4FB 9380 0079 STS 0x0079,R24
(0338) OCR1CL = 0xFF;
4FD EF8F LDI R24,0xFF
4FE 9380 0078 STS 0x0078,R24
(0339) ICR1H = 0x03;
500 E083 LDI R24,3
501 BD87 OUT 0x27,R24
(0340) ICR1L = 0xFF;
502 EF8F LDI R24,0xFF
503 BD86 OUT 0x26,R24
(0341) TCCR1A = 0xAB;
504 EA8B LDI R24,0xAB
505 BD8F OUT 0x2F,R24
(0342) TCCR1B = 0x0C; //start Timer
506 E08C LDI R24,0xC
507 BD8E OUT 0x2E,R24
508 9508 RET
_timer1_capt_isr:
509 922A ST R2,-Y
50A 923A ST R3,-Y
50B 938A ST R24,-Y
50C B62F IN R2,0x3F
50D 922A ST R2,-Y
(0343) }
(0344)
(0345) #pragma interrupt_handler timer1_capt_isr:iv_TIM1_CAPT
(0346)
(0347) void timer1_capt_isr(void)
(0348) //ICP输入捕获中断处理程序
(0349) //SIGNAL(SIG_INPUT_CAPTURE1)
(0350) { //PORTF=~PORTF;
(0351)
(0352) if(shang_johu)
50E 9020 012D LDS R2,shang_johu
510 2022 TST R2
511 F069 BEQ 0x051F
(0353) {
(0354) //ICR1=0;;
(0355) temp1 = ICR1;
512 B426 IN R2,0x26
513 B437 IN R3,0x27
514 9230 0129 STS temp1+1,R3
516 9220 0128 STS temp1,R2
(0356) //TCCR1B |= (1<<ICNC1)|(1<<CS11);//8分频,8M时钟时正好1us
(0357) TCCR1B &= ~(1<<ICES1);
518 B58E IN R24,0x2E
519 7B8F ANDI R24,0xBF
51A BD8E OUT 0x2E,R24
(0358) shang_johu=0;
51B 2422 CLR R2
51C 9220 012D STS shang_johu,R2
(0359)
(0360) }
51E C00F RJMP 0x052E
(0361) else
(0362) {
(0363) temp2 = ICR1;
51F B426 IN R2,0x26
520 B437 IN R3,0x27
521 9230 012B STS temp2+1,R3
523 9220 012A STS temp2,R2
(0364) //TIMSK &= ~((1<<TICIE1)|(1<<TOIE1));//关闭中断使能
(0365) //TCCR1B &= ~((1<<CS12)|(1<<CS11)|(1<<CS10));
(0366) //TCNT1 = 0;
(0367)
(0368)
(0369) //temp2 -= temp1;
(0370)
(0371) //TCCR1B=0x00;
(0372) TCCR1B |= (1<<ICES1);
525 B58E IN R24,0x2E
526 6480 ORI R24,0x40
527 BD8E OUT 0x2E,R24
(0373) count1=0;
528 2422 CLR R2
529 9220 012C STS count1,R2
(0374) shang_johu=1;
52B E081 LDI R24,1
52C 9380 012D STS shang_johu,R24
(0375) }
52E 9029 LD R2,Y+
52F BE2F OUT 0x3F,R2
530 9189 LD R24,Y+
531 9039 LD R3,Y+
532 9029 LD R2,Y+
533 9518 RETI
_main:
n --> Y,+2
i --> R12
n_juli --> R10
n_jiaodu --> R10
n_sec --> R10
pwm_duoji --> R10
534 9721 SBIW R28,1
(0376) //shang_johu=!shang_johu;
(0377) /*
(0378) count1++;
(0379) switch(count1)
(0380) {
(0381) case 2://第一次捕获,则开始计数
(0382) {
(0383) ICR1=0;
(0384) temp1 = ICR1;
(0385)
(0386) TCCR1B |= (1<<ICNC1)|(1<<CS11);//8分频,8M时钟时正好1us
(0387) TCCR1B &= ~(1<<ICES1);
(0388)
(0389) }
(0390) break;
(0391) case 3: //第二次捕获,表示一个周期结束,计数结束
(0392) {
(0393) temp2 = ICR1;
(0394) TIMSK &= ~((1<<TICIE1)|(1<<TOIE1));//关闭中断使能
(0395) //TCCR1B &= ~((1<<CS12)|(1<<CS11)|(1<<CS10));
(0396) //TCNT1 = 0;
(0397)
(0398)
(0399) //temp2 -= temp1;
(0400)
(0401) TCCR1B=0x00;
(0402) TCCR1B |= (1<<ICES1);
(0403) count1=0;
(0404) }
(0405) break;
(0406)
(0407) default: ;
(0408) }
(0409) */
(0410) }
(0411)
(0412)
(0413) #define PWM_ON DDRB|= R_pwm0 | R_pwm1 | L_pwm0 | L_pwm1;
(0414) #define PWM_OFF DDRB&= ~(R_pwm0 | R_pwm1 | L_pwm0 | L_pwm1);
(0415) main()
(0416) {int n;
(0417) unsigned char n_jiaodu=0,n_juli=0;
535 24AA CLR R10
(0418) unsigned char n_sec=0;
(0419) unsigned int pwm_duoji=0;
536 24BB CLR R11
(0420)
(0421)
(0422) unsigned char i=0;
537 24CC CLR R12
(0423) init_devices();
538 DC7D RCALL _init_devices
(0424) timer1_init();timer0_init();
539 DFB2 RCALL _timer1_init
53A DFA7 RCALL _timer0_init
(0425) //OCR1AH = 0x00;
(0426) /* OCR1AL = 64;
(0427) //OCR1BH = 0x00;
(0428) OCR1BL = 64;
(0429) //OCR1CH = 0x00;
(0430) OCR1CL = 64;
(0431) OCR0=64;*/
(0432)
(0433)
(0434) //while(1);
(0435) DDRE|=0x38;//while(1);
53B B182 IN R24,0x02
53C 6388 ORI R24,0x38
53D B982 OUT 0x02,R24
(0436) /////////LCD
(0437) /* DDRB = 0xBF; //SI输入,SO,SCK,SS输出
(0438) SPCR = 0x50; //setup SPI
(0439) SPSR = 0x01; //setup SPI*/
(0440) /*while(!(UCSR0A&(1<<UDRE0)));
(0441) UDR0='a';while(!(UCSR0A&(1<<UDRE0)));
(0442) UDR0='a';while(!(UCSR0A&(1<<UDRE0)));
(0443) UDR0='a';while(!(UCSR0A&(1<<UDRE0)));
(0444) UDR0='a';*/
(0445) delay_ms(3000);
53E EB08 LDI R16,0xB8
53F E01B LDI R17,0xB
540 940E 0759 CALL _delay_ms
(0446) number_uart1(1010,1);
542 E081 LDI R24,1
543 8388 STD Y+0,R24
544 EF02 LDI R16,0xF2
545 E013 LDI R17,3
546 E020 LDI R18,0
547 E030 LDI R19,0
548 DE82 RCALL _number_uart1
(0447) number_uart1(xx,0);
549 2422 CLR R2
54A 8228 STD Y+0,R2
54B 9120 0108 LDS R18,xx+2
54D 9130 0109 LDS R19,xx+3
54F 9100 0106 LDS R16,xx
551 9110 0107 LDS R17,xx+1
553 DE77 RCALL _number_uart1
(0448) number_uart1(ADCjohu,1);
554 E081 LDI R24,1
555 8388 STD Y+0,R24
556 9120 0102 LDS R18,ADCjohu+2
558 9130 0103 LDS R19,ADCjohu+3
55A 9100 0100 LDS R16,ADCjohu
55C 9110 0101 LDS R17,ADCjohu+1
55E DE6C RCALL _number_uart1
(0449) delay_ms(3000);
55F EB08 LDI R16,0xB8
560 E01B LDI R17,0xB
561 940E 0759 CALL _delay_ms
(0450) xx=0;
563 E040 LDI R20,0
564 E050 LDI R21,0
565 E060 LDI R22,0
566 E070 LDI R23,0
567 9350 0107 STS xx+1,R21
569 9340 0106 STS xx,R20
56B 9370 0109 STS xx+3,R23
56D 9360 0108 STS xx+2,R22
(0451) //LCD_Init();
(0452) //LCD_clear();
(0453)
(0454) DDRE &= ~0x7c;//if (!(PORTE & STOP)) if (!(PORTE & VOLDOWN)) if (!(PORTE & VOLUP)) if (!(PORTE & NEXTSONG)) if (!(PORTE & PREVSONG))
56F B182 IN R24,0x02
570 7883 ANDI R24,0x83
571 B982 OUT 0x02,R24
(0455) PORTE |=0x7c;
572 B183 IN R24,0x03
573 678C ORI R24,0x7C
574 B983 OUT 0x03,R24
(0456)
(0457) PORTD=0x01;
575 E081 LDI R24,1
576 BB82 OUT 0x12,R24
(0458) //number(0,0,4,-999,1);
(0459) /* OCR1AL = pwm_pingjun;
(0460) OCR1BL = pwm_pingjun;
(0461) OCR1CL = pwm_pingjun;
(0462) OCR0=pwm_pingjun;*/
(0463)
(0464) PORTD &= ~(1<<PD4);
577 9894 CBI 0x12,4
(0465) DDRD &= ~(1<<PD4);
578 988C CBI 0x11,4
(0466) //初始化TC1
(0467) /* TCCR1A = 0x00;
(0468) TCNT1 = 0x00;
(0469) TCCR1B |= (1<<ICES1);//(1<<ICNC1)|打开输入捕捉噪声抑制器 |上升沿触发捕捉,噪声捕捉器需打开,否则会导致上升沿/下降沿捕捉不准确,出来的结果会相差一半
(0470) TCCR1B |= (1<<CS11);//8分频,8M时钟时正好1us
(0471) SEI();
(0472) TCCR1B &= ~((1<<CS12)|(1<<CS11)|(1<<CS10));*/
(0473)
(0474) TCCR1B = 0x00;//停止定时器
579 2422 CLR R2
57A BC2E OUT 0x2E,R2
(0475) TIMSK |= 0x20;//中断允许
57B B787 IN R24,0x37
57C 6280 ORI R24,0x20
57D BF87 OUT 0x37,R24
(0476) ICR1H = 0xFF;
57E EF8F LDI R24,0xFF
57F BD87 OUT 0x27,R24
(0477) ICR1L = 0xFF;//输入捕捉匹配值
580 BD86 OUT 0x26,R24
(0478) TCCR1A = 0x00;
581 BC2F OUT 0x2F,R2
(0479) TCCR1B = 0x83;//启动定时器
582 E883 LDI R24,0x83
583 BD8E OUT 0x2E,R24
(0480) TCCR1B |= (1<<ICES1)|(1<<ICNC1)|(1<<CS11);//|(1<<CS10)8分频,8M时钟时正好1us
584 B58E IN R24,0x2E
585 6C82 ORI R24,0xC2
586 BD8E OUT 0x2E,R24
(0481) TCCR1B |= (1<<ICES1);
587 B58E IN R24,0x2E
588 6480 ORI R24,0x40
589 BD8E OUT 0x2E,R24
58A C031 RJMP 0x05BC
(0482) //方法一:采用直接测频率的方法,PROTEUS仿真通过
(0483) /*while(1)
(0484) {
(0485) for(i=0; i<50; i++)delay_ms(10);
(0486) TCNT1 =0;
(0487) TCCR1B = ((1<<CS12)|(1<<CS11)|(1<<CS10));
(0488) for(i=0; i<100; i++)delay_ms(10);//此处用简单的延时函数,精度有限,更高精度可以用timer来尝试
(0489) TCCR1B &= ~((1<<CS12)|(1<<CS11)|(1<<CS10));
(0490) //printf("TCNT1=%8u 频率=%8uHz\r\n", TCNT1, TCNT1);
(0491) number_uart1(TCNT1,0);
(0492) number_uart1(TCNT1,1);
(0493)
(0494) }*/
(0495)
(0496) //方法二:采用测量周期的方法
(0497) while(1)
(0498) {
(0499) count1=1;
58B E081 LDI R24,1
58C 9380 012C STS count1,R24
(0500) //for(i=0; i<250; i++)
(0501) delay_ms(2);
58E E002 LDI R16,2
58F E010 LDI R17,0
590 940E 0759 CALL _delay_ms
(0502) TIMSK |= (1<<TICIE1);//打开输入捕捉器中断使能
592 B787 IN R24,0x37
593 6280 ORI R24,0x20
594 BF87 OUT 0x37,R24
(0503)
(0504) while(count1);//count1循环,等待捕获中断处理完成,
595 9020 012C LDS R2,count1
597 2022 TST R2
598 F7E1 BNE 0x0595
(0505) //printf("temp1:%6u temp2:%6u width:%6lu\r\n", temp1, temp2, (temp2>=temp1)?(temp2-temp1):(65536-temp1+temp2));
(0506) number_uart1(temp1,0);
599 2422 CLR R2
59A 8228 STD Y+0,R2
59B 9100 0128 LDS R16,temp1
59D 9110 0129 LDS R17,temp1+1
59F 2722 CLR R18
5A0 2733 CLR R19
5A1 DE29 RCALL _number_uart1
(0507) number_uart1(temp2,0);
5A2 2422 CLR R2
5A3 8228 STD Y+0,R2
5A4 9100 012A LDS R16,temp2
5A6 9110 012B LDS R17,temp2+1
5A8 2722 CLR R18
5A9 2733 CLR R19
5AA DE20 RCALL _number_uart1
(0508)
(0509) //if (temp2>temp1)
(0510) // { pwm_duoji=(temp2-temp1); number_uart1(pwm_duoji ,1 );}
(0511) //else
(0512) { pwm_duoji=(temp1-temp2); number_uart1(pwm_duoji ,1 );}
5AB 9020 012A LDS R2,temp2
5AD 9030 012B LDS R3,temp2+1
5AF 90A0 0128 LDS R10,temp1
5B1 90B0 0129 LDS R11,temp1+1
5B3 18A2 SUB R10,R2
5B4 08B3 SBC R11,R3
5B5 E081 LDI R24,1
5B6 8388 STD Y+0,R24
5B7 0185 MOVW R16,R10
5B8 0196 MOVW R18,R12
5B9 2722 CLR R18
5BA 2733 CLR R19
5BB DE0F RCALL _number_uart1
5BC CFCE RJMP 0x058B
(0513)
(0514)
(0515) }
(0516)
(0517) while(1)
(0518) {
(0519) if (!(PINE & NEXTSONG))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -