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

📄 main.lss

📁 AVR红外遥控
💻 LSS
📖 第 1 页 / 共 5 页
字号:
 64a:	30 e2       	ldi	r19, 0x20	; 32
 64c:	40 e0       	ldi	r20, 0x00	; 0
 64e:	50 e0       	ldi	r21, 0x00	; 0
 650:	5c d4       	rcall	.+2232   	; 0xf0a <__udivmodsi4>
 652:	20 93 20 01 	sts	0x0120, r18
 656:	30 93 21 01 	sts	0x0121, r19
 65a:	40 93 22 01 	sts	0x0122, r20
 65e:	50 93 23 01 	sts	0x0123, r21
  // 测试计算结果
  //htobcd5(&bcd_buf[0], disbuf.i);


  // 计算显示功率(兆瓦)
  tmp3 = tmp1;
//  tmp3 *= tmp2;
//  tmp3 /= 1000;
  disbuf.p = tmp3;
 662:	e0 92 24 01 	sts	0x0124, r14
 666:	f0 92 25 01 	sts	0x0125, r15
 66a:	00 93 26 01 	sts	0x0126, r16
 66e:	10 93 27 01 	sts	0x0127, r17
  // 测试计算结果
  //htobcd8(&bcd_buf[5], disbuf.p);


  // 计算累加1小时内的功 (按秒计算)
  disbuf.w += tmp3;
 672:	80 91 28 01 	lds	r24, 0x0128
 676:	90 91 29 01 	lds	r25, 0x0129
 67a:	a0 91 2a 01 	lds	r26, 0x012A
 67e:	b0 91 2b 01 	lds	r27, 0x012B
 682:	8e 0d       	add	r24, r14
 684:	9f 1d       	adc	r25, r15
 686:	a0 1f       	adc	r26, r16
 688:	b1 1f       	adc	r27, r17
 68a:	80 93 28 01 	sts	0x0128, r24
 68e:	90 93 29 01 	sts	0x0129, r25
 692:	a0 93 2a 01 	sts	0x012A, r26
 696:	b0 93 2b 01 	sts	0x012B, r27
  // 测试计算结果
  // htobcd8(&bcd_buf[5], disbuf.w);

  
  // 累计1小时的功
  if (++disbuf.cnt_3600 > 3600) { // 1小时到,计算 MW*H 总和
 69a:	80 91 2c 01 	lds	r24, 0x012C
 69e:	90 91 2d 01 	lds	r25, 0x012D
 6a2:	01 96       	adiw	r24, 0x01	; 1
 6a4:	90 93 2d 01 	sts	0x012D, r25
 6a8:	80 93 2c 01 	sts	0x012C, r24
 6ac:	81 51       	subi	r24, 0x11	; 17
 6ae:	9e 40       	sbci	r25, 0x0E	; 14
 6b0:	b0 f0       	brcs	.+44     	; 0x6de <proc_calculate+0x12e>

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

  // 累计持续按键时间
  if ((proflag & _BV(PRO_KEEP_KEY)) != 0) {
 6c4:	94 ff       	sbrs	r25, 4
 6c6:	07 c0       	rjmp	.+14     	; 0x6d6 <proc_calculate+0x126>
    if (--disbuf.cnt_down == 0) {
 6c8:	80 91 2e 01 	lds	r24, 0x012E
 6cc:	81 50       	subi	r24, 0x01	; 1
 6ce:	80 93 2e 01 	sts	0x012E, r24
 6d2:	88 23       	and	r24, r24
 6d4:	39 f0       	breq	.+14     	; 0x6e4 <proc_calculate+0x134>
      disbuf.cnt_down = 30;
      disbuf.w = 0;
      SUM_W = 0;
      proflag |= _BV(PRO_SAVE);
    }
  }
  
  proflag |= _BV(PRO_DISPLAY);  // 启动显示进程
 6d6:	94 60       	ori	r25, 0x04	; 4
 6d8:	90 93 01 01 	sts	0x0101, r25
 6dc:	34 c0       	rjmp	.+104    	; 0x746 <proc_calculate+0x196>
 6de:	90 91 01 01 	lds	r25, 0x0101
 6e2:	f0 cf       	rjmp	.-32     	; 0x6c4 <proc_calculate+0x114>
 6e4:	8e e1       	ldi	r24, 0x1E	; 30
 6e6:	80 93 2e 01 	sts	0x012E, r24
 6ea:	10 92 28 01 	sts	0x0128, r1
 6ee:	10 92 29 01 	sts	0x0129, r1
 6f2:	10 92 2a 01 	sts	0x012A, r1
 6f6:	10 92 2b 01 	sts	0x012B, r1
 6fa:	10 92 31 01 	sts	0x0131, r1
 6fe:	10 92 32 01 	sts	0x0132, r1
 702:	10 92 33 01 	sts	0x0133, r1
 706:	10 92 34 01 	sts	0x0134, r1
 70a:	92 60       	ori	r25, 0x02	; 2
 70c:	90 93 01 01 	sts	0x0101, r25
 710:	94 60       	ori	r25, 0x04	; 4
 712:	90 93 01 01 	sts	0x0101, r25
 716:	17 c0       	rjmp	.+46     	; 0x746 <proc_calculate+0x196>
 718:	ca 01       	movw	r24, r20
 71a:	b9 01       	movw	r22, r18
 71c:	61 70       	andi	r22, 0x01	; 1
 71e:	70 70       	andi	r23, 0x00	; 0
 720:	80 70       	andi	r24, 0x00	; 0
 722:	90 70       	andi	r25, 0x00	; 0
 724:	56 95       	lsr	r21
 726:	47 95       	ror	r20
 728:	37 95       	ror	r19
 72a:	27 95       	ror	r18
 72c:	62 2b       	or	r22, r18
 72e:	73 2b       	or	r23, r19
 730:	84 2b       	or	r24, r20
 732:	95 2b       	or	r25, r21
 734:	14 d3       	rcall	.+1576   	; 0xd5e <__floatsisf>
 736:	9b 01       	movw	r18, r22
 738:	ac 01       	movw	r20, r24
 73a:	b2 d2       	rcall	.+1380   	; 0xca0 <__addsf3>
 73c:	5d cf       	rjmp	.-326    	; 0x5f8 <proc_calculate+0x48>
 73e:	ee 24       	eor	r14, r14
 740:	ff 24       	eor	r15, r15
 742:	87 01       	movw	r16, r14
 744:	6c cf       	rjmp	.-296    	; 0x61e <proc_calculate+0x6e>
 746:	1f 91       	pop	r17
 748:	0f 91       	pop	r16
 74a:	ff 90       	pop	r15
 74c:	ef 90       	pop	r14
 74e:	08 95       	ret

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

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




// ===========================================================================
void proc_test_sample(void) {
 750:	80 91 07 01 	lds	r24, 0x0107
 754:	81 ff       	sbrs	r24, 1
 756:	08 95       	ret

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

    htobcd5(&bcd_buf[0], (u32_t)sample_i);
 758:	40 91 02 01 	lds	r20, 0x0102
 75c:	50 91 03 01 	lds	r21, 0x0103
 760:	66 27       	eor	r22, r22
 762:	77 27       	eor	r23, r23
 764:	8f e0       	ldi	r24, 0x0F	; 15
 766:	91 e0       	ldi	r25, 0x01	; 1
 768:	b0 de       	rcall	.-672    	; 0x4ca <htobcd5>
    htobcd8(&bcd_buf[5], (u32_t)sample_v);
 76a:	40 91 0c 01 	lds	r20, 0x010C
 76e:	50 91 0d 01 	lds	r21, 0x010D
 772:	66 27       	eor	r22, r22
 774:	77 27       	eor	r23, r23
 776:	84 e1       	ldi	r24, 0x14	; 20
 778:	91 e0       	ldi	r25, 0x01	; 1
 77a:	1f de       	rcall	.-962    	; 0x3ba <htobcd8>
    
    flag0 &= ~_BV(FLAG0_T1);
 77c:	80 91 07 01 	lds	r24, 0x0107
 780:	8d 7f       	andi	r24, 0xFD	; 253
 782:	80 93 07 01 	sts	0x0107, r24
 786:	08 95       	ret

00000788 <proc_display>:
 788:	ef 92       	push	r14
 78a:	ff 92       	push	r15
 78c:	0f 93       	push	r16
 78e:	1f 93       	push	r17
 790:	80 91 01 01 	lds	r24, 0x0101
 794:	82 ff       	sbrs	r24, 2
 796:	9b c0       	rjmp	.+310    	; 0x8ce <proc_display+0x146>
 798:	60 91 28 01 	lds	r22, 0x0128
 79c:	70 91 29 01 	lds	r23, 0x0129
 7a0:	80 91 2a 01 	lds	r24, 0x012A
 7a4:	90 91 2b 01 	lds	r25, 0x012B
 7a8:	68 5f       	subi	r22, 0xF8	; 248
 7aa:	78 4f       	sbci	r23, 0xF8	; 248
 7ac:	8f 4f       	sbci	r24, 0xFF	; 255
 7ae:	9f 4f       	sbci	r25, 0xFF	; 255
 7b0:	e0 90 31 01 	lds	r14, 0x0131
 7b4:	f0 90 32 01 	lds	r15, 0x0132
 7b8:	00 91 33 01 	lds	r16, 0x0133
 7bc:	10 91 34 01 	lds	r17, 0x0134
 7c0:	20 e1       	ldi	r18, 0x10	; 16
 7c2:	3e e0       	ldi	r19, 0x0E	; 14
 7c4:	40 e0       	ldi	r20, 0x00	; 0
 7c6:	50 e0       	ldi	r21, 0x00	; 0
 7c8:	a0 d3       	rcall	.+1856   	; 0xf0a <__udivmodsi4>
 7ca:	2e 0d       	add	r18, r14
 7cc:	3f 1d       	adc	r19, r15
 7ce:	40 1f       	adc	r20, r16
 7d0:	51 1f       	adc	r21, r17
 7d2:	20 30       	cpi	r18, 0x00	; 0
 7d4:	81 ee       	ldi	r24, 0xE1	; 225
 7d6:	38 07       	cpc	r19, r24
 7d8:	85 ef       	ldi	r24, 0xF5	; 245
 7da:	48 07       	cpc	r20, r24
 7dc:	85 e0       	ldi	r24, 0x05	; 5
 7de:	58 07       	cpc	r21, r24
 7e0:	70 f5       	brcc	.+92     	; 0x83e <proc_display+0xb6>
 7e2:	ba 01       	movw	r22, r20
 7e4:	a9 01       	movw	r20, r18
 7e6:	84 e1       	ldi	r24, 0x14	; 20
 7e8:	91 e0       	ldi	r25, 0x01	; 1
 7ea:	e7 dd       	rcall	.-1074   	; 0x3ba <htobcd8>
 7ec:	80 91 19 01 	lds	r24, 0x0119
 7f0:	80 68       	ori	r24, 0x80	; 128
 7f2:	80 93 19 01 	sts	0x0119, r24
 7f6:	80 91 01 01 	lds	r24, 0x0101
 7fa:	84 fd       	sbrc	r24, 4
 7fc:	25 c0       	rjmp	.+74     	; 0x848 <proc_display+0xc0>
 7fe:	90 91 00 01 	lds	r25, 0x0100
 802:	91 30       	cpi	r25, 0x01	; 1
 804:	09 f4       	brne	.+2      	; 0x808 <proc_display+0x80>
 806:	4d c0       	rjmp	.+154    	; 0x8a2 <proc_display+0x11a>
 808:	91 30       	cpi	r25, 0x01	; 1
 80a:	98 f5       	brcc	.+102    	; 0x872 <proc_display+0xea>
 80c:	40 91 1c 01 	lds	r20, 0x011C

⌨️ 快捷键说明

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