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

📄 main.lss

📁 AVR红外遥控
💻 LSS
📖 第 1 页 / 共 5 页
字号:

  // 计算累加1小时内的功 (按秒计算)
  disbuf.w += tmp3;
 64e:	80 91 28 01 	lds	r24, 0x0128
 652:	90 91 29 01 	lds	r25, 0x0129
 656:	a0 91 2a 01 	lds	r26, 0x012A
 65a:	b0 91 2b 01 	lds	r27, 0x012B
 65e:	82 0f       	add	r24, r18
 660:	93 1f       	adc	r25, r19
 662:	a4 1f       	adc	r26, r20
 664:	b5 1f       	adc	r27, r21
 666:	80 93 28 01 	sts	0x0128, r24
 66a:	90 93 29 01 	sts	0x0129, r25
 66e:	a0 93 2a 01 	sts	0x012A, r26
 672:	b0 93 2b 01 	sts	0x012B, r27
  // 测试计算结果
  // htobcd8(&bcd_buf[5], disbuf.w);

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

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

  // 累计持续按键时间
  if ((proflag & _BV(PRO_KEEP_KEY)) != 0) {
 6a0:	94 ff       	sbrs	r25, 4
 6a2:	07 c0       	rjmp	.+14     	; 0x6b2 <proc_calculate+0x102>
    if (--disbuf.cnt_down == 0) {
 6a4:	80 91 2e 01 	lds	r24, 0x012E
 6a8:	81 50       	subi	r24, 0x01	; 1
 6aa:	80 93 2e 01 	sts	0x012E, r24
 6ae:	88 23       	and	r24, r24
 6b0:	39 f0       	breq	.+14     	; 0x6c0 <proc_calculate+0x110>
      disbuf.cnt_down = 30;
      disbuf.w = 0;
      SUM_W = 0;
      proflag |= _BV(PRO_SAVE);
    }
  }
  
  proflag |= _BV(PRO_DISPLAY);  // 启动显示进程
 6b2:	94 60       	ori	r25, 0x04	; 4
 6b4:	90 93 01 01 	sts	0x0101, r25
 6b8:	1c c0       	rjmp	.+56     	; 0x6f2 <proc_calculate+0x142>
 6ba:	90 91 01 01 	lds	r25, 0x0101
 6be:	f0 cf       	rjmp	.-32     	; 0x6a0 <proc_calculate+0xf0>
 6c0:	8e e1       	ldi	r24, 0x1E	; 30
 6c2:	80 93 2e 01 	sts	0x012E, r24
 6c6:	10 92 28 01 	sts	0x0128, r1
 6ca:	10 92 29 01 	sts	0x0129, r1
 6ce:	10 92 2a 01 	sts	0x012A, r1
 6d2:	10 92 2b 01 	sts	0x012B, r1
 6d6:	10 92 31 01 	sts	0x0131, r1
 6da:	10 92 32 01 	sts	0x0132, r1
 6de:	10 92 33 01 	sts	0x0133, r1
 6e2:	10 92 34 01 	sts	0x0134, r1
 6e6:	92 60       	ori	r25, 0x02	; 2
 6e8:	90 93 01 01 	sts	0x0101, r25
 6ec:	94 60       	ori	r25, 0x04	; 4
 6ee:	90 93 01 01 	sts	0x0101, r25
 6f2:	1f 91       	pop	r17
 6f4:	0f 91       	pop	r16
 6f6:	ff 90       	pop	r15
 6f8:	ef 90       	pop	r14
 6fa:	08 95       	ret

000006fc <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 + 18000;   // 四舍五入;保证不至于永远丢“功”显示不出来的0.01~0.09
  tmp32 /= 36000;             // 由于显示电流小数点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 + 18000;  // 四舍五入;保证不至于永远丢“功”显示不出来的0.01~0.09
  tmp1 /= 36000;            // 由于显示电流小数点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) {
 6fc:	80 91 07 01 	lds	r24, 0x0107
 700:	81 ff       	sbrs	r24, 1
 702:	08 95       	ret

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

    htobcd5(&bcd_buf[0], (u32_t)sample_i);
 704:	40 91 02 01 	lds	r20, 0x0102
 708:	50 91 03 01 	lds	r21, 0x0103
 70c:	66 27       	eor	r22, r22
 70e:	77 27       	eor	r23, r23
 710:	8f e0       	ldi	r24, 0x0F	; 15
 712:	91 e0       	ldi	r25, 0x01	; 1
 714:	da de       	rcall	.-588    	; 0x4ca <htobcd5>
    htobcd8(&bcd_buf[5], (u32_t)sample_v);
 716:	40 91 0c 01 	lds	r20, 0x010C
 71a:	50 91 0d 01 	lds	r21, 0x010D
 71e:	66 27       	eor	r22, r22
 720:	77 27       	eor	r23, r23
 722:	84 e1       	ldi	r24, 0x14	; 20
 724:	91 e0       	ldi	r25, 0x01	; 1
 726:	49 de       	rcall	.-878    	; 0x3ba <htobcd8>
    
    flag0 &= ~_BV(FLAG0_T1);
 728:	80 91 07 01 	lds	r24, 0x0107
 72c:	8d 7f       	andi	r24, 0xFD	; 253
 72e:	80 93 07 01 	sts	0x0107, r24
 732:	08 95       	ret

00000734 <proc_display>:
 734:	ef 92       	push	r14
 736:	ff 92       	push	r15
 738:	0f 93       	push	r16
 73a:	1f 93       	push	r17
 73c:	80 91 01 01 	lds	r24, 0x0101
 740:	82 ff       	sbrs	r24, 2
 742:	9b c0       	rjmp	.+310    	; 0x87a <proc_display+0x146>
 744:	60 91 28 01 	lds	r22, 0x0128
 748:	70 91 29 01 	lds	r23, 0x0129
 74c:	80 91 2a 01 	lds	r24, 0x012A
 750:	90 91 2b 01 	lds	r25, 0x012B
 754:	60 5b       	subi	r22, 0xB0	; 176
 756:	79 4b       	sbci	r23, 0xB9	; 185
 758:	8f 4f       	sbci	r24, 0xFF	; 255
 75a:	9f 4f       	sbci	r25, 0xFF	; 255
 75c:	e0 90 31 01 	lds	r14, 0x0131
 760:	f0 90 32 01 	lds	r15, 0x0132
 764:	00 91 33 01 	lds	r16, 0x0133
 768:	10 91 34 01 	lds	r17, 0x0134
 76c:	20 ea       	ldi	r18, 0xA0	; 160
 76e:	3c e8       	ldi	r19, 0x8C	; 140
 770:	40 e0       	ldi	r20, 0x00	; 0
 772:	50 e0       	ldi	r21, 0x00	; 0
 774:	99 d2       	rcall	.+1330   	; 0xca8 <__udivmodsi4>
 776:	2e 0d       	add	r18, r14
 778:	3f 1d       	adc	r19, r15
 77a:	40 1f       	adc	r20, r16
 77c:	51 1f       	adc	r21, r17
 77e:	20 30       	cpi	r18, 0x00	; 0
 780:	81 ee       	ldi	r24, 0xE1	; 225
 782:	38 07       	cpc	r19, r24
 784:	85 ef       	ldi	r24, 0xF5	; 245
 786:	48 07       	cpc	r20, r24
 788:	85 e0       	ldi	r24, 0x05	; 5
 78a:	58 07       	cpc	r21, r24
 78c:	70 f5       	brcc	.+92     	; 0x7ea <proc_display+0xb6>
 78e:	ba 01       	movw	r22, r20
 790:	a9 01       	movw	r20, r18
 792:	84 e1       	ldi	r24, 0x14	; 20
 794:	91 e0       	ldi	r25, 0x01	; 1
 796:	11 de       	rcall	.-990    	; 0x3ba <htobcd8>
 798:	80 91 1a 01 	lds	r24, 0x011A
 79c:	80 68       	ori	r24, 0x80	; 128
 79e:	80 93 1a 01 	sts	0x011A, r24
 7a2:	80 91 01 01 	lds	r24, 0x0101
 7a6:	84 fd       	sbrc	r24, 4
 7a8:	25 c0       	rjmp	.+74     	; 0x7f4 <proc_display+0xc0>
 7aa:	90 91 00 01 	lds	r25, 0x0100
 7ae:	91 30       	cpi	r25, 0x01	; 1
 7b0:	09 f4       	brne	.+2      	; 0x7b4 <proc_display+0x80>
 7b2:	4d c0       	rjmp	.+154    	; 0x84e <proc_display+0x11a>
 7b4:	91 30       	cpi	r25, 0x01	; 1
 7b6:	98 f5       	brcc	.+102    	; 0x81e <proc_display+0xea>
 7b8:	40 91 1c 01 	lds	r20, 0x011C
 7bc:	50 91 1d 01 	lds	r21, 0x011D
 7c0:	60 91 1e 01 	lds	r22, 0x011E
 7c4:	70 91 1f 01 	lds	r23, 0x011F
 7c8:	8f e0       	ldi	r24, 0x0F	; 15
 7ca:	91 e0       	ldi	r25, 0x01	; 1
 7cc:	7e de       	rcall	.-772    	; 0x4ca <htobcd5>
 7ce:	80 91 12 01 	lds	r24, 0x0112
 7d2:	80 68       	ori	r24, 0x80	; 128
 7d4:	80 93 12 01 	sts	0x0112, r24
 7d8:	45 98       	cbi	0x08, 5	; 8
 7da:	44 9a       	sbi	0x08, 4	; 8
 7dc:	5d 9a       	sbi	0x0b, 5	; 11
 7de:	80 91 01 01 	lds	r24, 0x0101
 7e2:	8b 7f       	andi	r24, 0xFB	; 251
 7e4:	80 93 01 01 	sts	0x0101, r24
 7e8:	48 c0       	rjmp	.+144    	; 0x87a <proc_display+0x146>
 7ea:	20 50       	subi	r18, 0x00	; 0
 7ec:	31 4e       	sbci	r19, 0xE1	; 225
 7ee:	45 4f       	sbci	r20, 0xF5	; 245
 7f0:	55 40       	sbci	r21, 0x05	; 5
 7f2:	cd cf       	rjmp	.-102    	; 0x78e <proc_display+0x5a>
 7f4:	40 91 2e 01 	lds	r20, 0x012E
 7f8:	55 27       	eor	r21, r21
 7fa:	66 27       	eor	r22, r22
 7fc:	77 27       	eor	r23, r23
 7fe:	8f e0       	ldi	r24, 0x0F	; 15
 800:	91 e0       	ldi	r25, 0x01	; 1
 802:	63 de       	rcall	.-826    	; 0x4ca <htobcd5>
 804:	8f e0       	ldi	r24, 0x0F	; 15
 806:	80 93 0f 01 	sts	0x010F, r24
 80a:	80 93 10 01 	sts	0x0110, r24
 80e:	80 93 11 01 	sts	0x0111, r24
 812:	80 91 01 01 	lds	r24, 0x0101
 816:	8b 7f       	andi	r24, 0xFB	; 251
 818:	80 93 01 01 	sts	0x0101, r24
 81c:	2e c0       	rjmp	.+92     	; 0x87a <proc_display+0x146>
 81e:	92 30       	cpi	r25, 0x02	; 2
 820:	d1 f7       	brne	.-12     	; 0x816 <proc_display+0xe2>
 822:	40 91 1c 01 	lds	r20, 0x011C
 826:	50 91 1d 01 	lds	r21, 0x011D
 82a:	60 91 1e 01 	lds	r22, 0x011E
 82e:	70 91 1f 01 	lds	r23, 0x011F
 832:	8f e0       	ldi	r24, 0x0F	; 15
 834:	91 e0       	ldi	r25, 0x01	; 1
 836:	49 de       	rcall	.-878    	; 0x4ca <htobcd5>
 838:	80 91 12 01 	lds	r24, 0x0112
 83c:	80 68       	ori	r24, 0x80	; 128

⌨️ 快捷键说明

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