收拾东西的时候又看到之前收拾的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 //---------------------------------------------------------------------------------------//
主函数就是简单时钟读取和显示,电池充电控制逻辑。串口部分直接沿用以前代码,稍加修改就可以用了。
更多功能留给后续修改实现。电池待机时间有待测试,充电应该改为闹钟控制。
放图
未完待续。。。。