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

📄 main.lss

📁 AVR红外遥控
💻 LSS
📖 第 1 页 / 共 5 页
字号:
  // 测试计算结果
  //htobcd8(&bcd_buf[5], disbuf.p);


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

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

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

  // 累计持续按键时间
  if ((proflag & _BV(PRO_KEEP_KEY)) != 0) {
 6a2:	94 ff       	sbrs	r25, 4
 6a4:	07 c0       	rjmp	.+14     	; 0x6b4 <proc_calculate+0x102>
    if (--disbuf.cnt_down == 0) {
 6a6:	80 91 2e 01 	lds	r24, 0x012E
 6aa:	81 50       	subi	r24, 0x01	; 1
 6ac:	80 93 2e 01 	sts	0x012E, r24
 6b0:	88 23       	and	r24, r24
 6b2:	39 f0       	breq	.+14     	; 0x6c2 <proc_calculate+0x110>
      disbuf.cnt_down = 30;
      disbuf.w = 0;
      SUM_W = 0;
      proflag |= _BV(PRO_SAVE);
    }
  }
  
  proflag |= _BV(PRO_DISPLAY);  // 启动显示进程
 6b4:	94 60       	ori	r25, 0x04	; 4
 6b6:	90 93 01 01 	sts	0x0101, r25
 6ba:	1c c0       	rjmp	.+56     	; 0x6f4 <proc_calculate+0x142>
 6bc:	90 91 01 01 	lds	r25, 0x0101
 6c0:	f0 cf       	rjmp	.-32     	; 0x6a2 <proc_calculate+0xf0>
 6c2:	8e e1       	ldi	r24, 0x1E	; 30
 6c4:	80 93 2e 01 	sts	0x012E, r24
 6c8:	10 92 28 01 	sts	0x0128, r1
 6cc:	10 92 29 01 	sts	0x0129, r1
 6d0:	10 92 2a 01 	sts	0x012A, r1
 6d4:	10 92 2b 01 	sts	0x012B, r1
 6d8:	10 92 31 01 	sts	0x0131, r1
 6dc:	10 92 32 01 	sts	0x0132, r1
 6e0:	10 92 33 01 	sts	0x0133, r1
 6e4:	10 92 34 01 	sts	0x0134, r1
 6e8:	92 60       	ori	r25, 0x02	; 2
 6ea:	90 93 01 01 	sts	0x0101, r25
 6ee:	94 60       	ori	r25, 0x04	; 4
 6f0:	90 93 01 01 	sts	0x0101, r25
 6f4:	1f 91       	pop	r17
 6f6:	0f 91       	pop	r16
 6f8:	ff 90       	pop	r15
 6fa:	ef 90       	pop	r14
 6fc:	08 95       	ret

000006fe <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[10] |= 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.i); // 显示数
      bcd_buf[2] |= 0x80;             // 小数点位置
      LED14_OFF;
      LED15_ON;
      LED16_OFF;
      break;
    case KEY_TYPE_P:
      htobcd5(&bcd_buf[0], disbuf.p); // 显示数
      bcd_buf[2] |= 0x80;             // 小数点位置
      LED14_OFF;
      LED15_OFF;
      LED16_ON;
      break;
  }

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




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

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

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

00000736 <proc_display>:
 736:	ef 92       	push	r14
 738:	ff 92       	push	r15
 73a:	0f 93       	push	r16
 73c:	1f 93       	push	r17
 73e:	80 91 01 01 	lds	r24, 0x0101
 742:	82 ff       	sbrs	r24, 2
 744:	9b c0       	rjmp	.+310    	; 0x87c <proc_display+0x146>
 746:	60 91 28 01 	lds	r22, 0x0128
 74a:	70 91 29 01 	lds	r23, 0x0129
 74e:	80 91 2a 01 	lds	r24, 0x012A
 752:	90 91 2b 01 	lds	r25, 0x012B
 756:	68 5f       	subi	r22, 0xF8	; 248
 758:	78 4f       	sbci	r23, 0xF8	; 248
 75a:	8f 4f       	sbci	r24, 0xFF	; 255
 75c:	9f 4f       	sbci	r25, 0xFF	; 255
 75e:	e0 90 31 01 	lds	r14, 0x0131
 762:	f0 90 32 01 	lds	r15, 0x0132
 766:	00 91 33 01 	lds	r16, 0x0133
 76a:	10 91 34 01 	lds	r17, 0x0134
 76e:	20 e1       	ldi	r18, 0x10	; 16
 770:	3e e0       	ldi	r19, 0x0E	; 14
 772:	40 e0       	ldi	r20, 0x00	; 0
 774:	50 e0       	ldi	r21, 0x00	; 0
 776:	9d d2       	rcall	.+1338   	; 0xcb2 <__udivmodsi4>
 778:	2e 0d       	add	r18, r14
 77a:	3f 1d       	adc	r19, r15
 77c:	40 1f       	adc	r20, r16
 77e:	51 1f       	adc	r21, r17
 780:	20 30       	cpi	r18, 0x00	; 0
 782:	81 ee       	ldi	r24, 0xE1	; 225
 784:	38 07       	cpc	r19, r24
 786:	85 ef       	ldi	r24, 0xF5	; 245
 788:	48 07       	cpc	r20, r24
 78a:	85 e0       	ldi	r24, 0x05	; 5
 78c:	58 07       	cpc	r21, r24
 78e:	70 f5       	brcc	.+92     	; 0x7ec <proc_display+0xb6>
 790:	ba 01       	movw	r22, r20
 792:	a9 01       	movw	r20, r18
 794:	84 e1       	ldi	r24, 0x14	; 20
 796:	91 e0       	ldi	r25, 0x01	; 1
 798:	11 de       	rcall	.-990    	; 0x3bc <htobcd8>
 79a:	80 91 19 01 	lds	r24, 0x0119
 79e:	80 68       	ori	r24, 0x80	; 128
 7a0:	80 93 19 01 	sts	0x0119, r24
 7a4:	80 91 01 01 	lds	r24, 0x0101
 7a8:	84 fd       	sbrc	r24, 4
 7aa:	25 c0       	rjmp	.+74     	; 0x7f6 <proc_display+0xc0>
 7ac:	90 91 00 01 	lds	r25, 0x0100
 7b0:	91 30       	cpi	r25, 0x01	; 1
 7b2:	09 f4       	brne	.+2      	; 0x7b6 <proc_display+0x80>
 7b4:	4d c0       	rjmp	.+154    	; 0x850 <proc_display+0x11a>
 7b6:	91 30       	cpi	r25, 0x01	; 1
 7b8:	98 f5       	brcc	.+102    	; 0x820 <proc_display+0xea>
 7ba:	40 91 1c 01 	lds	r20, 0x011C
 7be:	50 91 1d 01 	lds	r21, 0x011D
 7c2:	60 91 1e 01 	lds	r22, 0x011E
 7c6:	70 91 1f 01 	lds	r23, 0x011F
 7ca:	8f e0       	ldi	r24, 0x0F	; 15
 7cc:	91 e0       	ldi	r25, 0x01	; 1
 7ce:	7e de       	rcall	.-772    	; 0x4cc <htobcd5>
 7d0:	80 91 12 01 	lds	r24, 0x0112
 7d4:	80 68       	ori	r24, 0x80	; 128
 7d6:	80 93 12 01 	sts	0x0112, r24
 7da:	45 98       	cbi	0x08, 5	; 8
 7dc:	44 9a       	sbi	0x08, 4	; 8
 7de:	5d 9a       	sbi	0x0b, 5	; 11
 7e0:	80 91 01 01 	lds	r24, 0x0101
 7e4:	8b 7f       	andi	r24, 0xFB	; 251
 7e6:	80 93 01 01 	sts	0x0101, r24
 7ea:	48 c0       	rjmp	.+144    	; 0x87c <proc_display+0x146>
 7ec:	20 50       	subi	r18, 0x00	; 0
 7ee:	31 4e       	sbci	r19, 0xE1	; 225
 7f0:	45 4f       	sbci	r20, 0xF5	; 245
 7f2:	55 40       	sbci	r21, 0x05	; 5
 7f4:	cd cf       	rjmp	.-102    	; 0x790 <proc_display+0x5a>
 7f6:	40 91 2e 01 	lds	r20, 0x012E
 7fa:	55 27       	eor	r21, r21
 7fc:	66 27       	eor	r22, r22
 7fe:	77 27       	eor	r23, r23
 800:	8f e0       	ldi	r24, 0x0F	; 15
 802:	91 e0       	ldi	r25, 0x01	; 1
 804:	63 de       	rcall	.-826    	; 0x4cc <htobcd5>
 806:	8f e0       	ldi	r24, 0x0F	; 15
 808:	80 93 0f 01 	sts	0x010F, r24
 80c:	80 93 10 01 	sts	0x0110, r24
 810:	80 93 11 01 	sts	0x0111, r24
 814:	80 91 01 01 	lds	r24, 0x0101
 818:	8b 7f       	andi	r24, 0xFB	; 251
 81a:	80 93 01 01 	sts	0x0101, r24
 81e:	2e c0       	rjmp	.+92     	; 0x87c <proc_display+0x146>
 820:	92 30       	cpi	r25, 0x02	; 2
 822:	d1 f7       	brne	.-12     	; 0x818 <proc_display+0xe2>
 824:	40 91 24 01 	lds	r20, 0x0124
 828:	50 91 25 01 	lds	r21, 0x0125
 82c:	60 91 26 01 	lds	r22, 0x0126
 830:	70 91 27 01 	lds	r23, 0x0127
 834:	8f e0       	ldi	r24, 0x0F	; 15
 836:	91 e0       	ldi	r25, 0x01	; 1

⌨️ 快捷键说明

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