⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 m16-lwdzz.txt

📁 基于M16的六位电子钟(CVAVR)。带报警功能
💻 TXT
字号:
#include <mega16.h>
flash unsigned char led_7[10]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};//定义字符表
flash unsigned char position[6]={0XDF,0XEF,0XF7,0XFB,0XFD,0XFE};
unsigned char time[3];//显示时,分,秒
unsigned char   dis_buff[6];   // 显示缓冲区         
int   time_counter=0;// 中断次数计数单元

unsigned char   posit;
bit   point_on, time_1s_ok; 



void time_to_disbuffer(void)//时间送显示缓冲区函数
{   unsigned char i,j=0;
  for (i=0;i<=2;i++)
  {
    dis_buff[j++] = time[i] % 10;
      dis_buff[j++] = time[i] / 10;
  }
}
void display(void)//数码管显示程序
{     PORTB = 0xff;
  PORTD = led_7[dis_buff[posit]];
  if (point_on && (posit==2||posit==4)) PORTA |= 0x80;
  PORTB= position[posit];
  if (++posit >=6 ) posit = 0;
  
} 
void delay(unsigned int a) //延时程序用于
{
  while(a--)
  {
    display();
  } 
} 
void delay1(void)//闹玲延续时间
{ int i,j;
for(i=0;i<5000;i++)
for(j=0;j<5000;j++);
}
void fengmingqi_bell(void)//蜂鸣器报警
{
  PORTC|=0X80; 
  delay1();
  PORTC&=~0X80;
}

void key_in(void)//按键扫描程序 用于调整时间
{ 
if((PINC&(1<<5))==0)//按键是否按下,
  {
    delay(7000);//延时消抖
    if((PINC&(1<<5))==0)//确认按键按下
    { time[1]++;
      if(time[1]==60)
        {time[1]=0;}
    time_to_disbuffer();
    }
    }
if((PINC&(1<<6))==0)//按键是否按下
  {
    delay(7000);//延时消抖
    if((PINC&(1<<6))==0)//确认按键按下
    { time[2]++;
      if(time[2]==24)
        {time[2]=0;}
    time_to_disbuffer();
    }
    }

}

// Timer 0 比较匹配中断服务
interrupt [TIM0_COMP] void timer0_comp_isr(void)
{     key_in();
  display(); 
  if (++time_counter>=500)
  {
    time_counter = 0;
    time_1s_ok = 1;
  } 
}
  



void main(void)
{
  PORTD=0x00;           // 显示控制I/O端口初始化
  DDRD=0xFF;
  PORTB=0X3F;
  DDRB=0xFF;
  PORTC=0X70;
    DDRC=0X8F;

  // T/C0 初始化
  
    TCCR0=0x0B;           // 内部时钟,64分频(4M/64=62.5KHz),CTC模式
  TCNT0=0x00;
  OCR0=0x7C;           // OCR0 = 0x7C(124),(124+1)/62.5=2ms
  TIMSK=0x02;           // 允许T/C0比较匹配中断

    time[2] = 12; time[1] = 00,time[0]=00;     // 设时间初?
  posit = 0;
  
      time_to_disbuffer();
    #asm("sei");   //允许全局中断

  while (1)
  {     
    if (time_1s_ok==1)           // 1秒到
    {     
        time_1s_ok = 0;
        point_on = ~point_on;
        if (++time[0] >= 60)   // 以下时间调整
        {
          time[0] = 0;
          if (++time[1] >= 60)
          {
            time[1] = 0;
            if(++time[2]>=24)
            {time[2]=0;}
            
          }
        }
        if(time[2]==14&&time[1]==0&time[0]==0)//设定闹玲时间
        { fengmingqi_bell();}

        time_to_disbuffer();   // 新调整好的时间送显示缓冲区
    }   
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -