找回密码
 立即注册
查看: 270|回复: 2

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

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:11
  • 最近打卡:2025-01-10 09:12:27
已绑定手机

5

主题

16

回帖

123

积分

注册会员

积分
123
发表于 2024-12-30 08:56:13 | 显示全部楼层 |阅读模式
无意间发现EEPROM  stc8H8K64写入读出数据不能超过127,否则自动加40。

具体情况如下:
  1. #include <STC8H.H>
  2. //#include <AI8H.H>
  3. #include <stdio.h>
  4. #include "drive_oled.h"
  5. #include "drive_iic.h"
  6. #include "drive_delay.h"
  7. #include "drive_bmp.h"
  8. #include "drive_time.h"
  9. #include "drive_ADC.h"
  10.                 unsigned long nm = 0;
  11.                 int num  = 0;  // 定义要显示的数值变量,并初始化为0
  12. void IapIdle()
  13. {
  14.     IAP_CONTR = 0;                              //关闭IAP功能
  15.     IAP_CMD = 0;                                //清除命令寄存器
  16.     IAP_TRIG = 0;                               //清除触发寄存器
  17.     IAP_ADDRH = 0x80;                           //将地址设置到非IAP区域
  18.     IAP_ADDRL = 0;
  19. }
  20. char IapRead(int addr)
  21. {
  22.     char dat;
  23.     IAP_CONTR = 0x80;                           //使能IAP
  24.     IAP_TPS = 12;                               //设置等待参数12MHz
  25.     IAP_CMD = 1;                                //设置IAP读命令
  26.     IAP_ADDRL = addr;                           //设置IAP低地址
  27.     IAP_ADDRH = addr >> 8;                      //设置IAP高地址
  28.     IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
  29.     IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
  30.     _nop_();
  31.     _nop_();
  32.             _nop_();
  33.             _nop_();
  34.     dat = IAP_DATA;                             //读IAP数据
  35.     IapIdle();                                  //关闭IAP功能
  36.     return dat;
  37. }
  38. void IapProgram(int addr, char dat)
  39. {
  40.     IAP_CONTR = 0x80;                           //使能IAP
  41.     IAP_TPS = 12;                               //设置等待参数12MHz
  42.     IAP_CMD = 2;                                //设置IAP写命令
  43.     IAP_ADDRL = addr;                           //设置IAP低地址
  44.     IAP_ADDRH = addr >> 8;                      //设置IAP高地址
  45.     IAP_DATA = dat;                             //写IAP数据
  46.     IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
  47.     IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
  48.     _nop_();
  49.     _nop_();
  50.             _nop_();
  51.             _nop_();
  52.     IapIdle();                                  //关闭IAP功能
  53. }
  54. void IapErase(int addr)
  55. {
  56.     IAP_CONTR = 0x80;                           //使能IAP
  57.     IAP_TPS = 12;                               //设置等待参数12MHz
  58.     IAP_CMD = 3;                                //设置IAP擦除命令
  59.     IAP_ADDRL = addr;                           //设置IAP低地址
  60.     IAP_ADDRH = addr >> 8;                      //设置IAP高地址
  61.     IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
  62.     IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
  63.     _nop_();
  64.     _nop_();
  65.             _nop_();
  66.             _nop_();
  67. IapIdle();                                  //关闭IAP功能
  68. }
  69. void  main(void)
  70. {
  71.                 P_SW2 |= 0x80;
  72.     P0M0 = 0x00; P0M1 = 0x00;
  73.     P1M0 = 0x00; P1M1 = 0x00;
  74.     P2M0 = 0x00; P2M1 = 0x00;
  75.     P3M0 = 0x00; P3M1 = 0x00;
  76.     P4M0 = 0x00; P4M1 = 0x00;
  77.     P5M0 = 0x00; P5M1 = 0x00;
  78.     P6M0 = 0x00; P6M1 = 0x00;
  79.     P7M0 = 0x00; P7M1 = 0x00;
  80.         Timer0_init();
  81.         InitADC();
  82.         iicInit();
  83.         OLED_Init();//初始化OLED
  84.         OLED_ColorTurn(0);//0正常显示,1 反色显示
  85.   OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示
  86.         EA = 1;
  87.         while(1)
  88.         {               
  89. P0M0 = 0x00;P0M1 = 0x00;P1M0 = 0x00;P1M1 = 0x00;
  90.     P2M0 = 0x00;P2M1 = 0x00;P3M0 = 0x00;P3M1 = 0x00;
  91.     P4M0 = 0x00;P4M1 = 0x00;P5M0 = 0x00;P5M1 = 0x00;
  92. IapErase(0x0000);
  93.                                 delayMs(20);
  94.     IapProgram(0x0000, 125);
  95.                                 delayMs(20);
  96.     IapProgram(0x0002, 126);
  97.                                 delayMs(20);
  98.     IapProgram(0x0004, 127);
  99.                                 delayMs(20);
  100.     IapProgram(0x0006, 128);
  101.                                 delayMs(20);
  102. while (1)
  103.                         {       
  104.                 OLED_ShowNum(88,1,num,4,8);                //  列*行*字*位数*字体大小
  105.                 delayMs(20);               
  106.                 OLED_ShowNum(1,2,IapRead(0x0000),3,8);
  107.                 delayMs(20);               
  108.                 OLED_ShowNum(1,4,IapRead(0x0002),3,8);
  109.                 delayMs(20);               
  110.                 OLED_ShowNum(1,6,IapRead(0x0004),3,8);
  111.                 delayMs(20);               
  112.                 OLED_ShowNum(50,2,IapRead(0x0006),3,8);
  113.                 delayMs(20);
复制代码
if(nm >=300)

{

nm=0;

num++;

if(num >= 100)

{

num=0;

}

                               
}



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

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:463
  • 最近打卡:2025-06-17 17:53:48

33

主题

2448

回帖

5174

积分

论坛元老

积分
5174
发表于 2024-12-30 09:01:25 | 显示全部楼层
我觉得 你应该用一些更底层的显示手段,,比如说用串口输出出来,,
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:11
  • 最近打卡:2025-01-10 09:12:27
已绑定手机

5

主题

16

回帖

123

积分

注册会员

积分
123
发表于 2024-12-30 09:48:39 | 显示全部楼层
_奶*** 发表于 2024-12-30 09:01
我觉得 你应该用一些更底层的显示手段,,比如说用串口输出出来,,

O   那我试试

截图202412300958512313.jpg



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




但是读书295   这个啥不对




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

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


回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-18 00:21 , Processed in 0.152266 second(s), 61 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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