负熵 发表于 2022-12-12 12:12

请教个sprintf函数问题

想玩个rtc时间显示,在格式化时间时用了sprintf函数,最后出来的结果一直不对,请教下是哪里的问题。
uchar t=0;
   
    char time_display,time_display_hour,time_display_min,time_display_sec;
    if(t!=calendar.sec)
    {
      
      t=calendar.sec;
      if(calendar.hour<=9)
      {
      sprintf (time_display_hour,"0%d",calendar.hour);
      }
      else
      {
      sprintf (time_display_hour,"%d",calendar.hour);
      }
      if(calendar.min<=9)
      {
      sprintf (time_display_min,"0%d",calendar.min);
      }
      else
      {
      sprintf (time_display_min,"%d",calendar.min);
      }
      if(calendar.sec<=9)
      {
      sprintf (time_display_sec,"0%d",calendar.sec);
      }
      else
      {
      sprintf (time_display_sec,"%d",calendar.sec);
      }
      
      
      sprintf (time_display,"%d:%d:%d",time_display_hour,time_display_min,time_display_sec);
      display_GB2312_string(1,1,time_display);



Pretext 发表于 2022-12-12 14:07

哪里出问题了?第一个显示的是【\0】?

jerkoh 发表于 2022-12-12 14:38

没细看,结束就是0x00,注意时间是不是BCD码   HEX吗转换显示问题

负熵 发表于 2022-12-12 17:59

jerkoh 发表于 2022-12-12 14:38
没细看,结束就是0x00,注意时间是不是BCD码   HEX吗转换显示问题

获取的时,分,秒是calendar.hour,calendar.min,calendar.sec,如果是
sprintf (time_display,"%d:%d:%d",calendar.hour,calendar.min,calendar.sec);
可以正常显示,就是小于10时10分10秒之显示一位,感觉不好看,想做成0x的格式,结果显示的内容就这样了。

luobeihai 发表于 2022-12-12 22:26

本帖最后由 luobeihai 于 2022-12-12 22:40 编辑

你这个代码问题也太多了吧。
1、你想格式化时间输出,小于10的时候,前面你想补0,这样好看。那你可以用格式 %02d控制格式化输出啊。
sprintf (time_display_hour,"%02d",calendar.hour);
sprintf (time_display_min,"%02d",calendar.min);
sprintf (time_display_sec,"%02d",calendar.sec);
这样子不就少了很多无用的代码了么。

2、你定义的 time_display_hour,time_display_min,time_display_sec; 这几个局部变量,都是2字节的。但是你的 calendar.hour/min/sec 这个结构体的成员变量,他们的范围是多少。很明显不可能只有2字节(就算是char型,最大也可能转换成3字节字符串),这样转换之后输出的字符串就不止2字节了。而你就这样存储到2个字节的变量中,肯定内存越界了啊。你可以把那几个时分秒的数组定义大一些。

jerkoh 发表于 2022-12-13 08:13

本帖最后由 jerkoh 于 2022-12-13 08:18 编辑

负熵 发表于 2022-12-12 17:59
获取的时,分,秒是calendar.hour,calendar.min,calendar.sec,如果是
sprintf (time_display,"%d:%d:% ...
PCF8563 ,BCD时间 如下 参考
typedef struct
{
      unsigned char RTC_Hours;//小时
      unsigned char RTC_Minutes;//分钟
      unsigned char RTC_Seconds;//秒钟
      unsigned char Reseved;//保留
}_PCF8563_Time_Typedef;


typedef struct
{
      unsigned char RTC_Years;//年份
      unsigned char RTC_Months;//月份
      unsigned char RTC_Days;//日期
      unsigned char RTC_WeekDays;//星期,数值范围:0 ~ 6
}_PCF8563_Date_Typedef;



_PCF8563_Time_Typedef* HMS;
_PCF8563_Date_Typedef* YWMD;

char text;
//          YWMD->RTC_Years=0x22;   //22年
//          YWMD->RTC_Months=0x11;//11月
//          YWMD->RTC_Days=0x05;   //5日
//          YWMD->RTC_WeekDays=0x06; //周六
//          HMS->RTC_Hours=0x17;//17时
//          HMS->RTC_Minutes=0x58;//58分
//          HMS->RTC_Seconds=inc_cnt++;
    sprintf(text, "20%02X", YWMD->RTC_Years);
    sprintf(text + 4, "-%02X", YWMD->RTC_Months);
    sprintf(text + 7, "-%02X", YWMD->RTC_Days);
    sprintf(text + 10, " %02X", HMS->RTC_Hours);
    sprintf(text + 13, ":%02X", HMS->RTC_Minutes);
    sprintf(text + 16, ":%02X", HMS->RTC_Seconds);
显示text   2022-11-0517:58:01


公羊子丹 发表于 2024-10-11 07:17


应在操作时间内将胶料灌注完毕,否则影响流平

万图 发表于 2024-10-11 08:20


测试负载测试是在特定的测试条件下进行的

Uriah 发表于 2024-10-11 09:23


在测试中,可以改变负载电流,得到最大输出电流和输出电压

帛灿灿 发表于 2024-10-11 11:19


信号防雷电路应满足相应接口信号传输速率及带宽的需求,且接口与被保护设备兼容。

Bblythe 发表于 2024-10-11 12:22


随着对电路板模块的需求增加

周半梅 发表于 2024-10-11 14:18


防雷电路的输出残压值必须比被防护电路自身能够耐受的过电压峰值低,并有一定裕量

Pulitzer 发表于 2024-10-11 15:21


模信号是幅度相等且相位相同的信号

童雨竹 发表于 2024-10-11 17:17


Cfinal是CESD和人体电容的并联组合

Wordsworth 发表于 2024-10-11 18:20


构成各种滤波器对EMI进行滤波

Clyde011 发表于 2024-10-11 19:23


在动态测试之前,首先需要设定测试时间和测试频率
页: [1]
查看完整版本: 请教个sprintf函数问题