⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.lss

📁 AVR红外遥控
💻 LSS
📖 第 1 页 / 共 5 页
字号:
 652:	a0 1f       	adc	r26, r16
 654:	b1 1f       	adc	r27, r17
 656:	80 93 28 01 	sts	0x0128, r24
 65a:	90 93 29 01 	sts	0x0129, r25
 65e:	a0 93 2a 01 	sts	0x012A, r26
 662:	b0 93 2b 01 	sts	0x012B, r27
  // 测试计算结果
  // htobcd8(&bcd_buf[5], disbuf.w);

  
  // 累计1小时的功
  if (++disbuf.cnt_3600 > 3600) { // 1小时到,计算 MW*H 总和
 666:	80 91 2c 01 	lds	r24, 0x012C
 66a:	90 91 2d 01 	lds	r25, 0x012D
 66e:	01 96       	adiw	r24, 0x01	; 1
 670:	90 93 2d 01 	sts	0x012D, r25
 674:	80 93 2c 01 	sts	0x012C, r24
 678:	81 51       	subi	r24, 0x11	; 17
 67a:	9e 40       	sbci	r25, 0x0E	; 14
 67c:	b0 f0       	brcs	.+44     	; 0x6aa <proc_calculate+0xfa>

    disbuf.cnt_3600 = 0;          // 计数复位
 67e:	10 92 2d 01 	sts	0x012D, r1
 682:	10 92 2c 01 	sts	0x012C, r1
    
    proflag |= _BV(PRO_SAVE);     // 启动保存进程
 686:	90 91 01 01 	lds	r25, 0x0101
 68a:	92 60       	ori	r25, 0x02	; 2
 68c:	90 93 01 01 	sts	0x0101, r25
    
  }

  // 累计持续按键时间
  if ((proflag & _BV(PRO_KEEP_KEY)) != 0) {
 690:	94 ff       	sbrs	r25, 4
 692:	07 c0       	rjmp	.+14     	; 0x6a2 <proc_calculate+0xf2>
    if (--disbuf.cnt_down == 0) {
 694:	80 91 2e 01 	lds	r24, 0x012E
 698:	81 50       	subi	r24, 0x01	; 1
 69a:	80 93 2e 01 	sts	0x012E, r24
 69e:	88 23       	and	r24, r24
 6a0:	39 f0       	breq	.+14     	; 0x6b0 <proc_calculate+0x100>
      disbuf.cnt_down = 30;
      disbuf.w = 0;
      SUM_W = 0;
      proflag |= _BV(PRO_SAVE);
    }
  }
  
  proflag |= _BV(PRO_DISPLAY);  // 启动显示进程
 6a2:	94 60       	ori	r25, 0x04	; 4
 6a4:	90 93 01 01 	sts	0x0101, r25
 6a8:	1c c0       	rjmp	.+56     	; 0x6e2 <proc_calculate+0x132>
 6aa:	90 91 01 01 	lds	r25, 0x0101
 6ae:	f0 cf       	rjmp	.-32     	; 0x690 <proc_calculate+0xe0>
 6b0:	8e e1       	ldi	r24, 0x1E	; 30
 6b2:	80 93 2e 01 	sts	0x012E, r24
 6b6:	10 92 28 01 	sts	0x0128, r1
 6ba:	10 92 29 01 	sts	0x0129, r1
 6be:	10 92 2a 01 	sts	0x012A, r1
 6c2:	10 92 2b 01 	sts	0x012B, r1
 6c6:	10 92 31 01 	sts	0x0131, r1
 6ca:	10 92 32 01 	sts	0x0132, r1
 6ce:	10 92 33 01 	sts	0x0133, r1
 6d2:	10 92 34 01 	sts	0x0134, r1
 6d6:	92 60       	ori	r25, 0x02	; 2
 6d8:	90 93 01 01 	sts	0x0101, r25
 6dc:	94 60       	ori	r25, 0x04	; 4
 6de:	90 93 01 01 	sts	0x0101, r25
 6e2:	1f 91       	pop	r17
 6e4:	0f 91       	pop	r16
 6e6:	ff 90       	pop	r15
 6e8:	ef 90       	pop	r14
 6ea:	08 95       	ret

000006ec <proc_test_sample>:
  
  return;
  
}


// ===========================================================================
void proc_save(void) {
  struct EEPROM readsave;
  u32_t tmp32;
  u16_t tmp16;
  u8_t tmp8;
  
  if ((proflag & _BV(PRO_SAVE)) == 0) {
    return;
  }  
  
  cli();
  
  tmp32 = disbuf.w + 1800;   // 四舍五入;保证不至于永远丢“功”显示不出来的0.01~0.09
  tmp32 /= 3600;             // 由于显示电流小数点1位,电压小数点1位,功小数点1位,所以要再除10
  SUM_W += tmp32;             // 累加给总计
  
  if (SUM_W > 99999999) {     // “功”累计超过8位BCD码,就循环....
    SUM_W -= 100000000;
  }
    
  disbuf.w = 0;               // 清除1小时的记录(因为已经累加给总记录了)
  disbuf.cnt_3600 = 0;        // 计数复位

  
  save.chksum = 0;
  save.chksum = checksum(&save.sumw[0], 5); // 计算校验码
  
  for (tmp16 = save.index; tmp16 < 511; tmp16 += 5) { // ATMEGA8 的 EEPROM = 512
    // 3次读写失败就换块
    for (tmp8 = 0; tmp8 < 3; tmp8++) {
      eeprom_busy_wait();
      eeprom_write_block(&save.sumw[0], (u8_t *)save.index, 5);     // 写块数据
      eeprom_busy_wait();
      eeprom_read_block(&readsave.sumw[0], (u8_t *)save.index, 5);  // 读刚写的块
      if (checksum(&readsave.sumw[0], 5) == 0) {  // 校验成功,写入正确
        goto fin_save;
      }
    }
  
    if (tmp8 == 3) {    // 已经进行过3次操作并失败,换块!
      save.index += 5;  // 偏移 5 byte
      eeprom_busy_wait();
      eeprom_write_word((u16_t *)0, save.index);  // 更新 index

    }
  
  }
  
  // 所有块都写坏,报废!显示 "EEEEEEEE"
  for (tmp8 = 5; tmp8 < 13; tmp8++) {
    bcd_buf[tmp8] = 0x0e; // "E"
  }
  sei();
  while (1);    // 永远的停在这里!


fin_save: // 保存完成
  
  eeprom_busy_wait();
  sei();
  proflag &= ~_BV(PRO_SAVE);  // 清除该进程标志
  
  
  
  return;
}


// ===========================================================================
void proc_key(void) {
  u8_t tmp8;
  
  if (read_key() == 0) { // 无键按下
    proflag &= ~_BV(PRO_ONE_KEY);   // 清除单次按键标志
    proflag &= ~_BV(PRO_KEEP_KEY);  // 清除持续按键标志
    disbuf.cnt_down = 30;           // 复位持续按键倒计数
    return; // 退出
  }

  
  // 检查是否持续按键
  if ((proflag & _BV(PRO_ONE_KEY)) != 0x00) { // 以前按过键,状态为连续按键状态
     proflag |= _BV(PRO_KEEP_KEY);
     return;
      
  }
  

  // 不是持续按键,是单次按键
  // 抖动检测
  tmp8 = cnt_t2;
  while (((cnt_t2 - tmp8) < 3) && (read_key() == 1));    // 150mS去抖动等待
  if (read_key() == 1) { //有效单次按键
     
    proflag |= _BV(PRO_ONE_KEY);         // 设置单次按键标志
      
    // 切换显示类型
    if (++key_type == 3) {
      key_type = 0;
    }
      
    proflag |= _BV(PRO_DISPLAY);    // 启动显示切换进程

  }
  else {
    proflag &= ~_BV(PRO_ONE_KEY);   // 清除单次按键标志
    proflag &= ~_BV(PRO_KEEP_KEY);  // 清除持续按键标志
    disbuf.cnt_down = 30;           // 复位持续按键倒计数
  }
    
  return;
  
}


// ===========================================================================
void proc_display(void) {
  
  u32_t tmp1, tmp2;
  
  // 是否起用本进程?
  if ((proflag & _BV(PRO_DISPLAY)) == 0) {
    return;
  }
  
  // 显示‘功’W
  tmp1 = disbuf.w + 1800;  // 四舍五入;保证不至于永远丢“功”显示不出来的0.01~0.09
  tmp1 /= 3600;            // 由于显示电流小数点1位,电压小数点1位,功小数点1位,所以要再除10
  tmp2 = SUM_W;
  tmp2 += tmp1;
  
  if (tmp2 > 99999999) {    // “功”累计超过8位BCD码,就循环....
    tmp2 -= 100000000;
  }
  
  htobcd8(&bcd_buf[5], tmp2);      // 刷新显示缓冲区
  bcd_buf[11] |= 0x80;             // 小数点位置 
  
  // 倒计时显示
  if ((proflag & _BV(PRO_KEEP_KEY)) != 0) { // 倒计时清除"FFF30".."FFF29"...
    htobcd5(&bcd_buf[0], disbuf.cnt_down);
    bcd_buf[0] = 0x0f; // "F"
    bcd_buf[1] = 0x0f; // "F"
    bcd_buf[2] = 0x0f; // "F"
    
    goto fin_display;
  }
  
  // V/I/P显示
  switch (key_type)
  {
    case KEY_TYPE_U:
      htobcd5(&bcd_buf[0], disbuf.u); // 显示数
      bcd_buf[3] |= 0x80;             // 小数点位置
      LED14_ON;
      LED15_OFF;  
      LED16_OFF;
      break;
    case KEY_TYPE_I:
      htobcd5(&bcd_buf[0], disbuf.u); // 显示数
      bcd_buf[3] |= 0x80;             // 小数点位置
      LED14_OFF;
      LED15_ON;
      LED16_OFF;
      break;
    case KEY_TYPE_P:
      htobcd5(&bcd_buf[0], disbuf.u); // 显示数
      bcd_buf[3] |= 0x80;             // 小数点位置
      LED14_OFF;
      LED15_OFF;
      LED16_ON;
      break;
  }

fin_display:      
  proflag &= ~_BV(PRO_DISPLAY);
  
  return;
}




// ===========================================================================
void proc_test_sample(void) {
 6ec:	80 91 07 01 	lds	r24, 0x0107
 6f0:	81 ff       	sbrs	r24, 1
 6f2:	08 95       	ret

  if ((flag0 & _BV(FLAG0_T1)) != 0) {

    htobcd5(&bcd_buf[0], (u32_t)sample_i);
 6f4:	40 91 02 01 	lds	r20, 0x0102
 6f8:	50 91 03 01 	lds	r21, 0x0103
 6fc:	66 27       	eor	r22, r22
 6fe:	77 27       	eor	r23, r23
 700:	8f e0       	ldi	r24, 0x0F	; 15
 702:	91 e0       	ldi	r25, 0x01	; 1
 704:	e2 de       	rcall	.-572    	; 0x4ca <htobcd5>
    htobcd8(&bcd_buf[5], (u32_t)sample_v);
 706:	40 91 0c 01 	lds	r20, 0x010C
 70a:	50 91 0d 01 	lds	r21, 0x010D
 70e:	66 27       	eor	r22, r22
 710:	77 27       	eor	r23, r23
 712:	84 e1       	ldi	r24, 0x14	; 20
 714:	91 e0       	ldi	r25, 0x01	; 1
 716:	51 de       	rcall	.-862    	; 0x3ba <htobcd8>
    
    flag0 &= ~_BV(FLAG0_T1);
 718:	80 91 07 01 	lds	r24, 0x0107
 71c:	8d 7f       	andi	r24, 0xFD	; 253
 71e:	80 93 07 01 	sts	0x0107, r24
 722:	08 95       	ret

00000724 <proc_display>:
 724:	ef 92       	push	r14
 726:	ff 92       	push	r15
 728:	0f 93       	push	r16
 72a:	1f 93       	push	r17
 72c:	80 91 01 01 	lds	r24, 0x0101
 730:	82 ff       	sbrs	r24, 2
 732:	9b c0       	rjmp	.+310    	; 0x86a <proc_display+0x146>
 734:	60 91 28 01 	lds	r22, 0x0128
 738:	70 91 29 01 	lds	r23, 0x0129
 73c:	80 91 2a 01 	lds	r24, 0x012A
 740:	90 91 2b 01 	lds	r25, 0x012B
 744:	68 5f       	subi	r22, 0xF8	; 248
 746:	78 4f       	sbci	r23, 0xF8	; 248
 748:	8f 4f       	sbci	r24, 0xFF	; 255
 74a:	9f 4f       	sbci	r25, 0xFF	; 255
 74c:	e0 90 31 01 	lds	r14, 0x0131
 750:	f0 90 32 01 	lds	r15, 0x0132
 754:	00 91 33 01 	lds	r16, 0x0133
 758:	10 91 34 01 	lds	r17, 0x0134
 75c:	20 e1       	ldi	r18, 0x10	; 16
 75e:	3e e0       	ldi	r19, 0x0E	; 14
 760:	40 e0       	ldi	r20, 0x00	; 0
 762:	50 e0       	ldi	r21, 0x00	; 0
 764:	9d d2       	rcall	.+1338   	; 0xca0 <__udivmodsi4>
 766:	2e 0d       	add	r18, r14
 768:	3f 1d       	adc	r19, r15
 76a:	40 1f       	adc	r20, r16
 76c:	51 1f       	adc	r21, r17
 76e:	20 30       	cpi	r18, 0x00	; 0
 770:	81 ee       	ldi	r24, 0xE1	; 225
 772:	38 07       	cpc	r19, r24
 774:	85 ef       	ldi	r24, 0xF5	; 245
 776:	48 07       	cpc	r20, r24
 778:	85 e0       	ldi	r24, 0x05	; 5
 77a:	58 07       	cpc	r21, r24
 77c:	70 f5       	brcc	.+92     	; 0x7da <proc_display+0xb6>
 77e:	ba 01       	movw	r22, r20
 780:	a9 01       	movw	r20, r18
 782:	84 e1       	ldi	r24, 0x14	; 20
 784:	91 e0       	ldi	r25, 0x01	; 1
 786:	19 de       	rcall	.-974    	; 0x3ba <htobcd8>
 788:	80 91 1a 01 	lds	r24, 0x011A
 78c:	80 68       	ori	r24, 0x80	; 128
 78e:	80 93 1a 01 	sts	0x011A, r24
 792:	80 91 01 01 	lds	r24, 0x0101
 796:	84 fd       	sbrc	r24, 4
 798:	25 c0       	rjmp	.+74     	; 0x7e4 <proc_display+0xc0>
 79a:	90 91 00 01 	lds	r25, 0x0100
 79e:	91 30       	cpi	r25, 0x01	; 1
 7a0:	09 f4       	brne	.+2      	; 0x7a4 <proc_display+0x80>
 7a2:	4d c0       	rjmp	.+154    	; 0x83e <proc_display+0x11a>
 7a4:	91 30       	cpi	r25, 0x01	; 1
 7a6:	98 f5       	brcc	.+102    	; 0x80e <proc_display+0xea>
 7a8:	40 91 1c 01 	lds	r20, 0x011C
 7ac:	50 91 1d 01 	lds	r21, 0x011D
 7b0:	60 91 1e 01 	lds	r22, 0x011E
 7b4:	70 91 1f 01 	lds	r23, 0x011F
 7b8:	8f e0       	ldi	r24, 0x0F	; 15
 7ba:	91 e0       	ldi	r25, 0x01	; 1
 7bc:	86 de       	rcall	.-756    	; 0x4ca <htobcd5>
 7be:	80 91 12 01 	lds	r24, 0x0112
 7c2:	80 68       	ori	r24, 0x80	; 128
 7c4:	80 93 12 01 	sts	0x0112, r24
 7c8:	45 98       	cbi	0x08, 5	; 8
 7ca:	44 9a       	sbi	0x08, 4	; 8
 7cc:	5d 9a       	sbi	0x0b, 5	; 11
 7ce:	80 91 01 01 	lds	r24, 0x0101
 7d2:	8b 7f       	andi	r24, 0xFB	; 251
 7d4:	80 93 01 01 	sts	0x0101, r24
 7d8:	48 c0       	rjmp	.+144    	; 0x86a <proc_display+0x146>
 7da:	20 50       	subi	r18, 0x00	; 0
 7dc:	31 4e       	sbci	r19, 0xE1	; 225
 7de:	45 4f       	sbci	r20, 0xF5	; 245
 7e0:	55 40       	sbci	r21, 0x05	; 5
 7e2:	cd cf       	rjmp	.-102    	; 0x77e <proc_display+0x5a>
 7e4:	40 91 2e 01 	lds	r20, 0x012E
 7e8:	55 27       	eor	r21, r21
 7ea:	66 27       	eor	r22, r22
 7ec:	77 27       	eor	r23, r23
 7ee:	8f e0       	ldi	r24, 0x0F	; 15
 7f0:	91 e0       	ldi	r25, 0x01	; 1
 7f2:	6b de       	rcall	.-810    	; 0x4ca <htobcd5>
 7f4:	8f e0       	ldi	r24, 0x0F	; 15
 7f6:	80 93 0f 01 	sts	0x010F, r24
 7fa:	80 93 10 01 	sts	0x0110, r24
 7fe:	80 93 11 01 	sts	0x0111, r24
 802:	80 91 01 01 	lds	r24, 0x0101
 806:	8b 7f       	andi	r24, 0xFB	; 251
 808:	80 93 01 01 	sts	0x0101, r24
 80c:	2e c0       	rjmp	.+92     	; 0x86a <proc_display+0x146>
 80e:	92 30       	cpi	r25, 0x02	; 2
 810:	d1 f7       	brne	.-12     	; 0x806 <proc_display+0xe2>
 812:	40 91 1c 01 	lds	r20, 0x011C
 816:	50 91 1d 01 	lds	r21, 0x011D
 81a:	60 91 1e 01 	lds	r22, 0x011E
 81e:	70 91 1f 01 	lds	r23, 0x011F
 822:	8f e0       	ldi	r24, 0x0F	; 15
 824:	91 e0       	ldi	r25, 0x01	; 1
 826:	51 de       	rcall	.-862    	; 0x4ca <htobcd5>
 828:	80 91 12 01 	lds	r24, 0x0112
 82c:	80 68       	ori	r24, 0x80	; 128
 82e:	80 93 12 01 	sts	0x0112, r24
 832:	45 9a       	sbi	0x08, 5	; 8
 834:	44 9a       	sbi	0x08, 4	; 8
 836:	5d 98       	cbi	0x0b, 5	; 11
 838:	80 91 01 01 	lds	r24, 0x0101
 83c:	e4 cf       	rjmp	.-56     	; 0x806 <proc_display+0xe2>
 83e:	40 91 1c 01 	lds	r20, 0x011C
 842:	50 91 1d 01 	lds	r21, 0x011D
 846:	60 91 1e 01 	lds	r22, 0x011E

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -