收拾东西的时候又看到之前收拾的vfd相关的盒子,偶然又加的群,又买了两种屏试水。
大的买屏还送vfd变压器,这玩意卖的少,一个5块,不买血亏!不知道什么时候开始早已没有DIY是省钱这种观念了。草。。。
一.灯丝驱动
我拿到变压器,按照之前的电路,简单用洞洞板焊接了一个,由于做的时候没有拍照,也不想拆开盒子了。原理图见之前的帖子。
调试的时候出了两个问题:
1.没加电解电容,电路储能不够,不能起震。后加一470uF电容。
2.由于我没有120mH那么大的电感,我用的100uH的,C13按照470pF似乎没有起震。手里没有示波器看不到状况。总之,换成0.1uF后工作了,这个电路我也分析不出来频率理论式是多少了,但是这个电容和电感肯定是决定震荡频率的。其他值都是这个电路的。
老王提供的原理图,尚未验证这组值,但是群友似乎采用了。准备做小那块板再验证一下。
不过我最后控制的时候效仿该电路加了一个pmos控制灯丝电路通断。5V进入电路,MCU和改FUTABA VFD驱动共用该电源,再经pmos控制输入灯丝电路。
FUTABA手册里说,VH即栅极阳极电压(这里的VEE)应该先于或者与驱动同时断电,这样设计没问题。
和我之前手工绕的变压器不同的是,这个电路输出灯丝交流电压大概只有1.3Vac。难道是之前匝数太多啦?反正上一版由于三极管,变压器和PT6311发热比较严重,
5V供电时电流达到了0.8A。基本同样的电路这个板只有0.2A。可能是自己绕制的变压器和这个差比较远吧。这个功耗大导致上一板开板计划搁浅。烂尾了。下次使用这个变压器再做吧。
二.MCU驱动程序
这次没用stm8,因为封装(tssop20)的原因,不方便在洞洞板上焊接了。再有就是群友提供的驱动亦是stc8的,我直接使用stc12稍稍改了引脚就驱动了这个屏。
三.时钟总体设计
方案:FUTABA VFD + DS3231 + stc15w404as + 3D打印外壳
1.mcu,15的mcu直接把以前作废的航模接受机锯下核心板,供电测试可以烧录程序。再改引脚这个u也成功驱动了。下面也没有时钟的内部图了,一是因为洞洞板焊接,二是主要的,我洞洞板也是从以前废板上裁下来的,手头连洞洞板也没了。由于是方案验证,也不想制板甚至开板了。作给下版再考虑吧。
2.DS3231,这玩意浪费时间不短!用的这块就是上次的vfd时钟上拆下来的。之前给它接的电池都挂了,0v电压。给那块板供电板子不工作,拔了电池才工作。其实这块芯片备用电池这里内部可能出了问题。导致我后来花很长世间调试掉电走时。
3.总体思路,开定时器刷屏,读温度时间,通过串口交互完成授时等操作。
四.坑
1.FUTABA驱动,原作者可能是基于其他FUTABA的板改的,有些地方我没搞懂就又去找手册自己琢磨了好久,还是想利用那些图标。最后也没用上,但是大致又搞了一遍这个驱动显示原理。
感觉和lcd1602这种屏很像。自带部分ascii字库,花圈的是CGRAM,用户自定义码。其它是CGROM,固化在驱动内的。
Basically flowchart of commands:
1.有很多种ram,拣几个用到的说。CGRAM(character generator RAM)上面说了是自定义字符,一共有8个,可以反复更新,再引用时可以通过先写到CGRAM立即更新到DCRAM显示,或者通过相关方法以编号的形式引用。
DCRAM(data control RAM),每个显示符最终写入交由硬件执行显示的RAM,写给它硬件就去查表显示了。ADRAM(additional data RAM),额外的字符RAM,用于显示下图标记的icon。这个是写入立即生效,不用写入DCRAM。
2.FUTABA 驱动
1 #include "futaba_vfd.h"
2 /*
3 //typical:
4 @1. VFD_Write_CGRAM(0x00,VFD_CGRAM[0]);//VFD_CGRAM[0]:assign character
5 VFD_Write_DCRAM(0x01,0x00); //0x01:assign position 0x00:(dat?dat:VFD_CGRAM[0])
6 in this way,first write to cgram and then write to dcram to display soon
7
8 VFD_Write_DCRAM(0x01,'1'); //0x01:pos '1':the char to display
9 it's convenient,but it doesn't work appropriately when only write 1 char.so repeat it!
10 */
11
12 sbit VFD_SCK = P1^6; //VFD SPI SCLK
13 sbit VFD_DAT = P1^5; //VFD SPI MOSI
14 sbit VFD_CS = P1^7; //VFD chip select
15 sbit VFD_RST = P5^4; //VFD reset
16
17
18
19 //G1,G2,G3,G4,G5,G6,G7,G8,G9,G10,G11,G12,G13,G14
20 unsigned char xdata VFD_DCRAM[13] = {0x07,'1','3','-','S','T','-','8','4','G','I','N','K' }; //DCRAM
21 unsigned char xdata VFD_CGRAM[8][5] = { //CGRAM
22 0x08,0x1c,0x3e,0x00,0x3e, //left arrow
23 0x3e,0x00,0x3e,0x1c,0x08, //right arrow
24 0x28,0x2c,0x2e,0x2c,0x28, //up arrow
25 0x0a,0x1a,0x2a,0x1a,0x0a, //down arrow
26 0xff,0x00,0x00,0x00,0x00,
27 0x00,0x00,0x00,0x00,0x00,
28 0x00,0x00,0x00,0x00,0x00,
29 0x00,0x00,0x00,0x00,0x00
30 };
31 //NC,TIME_D1,SHIFT_D1,CLOCK_D1,HD_D1,USB_D1,LOCK_D1,DOLBY_D1,MUTE_D1,TU1_D1,TU2_D1,MP3_D1,LOOP_D1, repeat addr:1_D0,:2_D0,:3_d0
32 unsigned char xdata VFD_ADRAM[13] = {0};//{0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02}; //ADRAM
33
34 unsigned int xdata VFD_BRT_DATA; // display duty
35
36
37 //---------------------------------------------------------------------------------------//
38 void Delay_10uS() //@12.000MHz
39 {
40 unsigned char i;
41
42 i = 27;
43 while (--i);
44 }
45 void Delay_5mS() //@12.000MHz
46 {
47 unsigned char i, j;
48
49 _nop_();
50 _nop_();
51 i = 59;
52 j = 89;
53 do
54 {
55 while (--j);
56 } while (--i);
57 }
58 void Delay_1S() //@12.000MHz
59 {
60 unsigned char i, j, k;
61
62 _nop_();
63 _nop_();
64 i = 46;
65 j = 153;
66 k = 245;
67 do
68 {
69 do
70 {
71 while (--k);
72 } while (--j);
73 } while (--i);
74 }
75 //---------------------------------------------------------------------------------------//
76 //Wtite data to VFD's CIG
77 void VFD_Write_Data(unsigned char DAT)
78 {
79 unsigned char i;
80 for(i=0;i<8;i++)
81 {
82 VFD_SCK = 0;
83 VFD_DAT = DAT&0x01;
84 Delay_10uS();
85 VFD_SCK = 1;
86 Delay_10uS();
87 DAT >>= 1;
88 }
89 }
90
91 //Initialize the CIG
92 void VFD_Init(void)
93 {
94 unsigned char i , j;
95
96 VFD_RST = 0; //reset the CIG
97 Delay_5mS();
98 VFD_RST = 1;
99 Delay_5mS();
100
101 VFD_CS=0;
102 VFD_Write_Data(0xe0); //Set the display timing
103 VFD_Write_Data(0x0d); //
104 VFD_CS=1;
105
106 VFD_CS=0;
107 VFD_Write_Data(0xe4); //Set the dimming data
108 VFD_Write_Data(150);
109 VFD_CS=1;
110
111 VFD_CS=0;
112 VFD_Write_Data(0x40); //write CGRAM
113 for (i=0;i<8;i++)
114 {
115 for(j=0;j<5;j++)
116 {
117 VFD_Write_Data(VFD_CGRAM[i][j]); //CGRAM
118 }//????display at once ??
119 }
120 VFD_CS=1;
121
122 VFD_CS=0;
123 VFD_Write_Data(0x20); //write DCRAM
124 for(i=0;i<13;i++)
125 {
126 VFD_Write_Data(VFD_DCRAM[i]); //DCRAM
127 }
128 VFD_CS=1;
129
130 VFD_CS=0;
131 VFD_Write_Data(0X60); //write ADRAM
132 for(i=0;i<13;i++)
133 {
134 VFD_Write_Data(VFD_ADRAM[i]); //ADRAM
135 }
136 VFD_CS=1;
137
138 VFD_CS=0;
139 VFD_Write_Data(0xe8); //all display on
140 VFD_CS=1;
141 }
142 void VFD_Clr(void)
143 {
144 // VFD_CS=0;
145 // VFD_Write_Data(0x60 | AD_COLON1); //ADRAM
146 // VFD_Write_Data(0x03); //ADRAM
147 // VFD_Write_Data(0x03);
148 // VFD_Write_Data(0x60 | AD_COLON2); //ADRAM
149 // VFD_Write_Data(0x03); //ADRAM
150 // VFD_Write_Data(0x03);
151 // VFD_Write_Data(0x60 | AD_COLON3); //ADRAM
152 // VFD_Write_Data(0x03); //ADRAM
153 // VFD_Write_Data(0x03); //ADRAM
154 // VFD_CS=1;
155 VFD_CS=0;
156 VFD_Write_Data(0x20|0x0); //DCRAM
157 VFD_Write_Data(4);
158 // VFD_Write_CGRAM(0x00,VFD_CGRAM[4]);
159 VFD_CS=1;
160 }
161 //set VFD display on or off , 0-off , 1-on
162 void VFD_Disp_On_Off(bit on_off_flag)
163 {
164 VFD_CS=0;
165 VFD_Write_Data(0xe8 | (((unsigned char)(~on_off_flag))<<1));
166 VFD_CS=1;
167 }
168
169 //Set the display dimming data
170 void VFD_Brt_Set(unsigned char BRT_DAT)
171 {
172 VFD_CS=0;
173 VFD_Write_Data(0xe4); //display dimming set command
174 VFD_Write_Data(BRT_DAT);
175 VFD_CS=1;
176 }
177
178 //Load DCRAM buffer to VFD's DCRAM
179 void VFD_DCRAM_Load(void)
180 {
181 unsigned char i;
182 VFD_CS=0;
183 VFD_Write_Data(0x20); //write DCRAM
184 for(i=0;i<13;i++)
185 {
186 VFD_Write_Data(VFD_DCRAM[i]); //DCRAM
187 }
188 VFD_CS=1;
189 }
190 //Write data to fixed DCRAM address
191 void VFD_Write_DCRAM(unsigned char addr , unsigned char dat)
192 {
193 VFD_CS=0;
194 VFD_Write_Data(0x20 | addr); //write DCRAM
195 VFD_Write_Data(dat); //DCRAM
196 VFD_CS=1;
197 }
198 //Load CGRAM buffer to VFD's CGRAM
199 void VFD_CGRAM_Load(void)
200 {
201 unsigned char i , j;
202 VFD_CS=0;
203 VFD_Write_Data(0x40); //write CGRAM
204 for (i=0;i<8;i++)
205 {
206 for(j=0;j<5;j++)
207 {
208 VFD_Write_Data(VFD_CGRAM[i][j]); //CGRAM
209 }
210 }
211 VFD_CS=1;
212 }
213 //Write data to fixed CGRAM address
214 void VFD_Write_CGRAM(unsigned char addr , unsigned char *dat)
215 {
216 unsigned char i;
217 VFD_CS=0;
218 VFD_Write_Data(0x40 | addr); //write CGRAM
219 for(i=0;i<5;i++)
220 {
221 VFD_Write_Data(*dat++); //CGRAM
222 }
223 VFD_CS=1;
224 }
225 //Load ADRAM buffer to VFD's ADRAM
226 void VFD_ADRAM_Load(void)
227 {
228 unsigned char i;
229 VFD_CS=0;
230 VFD_Write_Data(0x60); //ADRAM
231 for (i=0;i<13;i++)
232 {
233 VFD_Write_Data(VFD_ADRAM[i]); //ADRAM
234 }
235 VFD_CS=1;
236 }
237 //Write data to fixed ADRAM address
238 void VFD_Write_ADRAM(unsigned char ad_dat , bit on_off_flag)
239 {
240 unsigned char ad_dat_temp;
241 VFD_CS=0;
242 VFD_Write_Data(0x60 | ad_dat); //ADRAM
243 if((ad_dat == AD_COLON1) || (ad_dat == AD_COLON2) || (ad_dat == AD_COLON3)) ad_dat_temp = 0x01;
244 else ad_dat_temp = 0x02;
245 on_off_flag ? VFD_Write_Data(ad_dat_temp) : VFD_Write_Data(0x00); //ADRAM
246 VFD_CS=1;
247 }
(1)显示某个字符,若字符为字库内的,可直接使用内码。
如,
VFD_Write_DCRAM(0x01,'1'); //0x01:pos '1':the char to display
交由其自行转换为码字地址。
或者直接给DCRAM写入字符地址,
VFD_Write_DCRAM(0x01,0);//0x01:pos 0:the char's address
即显示这个字符。
(2)CGRAM显示
其实上面那行代码显示的就是CGRAM,CGRAM和CGROM共用一页地址,只是低8个给RAM了。所以按地址方式赋值是可以显示用户字符和字库字符的。
还有一种方式,
VFD_Write_CGRAM(0x00,VFD_CGRAM[0]);//VFD_CGRAM[0]:assign character
VFD_Write_DCRAM(0x01,0x00); //0x01:assign position 0x00:(dat?dat:VFD_CGRAM[0])
采用写入CGRAM并立即更新到DCRAM的方式,当DCRAM的字符参数为0时,写入的就是最近写入的CGRAM。经验证这两行代码的确可行,但是在手册上没有明确找到这个流程。
行业既定规则?也有可能是我没看到。
3.DS3231掉电走时
前面也说到了,这里调试了很久都不能掉电走时。
学到新的就是这个芯片其实RST脚根本不需要上电复位,这个脚设计来是接按键的。许多设计直接将这个脚悬空。
VBAT这个脚我尝试过接锂电池,甚至直接接了5v一样不走时。
调试到最后我差点就把这个芯片换成之前买的DS12C887,这个自带电池总归可以掉电走时了吧?
但是就在快下手时突然有了新思路,我直接用电池给这个芯片供电不就行了?反正3231工作时电流是微安级的。
找来以前从pos机拆下的小锂电,接一个充电模块,该模块电源输入加一路前面提到的pmos控制,尚未测试电池可以管多久。反正我现在是每天给它充电5min。
这部分还自己写了程序,后来想其实可以用3231的闹钟功能。这种思路似乎可以用于不支持备用电池供电的芯片?但是大多芯片其实都有这个vbat脚的。
4.main.c
1 #include <STC15.h>
2 #include <string.h>
3 #include "futaba_vfd.h"
4 #include "ds3231.h"
5 //#include "myiicForDs3231.h" //for init rst
6
7 sbit vpwr=P1^0;
8 sbit batcharge=P1^2;
9 //uart
10 unsigned char xdata RxBuffer[64]={0};
11 unsigned char UART_RX_NUM=0;
12 //display
13 bit reflash_flag=0;
14 bit dateOrTemp;
15 unsigned char normalTime[6];//mth day wk hr min sec
16 //charging
17 u8 lastChargeHour,lastChargeDay,chargingMinute;
18 bit chargingFlag;
19 //---------------------------------------------------------------------------------------//
20 void Uart_Init(void); //115200bps@12.000MHz
21 void Uart_Init(void); //115200bps@12.000MHz
22 void Uart_Send_String(unsigned char *str);
23 void Tim0_Init(void);//2ms
24
25
26 void DataDel(u8 *str,u8 len);
27 void CMD_Compare(void);
28 //---------------------------------------------------------------------------------------//
29
30 //---------------------------------------------------------------------------------------//
31 void main(void)
32 {
33 u8 i,lastMin;
34 u8 cnt_min;
35
36 Uart_Init();
37 Tim0_Init();
38 VFD_Init();
39 //DS3231IIC_Init();//do not need rst !!!
40 //ModifyTime(4,12,5,11,21,0);// 4-12 w5 tm11-21-00
41 Uart_Send_String("VFD Init done");
42 get_show(normalTime);
43 for (i=0;i<6;i++){
44 if (i==2){
45 VFD_DCRAM[5]=normalTime[2]+'0';//week
46 VFD_DCRAM[6]='-';
47 }
48 else{
49 VFD_DCRAM[2*i+1]=normalTime[i]/10+'0';
50 VFD_DCRAM[2*i+2]=normalTime[i]%10+'0';
51 }
52 }
53 lastChargeHour=normalTime[3];//record first boot hour as last charge hour
54 lastChargeDay=(normalTime[1]+1);//record first boot day-1 as last charge day
55 lastMin=normalTime[4]; //record last min
56
57 VFD_Write_ADRAM(AD_COLON2,1);
58 VFD_Write_ADRAM(AD_COLON3,1);
59 VFD_DCRAM_Load();
60 vpwr=0;//switch on pmos
61 batcharge=1;//turn off charging bat
62 while(1)
63 {
64 if (reflash_flag){//display interval
65 reflash_flag=0;
66
67 get_time(&normalTime[3]);//hr min sec
68 if (lastMin!=normalTime[4]){//pass 1 min??
69 lastMin=normalTime[4]; //update "last"min
70
71 get_date(normalTime);//read mth day wk
72 dateOrTemp=!dateOrTemp;//bit switch
73 if (dateOrTemp){ //1 for date
74
75 for (i=0;i<2;i++){
76 VFD_DCRAM[2*i+1]=normalTime[i]/10+'0';
77 VFD_DCRAM[2*i+2]=normalTime[i]%10+'0';
78 }
79 VFD_DCRAM[5]=normalTime[2]+'0';//week
80 VFD_DCRAM[6]='-';
81 }
82 else{ //0 for temp
83 //strncpy(&VFD_DCRAM[1],(const char*)"Temp",4);
84 get_show_Temperature(normalTime);
85 VFD_DCRAM[1]='T';
86 VFD_DCRAM[2]=normalTime[0]/10 + '0';
87 VFD_DCRAM[3]=normalTime[0]%10 + '0';
88 VFD_DCRAM[4]=0x19;//dot
89 VFD_DCRAM[5]='C';
90
91 }
92 if ((lastChargeHour==normalTime[3])&&(lastChargeDay!=normalTime[1])){//update charging reg
93 lastChargeDay=normalTime[1];//update the day of last charging
94 chargingFlag=1;
95 }
96 if (chargingFlag){//charging???
97 batcharge=0;//turn on charging
98 if (++chargingMinute>=2){
99 chargingMinute=0;
100 chargingFlag=0;
101 batcharge=1;//turn off charging
102 }
103 }
104 }
105 //update hr min sec
106 for (i=3;i<6;i++){
107 VFD_DCRAM[2*i+1]=normalTime[i]/10+'0';
108 VFD_DCRAM[2*i+2]=normalTime[i]%10+'0';
109 }
110 if ((normalTime[3]>=23)||(normalTime[3]<=5)){//auto dimming
111 VFD_Brt_Set(8);
112 }else VFD_Brt_Set(12);
113
114 VFD_DCRAM_Load();
115 }
116 //other
117 if(UART_RX_NUM&0x80)//uart catch
118 {
119 CMD_Compare();
120 }
121 }
122 }
123 void Tim0_Isr()interrupt 1
124 {
125 static u8 cnt_500ms;
126 if (++cnt_500ms>=250){
127 cnt_500ms=0;
128 reflash_flag=1;
129 //Uart_Send_String(".5s");
130 }
131 }
132 void Uart0_Isr()interrupt 4
133 {
134 unsigned char res=0;
135 if (RI)
136 {
137 RI=0;
138 res=SBUF;
139 if ((UART_RX_NUM&0x80)==0)//?????
140 {
141 if (UART_RX_NUM&0x40)//?????????
142 {
143 if (res!=0x0a)UART_RX_NUM=0;//?? rst
144 else UART_RX_NUM|=0x80; //????
145 }
146 else
147 {
148 if (res==0x0d)UART_RX_NUM|=0x40;//?????
149 else
150 {
151 RxBuffer[UART_RX_NUM&0x3f]=res;//????
152 UART_RX_NUM++;
153 if (UART_RX_NUM>63)UART_RX_NUM=0;
154 }
155 }
156 }
157 }
158 }
159 //---------------------------------------------------------------------------------------//
160 void DataDel(u8 *str,u8 len)
161 {
162 u8 i;
163 for (i=0;i<len-8;i++)
164 str[i]=str[i+8];
165 }
166 void CMD_Compare(void) //
167 {
168 u8 tmp[9]={0};
169 u8 i,len;
170
171 len=UART_RX_NUM&0x3f;//get the length
172 Uart_Send_String("\r\nWhat you have in put is:\r\n");
173 Uart_Send_String(RxBuffer);
174 Uart_Send_String("\r\n");
175 //get cmd
176 // for (i=0;i<8;i++)
177 // tmp[i]=RxBuffer[i];
178 strncpy(tmp,(const char*)RxBuffer,8);
179
180
181 //cmd explaine
182 if (strcmp("cmd_time",(const char*)tmp)==0)
183 {
184 Uart_Send_String("now modify time!\r\n");
185 DataDel(RxBuffer,len);//del cmd to get data
186 //combine the data && transport from ascii to value
187 //ModifyTime(4,12,5,11,21,0);// 4-12 w5 tm11-21-00
188 ModifyTime((RxBuffer[0]-'0')*10 + RxBuffer[1]-'0', //month
189 (RxBuffer[2]-'0')*10 + RxBuffer[3]-'0',//day
190 (RxBuffer[4]-'0'), //week
191 (RxBuffer[5]-'0')*10 + RxBuffer[6]-'0',//hr
192 (RxBuffer[7]-'0')*10 + RxBuffer[8]-'0',//min
193 (RxBuffer[9]-'0')*10 + RxBuffer[10]-'0');//sec
194 }
195 else if (strcmp("cmd_dimm",(const char*)tmp)==0)
196 {
197 Uart_Send_String("now modify brightness!\r\n");
198 DataDel(RxBuffer,len);//del cmd to get data
199 i=(RxBuffer[0]-'0')*100+(RxBuffer[1]-'0')*10+(RxBuffer[2]-'0');
200 VFD_Brt_Set(i);
201 Uart_Send_String("dimming (0-240):");Uart_Send_String(RxBuffer);
202 }
203 else if (strcmp("cmd_svfd",(const char*)tmp)==0)
204 {
205 Uart_Send_String("switch on or off vfd!\r\n");
206 DataDel(RxBuffer,len);//del cmd to get data
207 VFD_Disp_On_Off(RxBuffer[0]-'0');
208 }
209 else if(strcmp("cmd_spwr",(const char*)tmp)==0)
210 {
211 Uart_Send_String("switch on or off lamp pwr!\r\n");
212 DataDel(RxBuffer,len);//del cmd to get data
213 vpwr=RxBuffer[0]-'0';
214 }
215 else if(strcmp("cmd_sbat",(const char*)tmp)==0)
216 {
217 Uart_Send_String("start charging bat!\r\n");
218 lastChargeHour=normalTime[3];//update charge hour
219 lastChargeDay=normalTime[1];//update the day of last charging
220 }
221 VFD_DCRAM_Load();
222 //clr
223 for (i=0;i<len;i++)
224 RxBuffer[i]=0;
225 UART_RX_NUM=0;//clr
226 }
227
228
229
230 void Tim0_Init(void){
231 AUXR &= 0x7F; //?????12T??
232 TMOD &= 0xF0; //???????
233 TL0 = 0x30; //??????
234 TH0 = 0xF8; //??????
235 TR0 = 1; //???0????
236 ET0=1;
237 EA=1;
238 }
239
240 void Uart_Init(void) //115200bps@12.000MHz
241 {
242 SCON = 0x50; //8???,?????
243 AUXR |= 0x01; //??1?????2???????
244 AUXR |= 0x04; //???2???Fosc,?1T
245 T2L = 0xE6; //??????
246 T2H = 0xFF; //??????
247 AUXR |= 0x10; //?????2
248 ES=1;
249 }
250
251 void Uart_Send_Data(unsigned char dat)
252 {
253 SBUF = dat;
254 //while(!Uart_Snd_Flag);
255 //Uart_Snd_Flag = 0;
256 while(!TI);
257 TI=0;
258 }
259
260 void Uart_Send_String(unsigned char *str)
261 {
262 while(*str)
263 {
264 Uart_Send_Data(*str++);
265 }
266 }
267 //---------------------------------------------------------------------------------------//
主函数就是简单时钟读取和显示,电池充电控制逻辑。串口部分直接沿用以前代码,稍加修改就可以用了。
更多功能留给后续修改实现。电池待机时间有待测试,充电应该改为闹钟控制。
放图
未完待续。。。。
来源:oschina
链接:https://my.oschina.net/u/4389538/blog/3226307