粪豆 发表于 2024-12-30 08:56:13

EEPROM读写问题?!一字节读出来295!!!

无意间发现EEPROMstc8H8K64写入读出数据不能超过127,否则自动加40。

具体情况如下:
#include <STC8H.H>
//#include <AI8H.H>


#include <stdio.h>
#include "drive_oled.h"
#include "drive_iic.h"
#include "drive_delay.h"
#include "drive_bmp.h"
#include "drive_time.h"
#include "drive_ADC.h"

                unsigned long nm = 0;
                int num= 0;// 定义要显示的数值变量,并初始化为0



void IapIdle()
{
    IAP_CONTR = 0;                              //关闭IAP功能
    IAP_CMD = 0;                              //清除命令寄存器
    IAP_TRIG = 0;                               //清除触发寄存器
    IAP_ADDRH = 0x80;                           //将地址设置到非IAP区域
    IAP_ADDRL = 0;
}

char IapRead(int addr)
{
    char dat;

    IAP_CONTR = 0x80;                           //使能IAP
    IAP_TPS = 12;                               //设置等待参数12MHz
    IAP_CMD = 1;                              //设置IAP读命令
    IAP_ADDRL = addr;                           //设置IAP低地址
    IAP_ADDRH = addr >> 8;                      //设置IAP高地址
    IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
    _nop_();
    _nop_();
          _nop_();
          _nop_();

    dat = IAP_DATA;                           //读IAP数据
    IapIdle();                                  //关闭IAP功能

    return dat;
}

void IapProgram(int addr, char dat)
{
    IAP_CONTR = 0x80;                           //使能IAP
    IAP_TPS = 12;                               //设置等待参数12MHz
    IAP_CMD = 2;                              //设置IAP写命令
    IAP_ADDRL = addr;                           //设置IAP低地址
    IAP_ADDRH = addr >> 8;                      //设置IAP高地址
    IAP_DATA = dat;                           //写IAP数据
    IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
    _nop_();
    _nop_();
          _nop_();
          _nop_();
    IapIdle();                                  //关闭IAP功能
}

void IapErase(int addr)
{
    IAP_CONTR = 0x80;                           //使能IAP
    IAP_TPS = 12;                               //设置等待参数12MHz
    IAP_CMD = 3;                              //设置IAP擦除命令
    IAP_ADDRL = addr;                           //设置IAP低地址
    IAP_ADDRH = addr >> 8;                      //设置IAP高地址
    IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
    _nop_();
    _nop_();
          _nop_();
          _nop_();
IapIdle();                                  //关闭IAP功能
}

voidmain(void)
{
                P_SW2 |= 0x80;
    P0M0 = 0x00; P0M1 = 0x00;
    P1M0 = 0x00; P1M1 = 0x00;
    P2M0 = 0x00; P2M1 = 0x00;
    P3M0 = 0x00; P3M1 = 0x00;
    P4M0 = 0x00; P4M1 = 0x00;
    P5M0 = 0x00; P5M1 = 0x00;
    P6M0 = 0x00; P6M1 = 0x00;
    P7M0 = 0x00; P7M1 = 0x00;

        Timer0_init();
        InitADC();
        iicInit();
        OLED_Init();//初始化OLED
        OLED_ColorTurn(0);//0正常显示,1 反色显示
OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示
        EA = 1;

        while(1)
        {               
P0M0 = 0x00;P0M1 = 0x00;P1M0 = 0x00;P1M1 = 0x00;
    P2M0 = 0x00;P2M1 = 0x00;P3M0 = 0x00;P3M1 = 0x00;
    P4M0 = 0x00;P4M1 = 0x00;P5M0 = 0x00;P5M1 = 0x00;
IapErase(0x0000);
                                delayMs(20);
    IapProgram(0x0000, 125);
                                delayMs(20);
    IapProgram(0x0002, 126);
                                delayMs(20);
    IapProgram(0x0004, 127);
                                delayMs(20);
    IapProgram(0x0006, 128);
                                delayMs(20);
while (1)
                        {       


                OLED_ShowNum(88,1,num,4,8);                //列*行*字*位数*字体大小

                delayMs(20);               
                OLED_ShowNum(1,2,IapRead(0x0000),3,8);
                delayMs(20);               
                OLED_ShowNum(1,4,IapRead(0x0002),3,8);
                delayMs(20);               
                OLED_ShowNum(1,6,IapRead(0x0004),3,8);
                delayMs(20);               
                OLED_ShowNum(50,2,IapRead(0x0006),3,8);
                delayMs(20);if(nm >=300)
{
nm=0;
num++;
if(num >= 100)
{
num=0;
}
                               
}


}
127以下读写全部正常128以后自动加400x0008这个位没有写,按道理位255   1111111,但是一字节读出来295!!!

_奶咖君_ 发表于 2024-12-30 09:01:25

我觉得 你应该用一些更底层的显示手段,,比如说用串口输出出来,,

粪豆 发表于 2024-12-30 09:48:39

_奶咖君_ 发表于 2024-12-30 09:01
我觉得 你应该用一些更底层的显示手段,,比如说用串口输出出来,,
O   那我试试





试了端口显示正常255 亮8个灯




但是读书295   这个啥不对




10:40
自己把自己蠢哭了,读取返回的值是char类型,最大只能-127~127

结果我总要写128.。。。。。。。。。。。。。。。


页: [1]
查看完整版本: EEPROM读写问题?!一字节读出来295!!!