#include #define uint unsigned int
#define uchar unsigned char
#include "I2C_drive.h"//包含I2C总线驱动程序软件包
uchar const seg_data[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};//0~以及熄灭符的段码表
uchar const bit_tab[]={0xbf,0x7f};//7,8只数码管位选表
uchar disp_buf[2]={0,0};//定义两个显示缓冲单元
uchar val;
#define beep_0 (PORTD=PORTD&0xbf) //PD7上的蜂鸣器发出声音
#define beep_1 (PORTD=PORTD|0x40) //PD7上的蜂鸣器不发声
/********函数功能:延迟函数********/
void Delay_ms(uint xms)
{
int i,j;
for(i=0;i
{ for(j=0;j<1140;j ) ; }
}
/*********以下是蜂鸣器响的函数********/
void beep()
{
uint bb;
for (bb=0;bb<20;bb )
{
beep_0; ///蜂鸣器响
Delay_ms(1);
beep_1; ///关闭蜂鸣器
Delay_ms(1);
}
}
/********端口设置函数********/
void port_init(void)
{
PORTA = 0xFF;//输出高电平
DDRA = 0xFF;//设置为输出
PORTC = 0xff; //输出高电平
DDRC = 0xFF; //设置为输出
DDRD =(0<
PORTD = 0xFF;//PD6输出高电平,其他输入带上拉
}
/********定时器0初始化********/
void timer0_init()
{
SREG = 0x80; //使全局中断
TIMSK|=(1<
TCCR0|=(1<
TCNT0 = 240; ///定时初值设置,定时时间2ms
}
/********以下是显示函数********/
void Display()
{
uchar tmp;//定义显示暂存
static uchar disp_sel=0;///显示位选择计数器,显示程序知道现在显示哪个数字管,初始值为0
tmp=bit_tab[disp_sel];///根据当前当前位选计值显示哪个数字管
PORTC=tmp;//送PC控制选定的数字管点亮
tmp=disp_buf[disp_sel];///根据当前位选数值检查的数字的显示码
tmp=seg_data[tmp];//取显示码
PORTA=tmp;//送到PA口显示相应的数字
disp_sel ;//位选计值加1,指向下一个数字管
if(disp_sel==2)
disp_sel=0;//如果两个数字管再次显示,让其回0,再次扫描
}
/********以下是定时器T0中断函数, 动态扫描管动态扫描********/
#pragma interrupt_handler timer0_ovf:10
void timer0_ovf(void)
{
TIFR=0x01;//写1清除定时器T0标志位
TCNT0=240; ///设计初始值,设定时间为2ms
Display();//调整显示函数
}
/********以下是主函数********/
void main()
{
timer0_init();
I2C_init();
port_init();
Delay_ms(100);
val=read_EEPROM(0x02);
if(val>=100) val=0;//防止第一次阅读EEPROM数据时出错
while(1)
{
if((PIND&0x04)==0)//若K1键按下
{
Delay_ms(10);//延时10ms去抖
if((PIND&0x04)==0)
{
while(!(PIND&0x04));//等待K1键释放
val ;
write_EEPROM(val,0x02);
beep();
if(val==99)val=0;
}
}
disp_buf[0]=val/10;
disp_buf[1]=val;
}
}