×
单片机 > 单片机程序设计 > 详情

基于AVR单片机的24C08数据操作的C语言程序设计

发布时间:2020-08-21 发布时间:
|
#include

#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   { 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;    //如果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; 
 }
}

 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
C51 特殊功能寄存器SFR的名称和地址