找回密码
 立即注册

QQ登录

只需一步,快速开始

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

请教程序简化及STC15单片机eeprom存储的问题?

[复制链接]
跳转到指定楼层
楼主
ID:86421 发表于 2024-10-1 14:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现有一程序如下:
if(pc==1)
{
RD1[0]=.......
RD1[1]=.......
RD1[2]=.......
}
if(pc==2)
{
GD1[0]=.......
GD1[1]=.......
GD1[2]=.......
}
如何简化一下?如:
设一下中间变量X
if(pc==1)X=RG1
if(pc==2)X=GG1
X[0]=.......
X[1]=.......
X[2]=.......

另外,STC15单片机eeprom存储中,本人只会一个变量的存储,如X=IAPreadbyte(IAP_ADDRESS);假如多个变量X1,X2,X3,...X8,应该如何写程序?因为单片机只有两个扇区,要先擦除,一擦除就得一个扇区一个扇区的。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:404160 发表于 2024-10-1 16:49 | 只看该作者
下面是一个简化的示例:

c
// 定义两个数组
int RD1[3];
int GD1[3];

// 定义一个指针数组
int (*X)[3];

// 根据pc的值选择数组
if(pc == 1) {
    X = RD1;
} else if(pc == 2) {
    X = GD1;
}

// 现在可以使用X来赋值
X[0] = ...;
X[1] = ...;
X[2] = ...;
这样,你只需要根据pc的值来选择不同的数组,然后通过X来赋值,从而避免了冗余的if语句。

对于你的第二个问题,关于STC15单片机的EEPROM存储多个变量,你可以使用一个结构体来存储这些变量,然后一次性读取或写入整个结构体。下面是一个示例:

c
// 定义一个结构体来存储多个变量
typedef struct {
    int X1;
    int X2;
    int X3;
    int X4;
    int X5;
    int X6;
    int X7;
    int X8;
} MyData;

// 定义一个变量来存储数据
MyData myData;

// 读取数据
void ReadData() {
    // 假设IAP_ADDRESS是起始地址
    int i;
    for(i = 0; i < sizeof(MyData); i++) {
        ((char*)&myData)[i] = IAPreadbyte(IAP_ADDRESS + i);
    }
}

// 写入数据
void WriteData() {
    // 假设IAP_ADDRESS是起始地址
    int i;
    for(i = 0; i < sizeof(MyData); i++) {
        IAPwritebyte(IAP_ADDRESS + i, ((char*)&myData)[i]);
    }
}
在这个示例中,我们定义了一个MyData结构体来存储8个变量。然后,我们定义了一个myData变量来存储数据。在ReadData函数中,我们逐个字节地读取EEPROM中的数据,并将其存储到myData中。在WriteData函数中,我们逐个字节地将myData中的数据写入EEPROM。

请注意,这里的IAPreadbyte和IAPwritebyte函数是假设的函数名,你需要根据你的实际情况来替换它们。同时,你需要确保在写入数据之前已经正确地擦除了EEPROM的相应扇区。
回复

使用道具 举报

板凳
ID:86421 发表于 2024-10-1 17:24 | 只看该作者
飞云居士 发表于 2024-10-1 16:49
下面是一个简化的示例:

c

感谢你的指导。谢谢!
回复

使用道具 举报

地板
ID:1109793 发表于 2024-10-1 17:42 | 只看该作者
沙发的方法如果两个数组的内容是一样的,可以,不一样就不行了吧。
存储问题,也可以用数组。我就用数组一次性存100多个字节的。只是有的是char有的int,有的甚至是bit,存储时都按照int来搞,比较浪费空间。如果是结构体就会节省一些。但是访问我感觉不如数组,比如数组用一个循环遍访所有成员,结构体就不太会搞。
回复

使用道具 举报

5#
ID:86421 发表于 2024-10-1 18:04 | 只看该作者
飞云居士 发表于 2024-10-1 16:49
下面是一个简化的示例:

c

第二个存储的问题已经明白了,感谢。第一个问题其实是一个双色3264点阵屏的,我想做一个配色,按键调整。将配色数据(0,1,2三种,红绿黄)原程序是:
uchar data RD1[8];        //红数据缓存
uchar data RD2[8];
uchar data GD1[8];        //绿数据缓存
uchar data GD2[8];
unsigned char pc=0;   //配色标志


void display1(void)
{
  uchar  (*X)[8];       
  if(pc==0) X=RD1;
  if(pc==1) X=GD1;
  if(pc==1) X=GD1=RD1;       
         X[0]=SZG[hour/10][row];
         X[1]=SZG[hour%10][row];
         if(SHAN) X[2]=TABS[10][row];else X[2]=TABS[11][row];
         X[3]=SZG[min/10][row];
         X[4]=SZG[min%10][row];
         if(SHAN) X[5]=TABS[10][row];else X[5]=TABS[11][row];
         X[6]=SZG[sec/10][row];
         X[7]=SZG[sec%10][row];
}

上面的代码编译不过呀?百忙之中烦请指导一下。

回复

使用道具 举报

6#
ID:404160 发表于 2024-10-1 18:33 | 只看该作者
xiaobendan001 发表于 2024-10-1 17:42
沙发的方法如果两个数组的内容是一样的,可以,不一样就不行了吧。
存储问题,也可以用数组。我就用数组一 ...

你可以定义一个结构体来包含所有变量:

typedef struct {
    uint8_t x1;
    uint8_t x2;
    uint8_t x3;
    // 添加更多变量...
    uint8_t x8;
} EEPROM_Data;

EEPROM_Data eData;
回复

使用道具 举报

7#
ID:404160 发表于 2024-10-1 18:35 | 只看该作者
xiaobendan001 发表于 2024-10-1 17:42
沙发的方法如果两个数组的内容是一样的,可以,不一样就不行了吧。
存储问题,也可以用数组。我就用数组一 ...

可以用字节型指针,用size偶发()函数做要写入的长度
回复

使用道具 举报

8#
ID:404160 发表于 2024-10-1 18:37 | 只看该作者
xiaobendan001 发表于 2024-10-1 17:42
沙发的方法如果两个数组的内容是一样的,可以,不一样就不行了吧。
存储问题,也可以用数组。我就用数组一 ...

下面是一个示例,展示如何定义一个包含不同类型成员的结构体,并如何使用循环来遍历这些成员:

c
#include <stdint.h>

// 定义一个结构体,包含不同类型的成员
typedef struct {
    char c;
    int i;
    unsigned char bitField:1;
    unsigned char anotherField:3;
} MyStruct;

// 定义一个结构体数组
MyStruct myArray[100];

// 定义一个函数来遍历结构体数组
void TraverseStructArray() {
    for (int index = 0; index < 100; index++) {
        // 访问每个结构体的成员
        char c = myArray[index].c;
        int i = myArray[index].i;
        unsigned char bitField = myArray[index].bitField;
        unsigned char anotherField = myArray[index].anotherField;

        // 根据需要处理每个成员
        // ...
    }
}

// 定义一个函数来读取结构体数组
void ReadStructArray(uint16_t IAP_ADDRESS) {
    for (int index = 0; index < 100; index++) {
        // 假设IAPreadbyte是读取单个字节的函数
        myArray[index].c = IAPreadbyte(IAP_ADDRESS++);
        myArray[index].i = (IAPreadbyte(IAP_ADDRESS++) << 8) | IAPreadbyte(IAP_ADDRESS++);
        // 注意:位字段需要特殊处理,这里只是一个示例
        myArray[index].bitField = (IAPreadbyte(IAP_ADDRESS++) >> 7) & 0x01;
        myArray[index].anotherField = (IAPreadbyte(IAP_ADDRESS++) >> 5) & 0x07;
    }
}

// 定义一个函数来写入结构体数组
void WriteStructArray(uint16_t IAP_ADDRESS) {
    for (int index = 0; index < 100; index++) {
        // 假设IAPwritebyte是写入单个字节的函数
        IAPwritebyte(IAP_ADDRESS++, myArray[index].c);
        IAPwritebyte(IAP_ADDRESS++, myArray[index].i >> 8);
        IAPwritebyte(IAP_ADDRESS++, myArray[index].i & 0xFF);
        // 注意:位字段需要特殊处理,这里只是一个示例
        IAPwritebyte(IAP_ADDRESS++, (myArray[index].bitField << 7) | (myArray[index].anotherField << 4));
    }
}
在这个示例中,我们定义了一个包含字符、整数和位字段的MyStruct结构体。然后,我们定义了一个包含100个这种结构体的数组myArray。

在TraverseStructArray函数中,我们使用一个循环来遍历数组中的每个结构体,并访问其成员。

在ReadStructArray和WriteStructArray函数中,我们使用循环来读取或写入结构体数组。对于位字段,我们需要特别注意,因为它们不是单独的字节,而是共享同一个字节的不同位。在这个示例中,我们假设IAPreadbyte和IAPwritebyte是读取和写入单个字节的函数。

回复

使用道具 举报

9#
ID:86421 发表于 2024-10-2 08:13 | 只看该作者
1qaz2wsx77 发表于 2024-10-1 18:04
第二个存储的问题已经明白了,感谢。第一个问题其实是一个双色3264点阵屏的,我想做一个配色,按键调整。 ...

第一个问题已解决。uchar  (*X)[8];改为uchar  *X;就可以了。
指针与数组的关系 当一个指针变量被初始化成数组名时,就说该指针变量指向了数组。如: char str[20], *ptr;
ptr=str;
ptr 被置为数组 str 的第一个元素的地址,因为数组名就是该数组的首地址, 也是数组第一个元素的地址。此时可以认为指针 ptr 就是数组 str(反之不成立), 这样原来对数组的处理都可以用指针来实现。如对数组元素的访问,既可以用下 标变量访问,也可以用指针访问。
回复

使用道具 举报

10#
ID:161164 发表于 2024-10-2 09:03 | 只看该作者
1qaz2wsx77 发表于 2024-10-1 18:04
第二个存储的问题已经明白了,感谢。第一个问题其实是一个双色3264点阵屏的,我想做一个配色,按键调整。 ...

因为他贴的是AI答案,专坑新手
  1. void display1(void)
  2. {
  3.         uchar  *X;
  4.         if(pc==0) X=RD1;
  5.         if(pc==1) X=GD1;
  6.        
  7.         X[0]=SZG[hour/10][row];
  8.         X[1]=SZG[hour%10][row];
  9.        
  10.         if(SHAN) X[2]=TABS[10][row];
  11.         else X[2]=TABS[11][row];
  12.        
  13.         X[3]=SZG[min/10][row];
  14.         X[4]=SZG[min%10][row];
  15.        
  16.         if(SHAN) X[5]=TABS[10][row];
  17.         else X[5]=TABS[11][row];
  18.        
  19.         X[6]=SZG[sec/10][row];
  20.         X[7]=SZG[sec%10][row];
  21. }
复制代码
回复

使用道具 举报

11#
ID:1128898 发表于 2024-10-2 14:00 | 只看该作者
指针呗,缓冲区域数组多维,然后内核线程逻辑双开
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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