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

📄 时钟.c

📁 用AVR单片机实现的简单的时钟程序
💻 C
字号:
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#define uint unsigned int
#define uchar unsigned char
void mcu_init(void);
void key_inter(void);
uchar key1(void);
uint display(uchar num);
uchar led[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
uchar flag[8]={0,0,0,0,0,0,0,0};
uchar flag_d[8]={0,0,0,0,0,0,0,0};
uchar n=0;
uchar ENTER=1; 
int main()
{
 uchar i;
 mcu_init();
 for(i=0;i<8;i++)
  display(flag[i]);
 while(1)
 {
  key_inter();
 }
}
void mcu_init(void)
{
 DDRB=0xFF;
 PORTB=0x00;
 DDRC=0xFF;
 PORTC=0x00;
 DDRD=0x00;
 PORTD=0x00;
 TIMSK=(1<<TOIE1);
 TCNT1L=0x05;
 TCNT1H=0xE9;
 TCCR1A=0x00;
 TCCR1B=0x05;
 sei();
}
SIGNAL(SIG_OVERFLOW1)
{
 uchar i;
 uchar j;
 TCNT1H=0xE9;
 TCNT1L=0x05;
 flag[0]++;
 for(i=0;i<8;i++)
 {
  if(flag[i]>9)
  {
   flag[i]=0;
   flag[i+1]++;
  }
 }
 for(j=0;j<8;j++)
  display(flag[j]); 
}
void key_inter()
{
 uint j;
 uchar i;
 uint k;
 uchar key_num;
 uchar key;
 DDRA=0x0F;
 PORTA=0x00;
 while((PINA&0xF0)==0xF0);
 for(j=0;j<25000;j++);
 if((PINA&0xF0)!=0xF0)
 {
  ENTER=1;
  key=PINA;//&0xF0;
  key_num=key;
  DDRA=0xF0;
  PORTA=key&0xF0;
  key=PINA;//&0x0F;
  //key_num&=key;
  //PORTA=PINB;
  if(PINA==0xBe)
  {
   TCCR1B=0x00;
   TCNT1L=0x05;
   TCNT1H=0xE9;
   for(k=0;k<8;k++)
    flag_d[k]=flag[k];
	flag_d[n]=10;
	while(ENTER)
	{
	 for(i=0;i<8;i++)
	  display(flag[i]);
     for(j=0;j<60000;j++)
	  key1();
	 for(i=0;i<8;i++)
      display(flag_d[i]);
     for(k=0;k<60000;k++);
	}
	TCCR1B=0x05;
  }
 }
}
uchar key1(void)
{
 uint j;
 uchar key,key_num;
 DDRA=0x0F;
 PORTA=0x00;
 while((PINA&0xF0)==0xF0)
  return 1;
 for(j=0;j<25000;j++);
 if((PINA&0xF0)!=0xF0)
 {
  key=PINA;//&0xF0;
  key_num=key;
  DDRA=0xF0;
  PORTA=(key&0xF0);
  //PORTA=PINB;
  switch(PINA)
  {
   case 0xe7:
    flag[n]=0;break;
   case 0xd7:
    flag[n]=1;break;
   case 0xb7:
    flag[n]=2;break;
   case 0x77:
    flag[n]=3;break;
   case 0xeb:
    flag[n]=4;break;
   case 0xdb:
    flag[n]=5;break;
   case 0xbb:
    flag[n]=6;break;
   case 0x7b:
    flag[n]=7;break;
   case 0xed:
    flag[n]=8;break;
   case 0xdd:
    flag[n]=9;break;
   case 0xbd:
   {
    if(flag[n]>=9)
	 flag[n]=9;
    else
     flag[n]+=1;
    }
	 break;
   case 0x7d:
   {
    if(flag[n]<=0)
	 flag[n]=0;
    else
     flag[n]-=1;
   }
	 break;
   case 0xee:
   {
    if(n>=7)
	 n=7;
    else
	{
     flag_d[n]=flag[n];
	 n++;
	 flag_d[n]=10;
	 }
	 
    }      break;
   case 0xde:
   {
    if(n<=0)
	 n=0;
    else
	{
     flag_d[n]=flag[n];
	 n--;
	 flag_d[n]=10;
	 }
   }      break;
   case 0x7e:
    ENTER=0;  break;
   default:
    return(1);
  }
 }
  return(1);
}
uint display(uchar num) //显示函数
{
 uchar j;
 uchar ram;
 uchar q;
  ram=led[num];
  for(j=0;j<8;j++)
  {
   q=ram&0x80;
   if(q==0x80)
   {   
    PORTB=0x01;
	PORTB=0x03;
	asm("nop");
	ram<<=1;
	asm("nop");
	PORTB=0x01;
	}
   else
   {
    PORTB=0x00;
	PORTB=0x02;
	asm("nop");
	ram<<=1;
	asm("nop");
	PORTB=0x00;
	}
   
   //利用PB0位数据线,PB1为时钟,自制串口时序
 }
 return(1);
}


⌨️ 快捷键说明

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