#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~9和熄灭符的段码表
uchar const bit_tab[]={0xbf,0x7f}; //第7、8只数码管位选表
uchar disp_buf[2]={0,0}; //定义2个显示缓冲单元
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
}
/*********以下是蜂鸣器响一声函数********/
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<
}
/********定时器0初始化********/
void timer0_init()
{
SREG = 0x80; //使能全局中断
TIMSK|=(1<
}
/********以下是显示函数********/
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; //如果2个数码管显示了一遍,则让其回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%10;
}
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』