无意间发现EEPROM stc8H8K64写入读出数据不能超过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功能
- }
-
- void main(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以后自动加40 0x0008 这个位没有写,按道理位255 1111111,但是一字节读出来295!!!
|