//89c52rc 11.0592晶振,学习使用EEPROM功能
#include <STC89.H> //STC89系列单片机头文件
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define RdCmd 0x01 //定义ISP的操作命令 读
#define WrCmd 0x02 //定义ISP的操作命令 写
#define EsCmd 0x03 //定义ISP的操作命令 删除
#define Error 1
#define Ok 0
#define WaitTime 0x01 //定义CPU的等待时间
sbit dula=P2^6; //申明U1锁存器的锁存端
sbit wela=P2^7; //申明U2锁存器的锁存端
uchar code duan[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar code wei[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar lssj[9],num;
//uchar
uint dz;
ulong numl;
//===============
void delayms(uint xms); //毫秒延时
void display(uchar du,uchar we); //在指定的位置显示指定的字符
void ISPenb(void); //ISP_IAP 使能
void ISPdsb(void); //ISP_IAP 关闭
void ISPgo(void); //ISP_IAP 触发
uchar readb(uint byte_addr); //读字节
void escEra(uint sector_addr); //扇区删除
void writeb(uint byte_addr, uchar original_data); //写字节
void xlongd(uint addr,ulong ldat);//写ulong型数据
void ledxs1();//数码显示
//===============================================
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--) //i=xms即延时约xms毫秒
for(j=110;j>0;j--);
}
//===============================================
void display(uchar du,uchar we) //显示子函数
{
dula=1;
P0=duan[du]; //送段码
dula=0;
P0=0xff; //送位选数据前关闭所有显示,防止打开位选锁存时
wela=1; //原来段选数据通过位选锁存器造成混乱
P0=wei[we]; //送位选数据
wela=0;
delayms(3); //延时
}
//================ 打开 ISP,IAP 功能 =================
void ISPenb(void)
{
EA = 0; // 关中断 //
ISP_CONTR =ISP_CONTR & 0x18; // 0001,1000 //
ISP_CONTR =ISP_CONTR | WaitTime; // 写入硬件延时 //
ISP_CONTR =ISP_CONTR | 0x80; // ISPEN=1 //
}
//=============== 关闭 ISP,IAP 功能 ==================
void ISPdsb(void)
{
ISP_CONTR =ISP_CONTR & 0x7f; // ISPEN = 0 //ISP_CONTR &=0x7f;
ISP_TRIG =0x00;
EA =1; // 开中断 //
}
// ================ 公用的触发代码 ====================
void ISPgo(void)
{
// ISPenb(); // 打开 ISP,IAP 功能 //
ISP_TRIG = 0x46; // 触发ISP_IAP命令字节1 //
ISP_TRIG = 0xb9; // 触发ISP_IAP命令字节2 //
_nop_();
}
// ==================== 字节读 ======================== //
uchar readb(uint byte_addr)
{
ISP_ADDRH = (uchar)(byte_addr >> 8);// 地址赋值 //
ISP_ADDRL = (uchar)(byte_addr & 0x00ff);
ISP_CMD = ISP_CMD & 0xf8; // 清除低3位 //
ISP_CMD = ISP_CMD | RdCmd; // 写入读命令 //
ISPgo(); // 触发执行 //
//ISPdsb(); // 关闭ISP,IAP功能 //
return (ISP_DATA); // 返回读到的数据 //
}
// ================== 扇区擦除 ======================== //
void escEra(uint sector_addr)
{
unsigned int iSectorAddr;
iSectorAddr = (sector_addr & 0xfe00); // 取扇区地址 //
ISP_ADDRH = (uchar)(iSectorAddr >> 8);
ISP_ADDRL = 0x00;
ISP_CMD = ISP_CMD & 0xf8; // 清空低3位 //
ISP_CMD = ISP_CMD | EsCmd; // 擦除命令3 //
ISPgo(); // 触发执行 //
//ISPdsb(); // 关闭ISP,IAP功能 //
}
// ==================== 字节写 ======================== //
void writeb(uint byte_addr, uchar original_data)
{
ISP_ADDRH =(uchar)(byte_addr >> 8); // 取地址 //
ISP_ADDRL =(uchar)(byte_addr & 0x00ff);
ISP_CMD =ISP_CMD & 0xf8; // 清低3位 //
ISP_CMD =ISP_CMD | WrCmd; // 写命令2 //
ISP_DATA =original_data; // 写入数据准备 //
ISPgo(); // 触发执行 //
//ISPdsb(); // 关闭IAP功能 //
}
//=========================
void xlongd(uint addr,ulong ldat) //写long型数据
{ uchar i,ucdat;
uint dz=addr;
ISPenb(); // 打开 ISP,IAP 功能
escEra(addr);//擦除扇区
for (i=0;i<4;i++)
{ucdat=ldat;
writeb(addr,ucdat);//写一个字节数据
ldat>>=8;//右移8位
addr++; //地址加1
}
ISPdsb(); // 关闭IAP功能
}
//==========================
void ledxs1()
{
lssj[1]=num1/100000%10;
lssj[2]=num1/10000%10;
lssj[3]=num1/1000%10;
lssj[4]=num1/100%10;
lssj[5]=num1/10%10;
lssj[6]=num1%10;
lssj[0]=0;
lssj[0]+=lssj[1];
if (lssj[0]) display(lssj[1],1); //十万
lssj[0]+=lssj[2];
if (lssj[0]) display(lssj[2],2); //万
lssj[0]+=lssj[3];
if (lssj[0]) display(lssj[3],3); //千
lssj[0]+=lssj[4];
if (lssj[0]) display(lssj[4],4); //百
lssj[0]+=lssj[5];
if (lssj[0]) display(lssj[5],5); //十个
lssj[0]+=lssj[6];
if (lssj[0]) display(lssj[6],6); //个
}
//===============================================
void main()
{
uchar i;
TMOD=0x01; //设置定时器0为工作方式1(0000 0001)
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
EX0=1; //外部中断0使能
//IE0=1;//下降沿触发
ISPenb(); // 打开 ISP,IAP 功能
dz=0x2000; //初始地址
for (i=0;i<4;i++){
num1<<=8;//左移8位
num1+=readb(dz);//程序开始时读取EEPROM中数据
dz++;} //地址加1
ISPdsb(); // 关闭IAP功能
while(1)
{
if(num>9){num=0; num1++;}
ledxs1();
}
}
//===============================================
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;
}
void int0() interrupt 0
{xlongd(0x2000,numl);} // 保存ulong数据
编译时显示的信息:
Build target 'Target 1'
compiling text2.c...
TEXT2.C(128): error C202: 'num1': undefined identifier
TEXT2.C(129): error C202: 'num1': undefined identifier
TEXT2.C(130): error C202: 'num1': undefined identifier
TEXT2.C(131): error C202: 'num1': undefined identifier
TEXT2.C(132): error C202: 'num1': undefined identifier
TEXT2.C(133): error C202: 'num1': undefined identifier
TEXT2.C(163): error C202: 'num1': undefined identifier
TEXT2.C(164): error C202: 'num1': undefined identifier
TEXT2.C(170): error C202: 'num1': undefined identifier
Target not created
没看到你在哪儿设置的“num1”??
ulong numl;??
哦哦,把1 写成了 l ,
找不到原因,睡了一觉,再看,就发现了这问题。
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |