OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5696|回复: 3

初学内部EEPROM,应该是主程序出问题,但本人找不出来了,附带详细注释

[复制链接]

8

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2013-1-29
在线时间
0 小时
发表于 2013-2-4 11:40:32 | 显示全部楼层 |阅读模式


应该是主程序出问题,但本人找不出来了,本意是
往EEPROM中写入两位数,在数码管显示,然后擦除,
再写入一个加了1的数,循环往返,关闭开关,再打开,
能再继续显示之前的数 ,继续累加
,实验结果是数码管显示“01”一会儿在闪烁,
关闭开关,再打开依旧如此
#include"STC12C5A.h"
#include"intrins.h"
/*数码管动态显示程序,这部分经常使用,问题应该是不会出现在这里*/
int smg[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};//数码表
//74HC595的位定义
sbit HC595_REG=P0^6;
sbit HC595_RCK=P0^5;
sbit HC595_SCK=P0^4;
sbit HC595_SEG=P0^7;
//延时函数
void delay_ms(unsigned int time)
{
 unsigned int t;
 for(;time>0;time--)
 {
  t = 1500;
  while(t--);
 
 }
}
//向HC595发送一个字节
void HC595_send_byte(int byte)
{
  int i,temp;
 for(i=0;i<8;i++)
 {
   temp=byte&(1<<i);
  if(temp)
  {
    HC595_SEG=1; 
  }
  else
  {
    HC595_SEG=0;
  }
   HC595_SCK=1;
   HC595_SCK=0;
 }
 HC595_RCK=0;
 HC595_RCK=1; 
}
//数码管静态显示
void HC595_show_num(int num)
{
 HC595_send_byte(smg[num]);
}
//数码管后两位动态显示
void SMG_display(int dat)
{
   P0=0x00;
  HC595_show_num(dat/1000);
  delay_ms(2);
  P0=0x00;
  HC595_show_num(dat%1000/100);
  delay_ms(2);
  P0=0x04;
  HC595_show_num(dat%100/10);
  delay_ms(2);
  P0=0x08;
  HC595_show_num(dat%10);
  delay_ms(2);
}
/*内部EEPROM的读,写,擦除,经调试问题应该不是在这里*/
//关闭ISP IAP  EEPROM 使MCU处在安全的状态
void IAP_Over()
{
  IAP_CONTR=0;//关闭控制寄存器
 IAP_CMD=0;//命令寄存器无操作
 IAP_TRIG=0;//关闭命令触发器
 IAP_ADDRH=0x80;// 清空地址寄存器
 IAP_ADDRL=0 ;
}
//从ISP IAP EEROM的一个地址中读取一个字节
char IAP_rend_addr(int addr)
{
  char dat;
 IAP_CONTR=0x80;//使能命令寄存器,设置CPU等待时间
 IAP_CMD=1;//命令寄存器读操作
 IAP_ADDRH=addr>>8;
 IAP_ADDRL=addr;
 IAP_TRIG=0x5a;//开启命令寄存器
 IAP_TRIG=0xa5;
  _nop_();//MCU将等待ISP IAP EEROM操作成功
 dat=IAP_DATA;//读取ISP IAP EEROM数据
 IAP_Over();///关闭ISP IAP EEROM
 return dat;
}
//从ISP IAP EEROM的一个地址中写入一个字节
void  IAP_write_addr(int addr ,char dat)
{
  IAP_CONTR=0x80;//使能命令寄存器,设置CPU等待时间
 IAP_CMD=2;//命令寄存器写操作
 IAP_ADDRH=addr>>8;
 IAP_ADDRL=addr;
 IAP_DATA=dat;//读取ISP IAP EEROM数据
 IAP_TRIG=0x5a;//开启命令寄存器
 IAP_TRIG=0xa5;
 _nop_ ();//MCU将等待ISP IAP EEROM操作成功
 IAP_Over();///关闭ISP IAP EEROM 
}
//从ISP IAP EEROM的插除一个地址
void   IAP_clean_addr(int addr)
{
  IAP_CONTR=0x80;//使能命令寄存器,设置CPU等待时间
 IAP_CMD=3;//命令寄存器插除操作
 IAP_ADDRH=addr>>8;
 IAP_ADDRL=addr;
 IAP_TRIG=0x5a;//开启命令寄存器
 IAP_TRIG=0xa5;
 _nop_();//MCU将等待ISP IAP EEROM操作成功
 IAP_Over();///关闭ISP IAP EEROM 
}
/*
应该是主程序出问题,但本人找不出来了,本意是
往EEPROM中写入两位数,在数码管显示,然后擦除,
再写入一个加了1的数,循环往返,关闭开关,再打开,
能再继续显示之前的数 ,继续累加

*/
void main()
{
   char num=0;
   int s=100;
   while(s--)//使数码管显示稳定
   SMG_display((int)IAP_rend_addr(0x0000));
   while(1)
   {
    IAP_clean_addr(0x0000);
    num++;
    IAP_write_addr(0x0000,num%100);
    while(s--)
    SMG_display((int)IAP_rend_addr(0x0000));
  delay_ms(10);
   }
}
这是下载串口的设置


“打开程序文件“与”打开EEPROM”都试过,现象不变 
求好心人指错

当我的世界不一样,那就让我不一样
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-2-4 12:10:38 | 显示全部楼层
老妖的单片机没用过.
帮顶.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2013-2-14
在线时间
3 小时
发表于 2013-2-14 14:32:59 | 显示全部楼层
你看看问题是不是在这里,下面加了注释的。
void main()
{
   char num=0;
   int s=100;
   while(s--)//使数码管显示稳定
   SMG_display((int)IAP_rend_addr(0x0000));
   while(1)
   {
    IAP_clean_addr(0x0000);
    num++;
    IAP_write_addr(0x0000,num%100);
    while(s--)   //执行前面的while时,S已经等于0;因此不会再执行while里的语句,要加个语句:s=100;
    SMG_display((int)IAP_rend_addr(0x0000));
  delay_ms(10);
   }
}
回复 支持 反对

使用道具 举报

8

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2013-1-29
在线时间
0 小时
 楼主| 发表于 2013-2-14 15:50:54 | 显示全部楼层
回复【3楼】Lennon_ope:
---------------------------------
多谢啦……其实之后就发现是这个问题了。。。
当我的世界不一样,那就让我不一样
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 16:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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