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
我觉得 你应该用一些更底层的显示手段,,比如说用串口输出出来,,
O 那我试试
试了端口显示正常255 亮8个灯
但是读书295 这个啥不对
10:40
自己把自己蠢哭了,读取返回的值是char类型,最大只能-127~127
结果我总要写128.。。。。。。。。。。。。。。。
页:
[1]