头像-74885

执念.执战

  • 单片机 嵌入式 RF/无线 电源技术 模拟技术

个人成就

获得 5 次赞

帮助过14人

结构体在单片机上输出错误

typedef unsigned char uint8_t;  typedef struct { uint8_t dat; int temp; }Tempsave; void Test_Transform_temp(void){ int temp; uint8_t dat1,dat2; uint8_t dat[10]; Tempsave tem; tem.dat=50; tem.temp=110; dat1=tem.dat; temp=tem.temp; sprintf(dat,"%d,%05d\n",dat1,temp);                //sprintf(dat,"%d,%05d\n",tem.dat,tem.temp);//j结果一样 // printf(dat);//电脑上输出正确 USART_SendStr("transform test: "); USART_SendStr(dat);//单片机输出就不对 }这么一段代码,STVD编译的STM8L单片机中就是输出不对,为12800,25600,改变赋值,输出也改变。特意在电脑用软件编译运行了一下,没错啊,电脑上输出结果正确。又换了个单片机,用keil,运行也是这样。debug 查看数据tem.dat=50,和tem.temp=110数据对,dat1=tem.dat; 这一步,dat1 是0,temp=tem.temp;后面的temp是138。就算直接将tem.dat 赋值到sprintf中,也错。以前用也没觉得有啥问题,突然出现这么个错误,我又去查了下结构体的使用,没错啊。总感觉和正确结果就那么一道窗户纸的距离,但是找了半天,捅到的都是墙。求指点,谢谢。

W25Qxx存储温度,有什么好的格式吗?

    长期保存数据,需要精确到分钟。有可能频繁修改温度获取间隔。我的想法是加入年跳转,跳转到月跳转,然后指向一页,页首是后面一段的起始时间、获取间隔信息。每次修改间隔或过了一个月等数据就会新增一个月跳转,指向新的页。如果只是简单的不修改,无论是获取还是存储都很快。可是一旦温度间隔频繁修改了,那月跳转就会大量增多,留的地址很快就不够了,而且同一月份重复过多,检索就费事了。所以求一个保存格式。好检索,好跳转,支持频繁修改,非温度信息占用空间少的。谢谢,给个思路就好。

STM8L152M 8个COM驱动的LCD的亮度问题

LCD用了8个COM口,21个SEG口,驱动前四个COM口液晶显示很亮,可以一旦切换到第二页,显示后四个COM端,液晶亮度就下来了,暗了一些。理论上只显示COM4-7,其他的什么不变,不是和显示前四个COM口一样吗?而且两个页都显示的话两个页的内容亮度都和单显示第二页亮度一样暗(不是一半亮一半暗)。比如一个位于SEG1的8个COM正好是一个段码管,只显示前四个(上半段),不要用LCD_PageSelect(LCD_PageSelection_SecondPage); 函数,那么是正常最亮的,一旦用了这个函数,亮度就下降了。如果是频率等原因的话,那只显示后半段不应该和只显示前半段一样吗?可是实际就是变暗了。初始化中其他参数都调了,就是无法让第二页显示为只显示第一页的亮度(注意,当第二页显示后,第一页的亮度下降和第二页一样,不是一半亮一半暗。所以也不是后四个COM口的引脚的原因。所有引脚都未占用。)请问有遇到过的吗?或者怎么调试啊?液晶屏除了亮度,其他已经能够使用。但是由于亮度不是最亮,上边不给通过啊。STM8L152M 单片机的初始化代码如下:CLK_PeripheralClockConfig(CLK_Peripheral_LCD, ENABLE);//LCD驱动时钟门控使能CLK_RTCClockConfig(CLK_RTCCLKSource_LSI, CLK_RTCCLKDiv_2);//配置RTC LSI或LSE LCD_DeInit( );//LCD相关寄存器恢复初值LCD_Init(LCD_Prescaler_2, LCD_Divider_16,//LCD驱动初始化,LCD刷新频率LCD_Duty_1_8, LCD_Bias_1_3,//1/8DUTY 1/3BIAS,看屏幕参数LCD_VoltageSource_External);//选择LCD驱动电源,外部或内部LCD_PortMaskConfig(LCD_PortMaskRegister_0, 0xFF); //SEG0-7,STM8L152K4T6没有LCD_PortMaskConfig(LCD_PortMaskRegister_1, 0xFF); //SEG8-SEG15,STM8L参考手册228页LCD_PortMaskConfig(LCD_PortMaskRegister_2, 0x7F); //SEG用到了21,多了的话和其他的冲突会死机LCD_PortMaskConfig(LCD_PortMaskRegister_3, 0x00);LCD_PortMaskConfig(LCD_PortMaskRegister_4, 0x00); LCD_PortMaskConfig(LCD_PortMaskRegister_5, 0x00);LCD_ContrastConfig(LCD_Contrast_3V0);//配置对比度LCD_DeadTimeConfig(LCD_DeadTime_0); //设置死区时间LCD_PulseOnDurationConfig(LCD_PulseOnDuration_1);// 配置LCD脉冲持续时间LCD_HighDriveCmd(DISABLE);LCD_Cmd(ENABLE);有一个现象,就是 初始化函数中 LCD_Duty_1_8 只有改为 LCD_Duty_1_4(只用四个COM口)时,前四个口才能最亮,换成 LCD_Duty_1_8 也变成和第二个那么暗了,所以应该是频率问题?占空比问题?可上面几个参数都调遍了啊..........求教用过的,给个建议或调试方法。