📄 main.lss
字号:
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 + -