ATME16 定时器1实现电子钟表

来源:互联网 发布:淘宝买药不是直接付款 编辑:程序博客网 时间:2024/05/17 05:12
 

#include <iom16v.h>
#include <macros.h>
#define  uchar unsigned char
#define  uint  unsigned int
uint fen=33;
uint shi=18;
uint miao=0;
uint ri=0;
uint g=0;
#pragma interrupt_handler timer1_isr:9

uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,
             0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0};
void delay(uint ms)
{
        uint i,j;
 for(i=0;i<ms;i++)
    {
    for(j=0;j<1141;j++);
       }
}
void show(uchar j,uchar k)
{
  PORTA=table[j];
  PORTB=0XFF;
  PORTB&=~BIT(k);
  delay(1);
}
void temer1_init(void)
{
 TCCR1B=0X04; //开timer1 为256分频
 TCNT1H=0X85;
 TCNT1L=0XED;
 TIMSK|=BIT(2);
 SREG|=BIT(7);
}
void timer1_isr(void)
{
    miao++;
 TCNT1H=0X85;
    TCNT1L=0XED;
}
uchar key_press()
{
    uchar j;
    DDRD|=0X0F;
 PORTD|=0X0F;
 DDRD&=0XF0;
 j=PIND;
 j=j&0X0F;
 if(j==0X0F)
 {
   return 0;
 }
 else
 {
  return 1;
 }
 
}

uchar key_scan()
{
    uchar key;
    delay(10);
 if(key_press())
 {
 key=PIND;
 //key=0X0E;
 key&=0X0F;
 switch(key)
 {
    case 0X0E:
        key=1;
     break;
    case 0X0D:
        key=2;
     break;
      case 0X0B:
        key=3;
     break;
    case 0X07:
        key=4;
     break;
    default: 
        key=16;        
 }
   while(key_press());
 }
 else
 {
   key=16;
 }
 return key;
}
void main()
{
    uchar i,l;
 temer1_init();
    DDRA|=0XFF;//0001 1000
 DDRB=0XFF;
 while(1)
 {
  i=key_press();
   if(i)
   {
      l=key_scan();
   if(l==1)
   {
    show(miao%10,0);
          show(miao/10,1);
       show(fen%10,2);
       show(fen/10,3);
   }
  if(l==2)
  {
     shi++;
   }
  if(l==3)
  {
     fen++;
       }
 }
  if(miao==60)
     {
    miao=0;
    fen++;
   }
    if(fen==60)
    {
     fen=0;
  shi++;
    }
    if(shi==24)
    {
     shi=0;
  ri++;
    }
  show(fen%10,0);
     show(fen/10,1);
  show(shi%10,2);
  show(shi/10,3);
   
}
}

原创粉丝点击