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

📄 demo_t1_clock.c

📁 基于MEGA16的按键识别程序
💻 C
字号:
/*********************************************************************
    工程名  :Demo_T1_clock
    程序名  :同上
    创建时间:11月4日
    创建单位:广西师范大学
    专业    :电子信息工程
    作者    :陈哲(06电信)
    程序作用:运用AVR的T1定时计数器做的数字时钟
    实验CPU :ATMEGA16
    晶振    :内部8MHZ
    版本    :1.2
    修改人  :
    修改时间:
    
*************************************************************************/




#include <avr/io.h>
#include <util/delay.h>

#include <avr/interrupt.h>

#define uchar unsigned char
#define uint unsigned int

//全局变量在这里定义:

uchar disnumber_code[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
//共阴极数码管,分别表示:0 1 2 3 4 5 6 7 8 9 -


uchar disbeat_run[8]=//{0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
                     {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
//扫描方式选位

uchar dis_data[8]={0,0,0,0,0,0,0,0};//初始值一定要给,为以后VC++做好习惯


uchar  volatile seconds=0,minutes=0,hours=0;//思考为什么要VOLATILE来声明



//T1的初始化程序
void timer1_init()
{
    TCCR1B = 0x00;//停止定时器
	TIMSK |= 0x10;//中断允许,CTC匹配中断模式,TOP=3D0
	TCNT1H = 0x00;
	TCNT1L = 0x00;//初始值
	OCR1AH = 0x03;
	OCR1AL = 0x0d;//匹配A值  //填充一个数字用0.128MS,那么如果是100MS,就用781次,再下面的程序中,在重复10次就是1S
	OCR1BH = 0x00;
	OCR1BL = 0x00;//匹配B值
	ICR1H  = 0xff;
	ICR1L  = 0xff;//输入捕捉匹配值
	TCCR1A = 0x00;
	TCCR1B = 0x0d;//启动定时器
   
}
   

void port_init()
{
  DDRA=0Xff;
  PORTA=0Xff;
  DDRC=0Xff;
  PORTC=0Xff;
}
   
   
void init_devices(void)
{
	cli(); //禁止所有中断  可以思考这条语句的意思,是什么语言,从哪来,作用是什么?
	MCUCR  = 0x00;
	MCUCSR = 0x80;//禁止JTAG
	GICR   = 0x00;
	port_init();
	timer1_init();
	sei();//开全局中断
}

//将要显示的数据拆分成BCD码去显示   
   
void display_handle()
{
  dis_data[0]=disnumber_code[seconds%10];
  dis_data[1]=disnumber_code[seconds/10];
  dis_data[2]=disnumber_code[10];
  dis_data[3]=disnumber_code[minutes%10];
  dis_data[4]=disnumber_code[minutes/10];
  dis_data[5]=disnumber_code[10];
  dis_data[6]=disnumber_code[hours%10];
  dis_data[7]=disnumber_code[hours/10];
  }
  
//显示服务程序

void display()
{
  uchar i;
  display_handle();
  for(i=0;i<8;i++)
   {
     PORTA=dis_data[i];
	 PORTC=disbeat_run[i];
	 _delay_ms(2);
	}
} 
	

//键盘识别程序

void read_key()
{  
  if((PINB&0x0f)!=0x0f)
  {
     _delay_ms(10);
     switch(PINB&0x0f)
      {
        case 0x0e: 
                  seconds=0;
			      while((PINB&0x0f)==0x0e)
				  {
				    display();
					}
					break;//可以思考为什么在这里要放置display()函数
        case 0x0d: 
                  minutes++;
		    	  if(minutes==60){minutes=0;}
		    	  while((PINB&0x0f)==0x0d)
				  {
				    display();
					}
					break;
        case 0x0b: 
                  hours++;
                  if(hours==60){hours=0;}  
			      while((PINB&0x0f)==0x0b)
				  {
				   display();
				   }
				   break; 
      }
   }	
} 

 
//定时器T1匹配中断A服务程序
//#pragma interrupt_handler timer1_compa_isr:8
//void timer1_compa_isr(void)
SIGNAL(SIG_OUTPUT_COMPARE1A)
{
	  
	   static uchar count=0;
	   count++;
	   if(count==10)//有误差,需要重新计算
	   {
	     count=0;
		 seconds++;
		 if(seconds==60)
		   {
		     seconds=0;
		     minutes++;
			 if(minutes==60)
			   {
			     minutes=0;
				 hours++;
				 if(hours==24)
				 {
				    hours=0;
					
				   }
				}
			}	
		}
     
	
}



void main()
{

  
  init_devices();
  while(1)
  { 
    
     read_key();	
     display();	
   }
}
	

⌨️ 快捷键说明

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