程序贴上,用595驱动数码管,数组显示按键按一下加一,要求加到几,断电之后继续显示几,求助烧友们帮忙看看程序,谢谢了
/*
************************************************************************************
Fuc
tion:STC89C52
单片机内部4K的EEPROM操作驱动
Software Designer:Jason
************************************************************************************
*/
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
/******************定义命令字节******************/
#define Read_COM 0x01 //字节读数据命令
#define Prog_COM 0x02 //字节编程数据命令
#define Erase_COM 0x03 //扇区擦除数据命令
#define En_Wait_TIME 0x81 //设置等待时间 ,并使能ISP/IAP
#define Start_ADDRH 0x20 //扇区地址高位
#define Start_ADDRL 0x00 //扇区地址低位
/****************特殊功能寄存器声明****************/
sfr ISP_DATA = 0xe2;
sfr ISP_ADDRH = 0xe3;
sfr ISP_ADDRL = 0xe4;
sfr ISP_CMD = 0xe5;
sfr ISP_TRIG = 0xe6;
sfr ISP_CONTR = 0xe7;
/*****************关闭ISP&IAP功能*****************/
sbit SD=P3^5;
sbit SCK=P3^7;
sbit RCK=P3^6;
sbit ADD=P1^7;
uchar i,u,n;
uchar tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void WR1_595(uchar num1)
{
uchar date;
uchar b;
date=num1;
for(b=0;b<=7;b++)
{
if((date&0x80)==0x80) //最高位为1,则向SDATA_595发送1
SD=1; //发出数据的最高位
else
SD=0;
date<<=1; //左移位
SCK=0;
_nop_();
_nop_();
SCK=1; //产生上升沿
}
}
void ISP_IAP_disable(void)
{
ISP_CONTR = 0x00;
ISP_CMD = 0x00;
ISP_TRIG = 0x00;
}
/*********************字节读**********************/
uchar Byte_read(uint byte_addr)
{
EA = 0; //关中断
ISP_CONTR = En_Wait_TIME; //开启ISP&IAP,并送等待时间
ISP_CMD = Read_COM; //送字节读命令字
ISP_ADDRH = (uchar)(byte_addr >> 8); //送地址高字节
ISP_ADDRL = (uchar)(byte_addr & 0x00ff); //送地址低字节
ISP_TRIG = 0x46; //送触发命令字0x46
ISP_TRIG = 0xB9; //送触发命令字0xB9
_nop_();
ISP_IAP_disable(); //关闭ISP&IAP功能
EA = 1; //开中断
return (ISP_DATA);
}
/*********************字节编程*********************/
void Byte_program(uint byte_addr,uchar isp_iap_data)
{
EA = 0; //关中断
ISP_CONTR = En_Wait_TIME; //开启ISP&IAP,并送等待时间
ISP_CMD = Prog_COM; //送字节编程命令字
ISP_ADDRH = (uchar)(byte_addr >> 8); //送地址高字节
ISP_ADDRL = (uchar)(byte_addr & 0x00ff); //送地址低字节
ISP_DATA = isp_iap_data; //送数据进ISP_DATA
ISP_TRIG = 0x46; //送触发命令字0x46
ISP_TRIG = 0xB9; //送触发命令字0xB9
_nop_();
ISP_IAP_disable(); //关闭ISP&IAP功能
EA = 1; //开中断
}
/*********************扇区擦除*********************/
void Sector_erase(uint sector_addr)
{
EA = 0; //关中断
ISP_CONTR = En_Wait_TIME; //开启ISP&IAP;并送等待时间
ISP_CMD = Erase_COM; //送扇区擦除命令字
ISP_ADDRH = (uchar)(sector_addr >> 8); //送地址高字节
ISP_ADDRL = (uchar)(sector_addr & 0X00FF); //送地址低字节
ISP_TRIG = 0X46; //送触发命令字0x46
ISP_TRIG = 0XB9; //送触发命令字0xB9
_nop_();
ISP_IAP_disable(); //关闭ISP&IAP功能
EA = 1;
}
void main()
{
TMOD = 0x01;
TH0 = 0x4C;
TL0 = 0x00;
EA = 1;
ET0 = 1;
TR0 = 1;
u=Byte_read(0x2000);
while(1)
{
RCK=0;
WR1_595(u);
RCK=1;
_nop_();
_nop_();
_nop_();
_nop_();
Sector_erase(0x2000); //扇区擦除
Byte_program(0x2000,tab[n]);
}
}
void tim0() interrupt 1 //中断函数
{
TH0 = 0x4C;
TL0 = 0x00;
// t++;
//if(t==20)
//{
// t=0;
if(ADD==1)
{
n++;
if(n==11)
n=0;
}
}
一周热门 更多>