找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1909|回复: 9
打印 上一主题 下一主题
收起左侧

单片机C语言怎样分解变量?

[复制链接]
跳转到指定楼层
楼主
ID:965189 发表于 2022-7-6 22:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以前这样可以的
uint bnm;                //16位变量
uchar bnmh,bnml;   //变量的高8位,低8位
void main()
{
   bnmh=bnm/256;
   bnml=bnm%256;
   bnm=bnmh*256+bnml;
   IapErase(0x0400);             //扇区擦除
   IapProgram(0x0400,bnmh);    //保存高8位
   IapProgram(0x0401,bnml);    //保存低8位
}
以前STC15F单片机保存后读出的数正常。现在用STC8G2K64S4,保存读出不正常了。频率提高了,发现要调整的地方都调了。其它功能正常,就这个16位变量结果不对。
各位还有其它方法吗?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1036305 发表于 2022-7-7 08:52 | 只看该作者
可能是类型转换的问题,试试这样写:

bnmh=(uchar)(bnm>>8 &0XFF);
bnml=(uchar)(bnm%256 & 0xFF);
回复

使用道具 举报

板凳
ID:814525 发表于 2022-7-7 08:59 | 只看该作者
STC8G2K64S4的EEPROM为IAP类型,应该是存储地址不对
回复

使用道具 举报

地板
ID:883242 发表于 2022-7-7 09:31 | 只看该作者
显然是两个单片机的IapProgram()不一样导致的。
回复

使用道具 举报

5#
ID:213173 发表于 2022-7-7 09:56 | 只看该作者
STC8G2K64S4是IAP型,没有固定EEPROM地址,使用前需要把EEPROM地址定位到用户程序结束后一个扇区和最后一个扇区之间的任意扇区。代码示例:
        IapErase(0xA800);             //扇区擦除
        IapProgram(0xA800,bnm>>8);    //保存高8位
        IapProgram(0xA800+1,bnm);    //保存低8位
回复

使用道具 举报

6#
ID:401564 发表于 2022-7-7 10:00 | 只看该作者
如果是你的代码曾经在STC15F上成功过,那问题点就不是出在变量分解上,而是出现EEPROM的函数上
回复

使用道具 举报

7#
ID:965189 发表于 2022-7-7 11:35 | 只看该作者
wulin 发表于 2022-7-7 09:56
STC8G2K64S4是IAP型,没有固定EEPROM地址,使用前需要把EEPROM地址定位到用户程序结束后一个扇区和最后一个 ...

按你和各位大侠的提示,我改变目标地址后可以存取了。还有一个问题请教大侠,你写的分解很简洁,读出来后怎样组合呢?请给个示例学习学习。
回复

使用道具 举报

8#
ID:195496 发表于 2022-7-7 11:57 | 只看该作者
分解变量用联合,不过每种平台要确认大小端问题
回复

使用道具 举报

9#
ID:213173 发表于 2022-7-7 13:49 | 只看该作者
君工创 发表于 2022-7-7 11:35
按你和各位大侠的提示,我改变目标地址后可以存取了。还有一个问题请教大侠,你写的分解很简洁,读出来后 ...

      bnm=IapReadByte(0xA800)<<8 | IapReadByte(0xA800+1);
回复

使用道具 举报

10#
ID:965189 发表于 2022-7-7 14:02 | 只看该作者
wulin 发表于 2022-7-7 13:49
bnm=IapReadByte(0xA800)

非常多谢大侠指教。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表