久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1100|回復: 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,應該如何寫程序?因為單片機只有兩個扇區,要先擦除,一擦除就得一個扇區一個扇區的。
回復

使用道具 舉報

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來搞,比較浪費空間。如果是結構體就會節省一些。但是訪問我感覺不如數組,比如數組用一個循環遍訪所有成員,結構體就不太會搞。
回復

使用道具 舉報

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];
}

上面的代碼編譯不過呀?百忙之中煩請指導一下。

回復

使用道具 舉報

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;
回復

使用道具 舉報

ID:404160 發表于 2024-10-1 18:35 | 顯示全部樓層
xiaobendan001 發表于 2024-10-1 17:42
沙發的方法如果兩個數組的內容是一樣的,可以,不一樣就不行了吧。
存儲問題,也可以用數組。我就用數組一 ...

可以用字節型指針,用size偶發()函數做要寫入的長度
回復

使用道具 舉報

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是讀取和寫入單個字節的函數。

回復

使用道具 舉報

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(反之不成立), 這樣原來對數組的處理都可以用指針來實現。如對數組元素的訪問,既可以用下 標變量訪問,也可以用指針訪問。
回復

使用道具 舉報

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. }
復制代碼
回復

使用道具 舉報

ID:1128898 發表于 2024-10-2 14:00 | 顯示全部樓層
指針唄,緩沖區域數組多維,然后內核線程邏輯雙開
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人午夜电影在线观看 | 欧美日韩在线成人 | 欧美大片一区 | 亚洲精品乱码久久久久久按摩观 | 国产精品国产成人国产三级 | 亚洲午夜精品一区二区三区他趣 | 精品99在线| 亚洲精品福利在线 | 国产精品一区二区三区四区五区 | 在线91 | 精品乱码一区二区三四区视频 | 国产精品视频久久久久久 | 中日字幕大片在线播放 | 日韩在线观看 | 日本一区二区高清视频 | 成人影院午夜 | 久久精品91 | 亚洲一区二区三区四区五区午夜 | 国产精品乱码一区二区三区 | 99在线播放 | 麻豆久久久久久 | 成人欧美一区二区三区黑人孕妇 | 亚洲人精品 | 国产精品久久久久久久久久免费看 | 岛国av一区二区 | 日韩电影a | 欧美一区二区三区四区在线 | 午夜视频网站 | 欧美综合久久 | 亚洲综合在线播放 | 国产在线精品一区二区 | 你懂的免费在线 | 亚洲国产一区二区在线 | 午夜久久久久久久久久一区二区 | 农村黄性色生活片 | 天天干国产 | 俺去俺来也www色官网cms | 男女下面一进一出网站 | 九九热在线免费视频 | 伊人伊人伊人 | 夜夜操天天干 |