#include <intrins.h>
#include <reg52.h>
//#include<rs232.h>
#define uchar unsigned char
#define uint unsigned int
#define RdCommand 0x01 //定义ISP的操作命令
#define PrgCommand 0x02
#define EraseCommand 0x03
#define Error 1
#define Ok 0
#define WaitTime 0x01 //定义CPU的等待时间
sfr ISP_DATA=0xe2; //寄存器申明
sfr ISP_ADDRH=0xe3;
sfr ISP_ADDRL=0xe4;
sfr ISP_CMD=0xe5;
sfr ISP_TRIG=0xe6;
sfr ISP_CONTR=0xe7;
sbit SW=P3^7;
sbit SW1=P3^6;
sbit BUZZER=P2^3;
uchar a0,b0,c0,d0,e0,f0;
sbit w1 = P2^4;
sbit w2= P2^5;
sbit w3 = P2^6;
sbit w4 = P2^7;
uint num,num1,num2;
void selectnum();
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
0xf8,0x80,0x90,0xFF};//共阳数字编码 0.1.2.3.4....9
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--) //i=xms即延时约xms毫秒
for(j=110;j>0;j--);
}
void delay(uint xms)
{
uint i,j;
for(i=xms;i>0;i--) //i=xms即延时约xms毫秒
for(j=50;j>0;j--);
}
/* ================ 打开 ISP,IAP 功能 ================= */
void ISP_IAP_enable(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 ISP_IAP_disable(void)
{
ISP_CONTR = ISP_CONTR & 0x7f; /* ISPEN = 0 */
ISP_TRIG = 0x00;
EA = 1; /* 开中断 */
}
/* ================ 公用的触发代码 ==================== */
void ISPgoon(void)
{
ISP_IAP_enable(); /* 打开 ISP,IAP 功能 */
ISP_TRIG = 0x46; /* 触发ISP_IAP命令字节1 */
ISP_TRIG = 0xb9; /* 触发ISP_IAP命令字节2 */
_nop_();
}
/* ==================== 字节读 ======================== */
unsigned char byte_read(unsigned int byte_addr)
{
ISP_ADDRH = (unsigned int)(byte_addr >> 8);/* 地址赋值 */
ISP_ADDRL = (unsigned int)(byte_addr & 0x00ff);
ISP_CMD = ISP_CMD & 0xf8; /* 清除低3位 */
ISP_CMD = ISP_CMD | RdCommand; /* 写入读命令 */
ISPgoon(); /* 触发执行 */
ISP_IAP_disable(); /* 关闭ISP,IAP功能 */
return (ISP_DATA); /* 返回读到的数据 */
}
/* ================== 扇区擦除 ======================== */
void SectorErase(unsigned int sector_addr)
{
unsigned int iSectorAddr;
iSectorAddr = (sector_addr & 0xfe00); /* 取扇区地址 */
ISP_ADDRH = (unsigned int)(iSectorAddr >> 8);
ISP_ADDRL = 0x00;
ISP_CMD = ISP_CMD & 0xf8; /* 清空低3位 */
ISP_CMD = ISP_CMD | EraseCommand; /* 擦除命令3 */
ISPgoon(); /* 触发执行 */
ISP_IAP_disable(); /* 关闭ISP,IAP功能 */
}
/* ==================== 字节写 ======================== */
void byte_write(unsigned int byte_addr, unsigned int original_data)
{
ISP_ADDRH = (unsigned int)(byte_addr >> 8); /* 取地址 */
ISP_ADDRL = (unsigned int)(byte_addr & 0x00ff);
ISP_CMD = ISP_CMD & 0xf8; /* 清低3位 */
ISP_CMD = ISP_CMD | PrgCommand; /* 写命令2 */
ISP_DATA = original_data; /* 写入数据准备 */
ISPgoon(); /* 触发执行 */
ISP_IAP_disable(); /* 关闭IAP功能 */
}
void display(uchar a0,uchar b0,uchar c0,uchar d0)
{
w1 = 0;
P0=table[a0];
delay(5);
w1 = 1;
delay(2);
w2= 0;
P0=table[b0];
delay(5);
w2 = 1;
delay(2);
w3 = 0;
P0=table[c0];
delay(5);
w3 = 1;
delay(2);
w4 = 0;
P0=table[d0];
delay(5);
w4= 1;
delay(2);
}
void key()
{
if(SW==0)
delayms(10);
if(SW==0)
{
num++;
num2=num/256;
SectorErase(0x2000);//擦除扇区
byte_write(0x2000,num2);//重新写入数据
num1=num%256;
SectorErase(0x2200);//擦除扇区
byte_write(0x2200,num1);//重新写入数据
delay(50);
while(SW==0)
{
selectnum();
display(a0,b0,c0,d0);
}
}
if(SW1==0)
delayms(50);
if(SW1==0)
{
BUZZER=1;
num=0;
num1=0;
num2=0;
SectorErase(0x2000);//擦除扇区
byte_write(0x2000,num1);//重新写入数据
SectorErase(0x2200);//擦除扇区
byte_write(0x2200,num2);//重新写入数据
delay(50);
while(SW1==0)
{
selectnum();
display(a0,b0,c0,d0);
}
}
if(num>=600)
{
while(SW1==1)
{
BUZZER=0;
selectnum();
display(a0,b0,c0,d0);
}
}
}
void selectnum()
{
if(num<10)
{
d0=num;b0=10;c0=10;a0=10;
}
else
{
if(num<100)
{c0=num/10;d0=num%10;a0=10;b0=10;}
else
{
if(num<1000)
{b0=num/100;c0=num%100/10;d0=num%10;a0=10;}
}
}
}
void portinit()
{
P0=0xff;
P1=0xff;
P2=0xff;
P3=0xff;
}
void threetimes()
{
uint a=0;
for(a=0;a<6;a++)
{
BUZZER=~BUZZER;
display();
P0=~P0;
delay(200);
}
}
void main()
{
// config_init();
portinit();
threetimes();
num2=byte_read(0x2000);
// Math_send(num2);
num1=byte_read(0x2200);
// Math_send(num1);
num=num2*256+num1;
selectnum();
display(a0,b0,c0,d0);
while(1)
{
key();
selectnum();
display(a0,b0,c0,d0);
}
}