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

📄 main.lss

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


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


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

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

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

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

0000074c <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) {
 74c:	80 91 07 01 	lds	r24, 0x0107
 750:	81 ff       	sbrs	r24, 1
 752:	08 95       	ret

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

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

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

⌨️ 快捷键说明

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