应该是主程序出问题,但本人找不出来了,本意是
往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”都试过,现象不变
求好心人指错
|