/**********************************************************************
头文件
**********************************************************************/
#include <iom8v.h> //包含型号头文件
#include <macros.h> //包含"位"操作头文件
#include <delay8.h> //包含"延时"操作头文件
/********************************************************************
数据类型定义
*********************************************************************/
#define uchar unsigned char
#define uint unsigned int
#define PC0_set PORTC |= BIT(0)//PC0置位
#define PC0_clt PORTC &=~BIT(0)//PC0清零
#define PC1_set PORTC |= BIT(1)//PC1置位
#define PC1_clt PORTC &=~BIT(1)//PC1清零
/********************************************************************
数码管段码定义
*********************************************************************/
uchar duan[16]=
{
0xC0,0xF9,0xA4,0xB0,
0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,
0xC6,0xA1,0x86,0x8E
};//所需的段码
uchar wei[8]=
{
0X10,0X20,0X40,0X80,
0X01,0X02,0X04,0X08
}; //位的控制端
uchar time[8]={0,0,0,0,0,0,0,0};//暂存数据
/********************************************************************
I/O端口初始化
*********************************************************************/
void init_IO(void)
{
// PB端口
DDRB=0XFF;
PORTB=0;
// PC端口
DDRC=0XFF;
PORTC=0X03;//0000 0011
// PD端口
DDRD=0XFF;
PORTD=0;
}
/********************************************************************
显示函数
*********************************************************************/
void display(uchar *p)
{
uchar i;
for(i=0;i<8;i++)
{
PORTB=duan[*p];
p++;
PORTD=wei[i];
delay1ms(1);
}
}
/********************************************************************
EEPROM写操作函数
*********************************************************************/
void EEPROM_write(uint addr,uint adata)
{
SREG&=~BIT(7);//关总中断
while(EECR&BIT(EEWE));//检测EEWE为0
EEAR=addr;//配置写入地址
EEDR=adata;//配置写入数据
EECR|=BIT(EEMWE);//主写入使能置一
EECR|=BIT(EEWE);//使能位置一
SREG|=BIT(7);//开总中断
}
/********************************************************************
EEPROM读操作函数
*********************************************************************/
uchar EEPROM_read(uint addr)
{
uchar edata;//读变量
SREG&=~BIT(7);//关总中断
while(EECR&BIT(EEWE));//等待EEWE操作结束
EEAR=addr;//写入地址
EECR|=BIT(EERE);//EERE置1后,进行读操作
edata=EEDR;//读数据
SREG|=BIT(7);//开总中断
return edata;//返回
}
/********************************************************************
主函数
*********************************************************************/
void main(void)
{
uchar i;
init_IO();//IO口初始化
i=EEPROM_read(2);//单片机第一次开机从EEPROM的第二位读取一个数据
i++;//读取完成后进行一次加1操作
EEPROM_write(2,i);//加1操作后存入EEPROM的第二位
while(1)
{
display(time);//显示
}
}
我写的单片机启动 数码管不会加 1 ,可否帮忙看看哪里出了问题。 |