数模电知识 经典电路欣赏单片机 嵌入式系统 接口电路 仿真与制板 EDA DSP MEMS 通信技术 现代电子 电子维修
返回首页
当前位置: QQ电子网 > 电子技术 > 单片机 >

AVR单片机通过定时器完成精确的电子时钟,通过键盘实时调整(调

时间:2010-04-05 14:14来源: 作者:lihom 点击:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#define uint unsigned int
#define uchar unsigned char
static uint g_bCount=0;
static uchar g_bDirection=0;
unsigned char l_tmpdate[6]={0,0,12};//秒分时 12:00:00
unsigned char l_tmpdisplay[8];


const unsigned char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};
            //共阴数码管 0-9  '-' '熄灭‘表
const unsigned char table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
                     //显示位码表

/****************************************************************************/  
void putc(unsigned char c)
   {
      while( !(UCSRA & (1<<UDRE)) );
      UDR=c;
   }
SIGNAL(SIG_OVERFLOW0)

 static unsigned char i=0;
 if(++g_bCount>449)     
 {
  g_bCount=0;
  if(l_tmpdate[0]++>58)
  {
   l_tmpdate[0]=0;
   l_tmpdate[1]++;
  }
  if(l_tmpdate[1]>59)
  {
   l_tmpdate[1]=0;
   l_tmpdate[2]++;
  }
  if(l_tmpdate[2]>23)
  {
   l_tmpdate[2]=0;
  }
  convert();
  
 }
 PORTA=table[l_tmpdisplay[i]];  //查表法得到要显示数字的数码段
 PORTC=table1[7-i];
 i++;
 if(i==8)
   {
    i=0;
   }
}
void delay(void)//延时函数
{
 uchar i;
 uint j;
 for(i=0;i<80;i++)
  for(j=0;j<1843;j++);
}
uchar keyscan(void)//键盘扫描函数,使用行列反转扫描法
{
 unsigned char scancode;
  unsigned char tempcode;
 
    DDRD=0X0f;            //高四位输入,低四位输出
 PORTD=0Xf0;               //高四位打开上拉,低四位输出低电平
 // delay_ms(10);
 if((PIND&0xf0)!=0xf0)           
    {  
         delay();
  if((PIND&0xf0)!=0xf0) 
   {
      scancode=0xfe;
//         key_flag=1;          //键标识
   while((scancode&0x10)!=0)   //行扫描
    {
      PORTD=scancode;        //输出行扫描码
   delay();     //延时
      if((PIND&0xf0)!=0xf0)         //本行有键按下
   {
   tempcode=(PIND&0xf0)|0x0f;
       return ((~scancode)+(~tempcode));//返回置1码
    }
       else scancode=(scancode<<1)|0x01;//移位
     }
      return(0);
    }
  }
}
unsigned char convert1(unsigned char key1,unsigned char i3)
{
 unsigned char i1,key;
 i1=i3;
 if((i3>1)&&(i3<4))
  i1=i3+1;
 if(i3>3)
  i1=i3+2;
 delay();
 switch(key1)
 {
  case 0x81:PORTC=table1[i1];
    PORTB=0xFB;
    PORTA=0xc0;
    return (0);break;//0 按下相应的键显示相对应的码值
  case 0x82:PORTC=table1[i1];
   
    PORTA=0xf9;
   
    return (1);break;//1
  case 0x84:PORTC=table1[i1];
    PORTA=0xa4;
    return (2);break;//2
  case 0x88:PORTC=table1[i1];
    PORTA=0xb0;
    return (3);break;//3
  case 0x41:PORTC=table1[i1];
    PORTA=0x99;
    return (4);break;//4
  case 0x42:PORTC=table1[i1];
    PORTA=0x92;
    //PORTA=0xc0;
    return (5);break;//5
  case 0x44:PORTC=table1[i1];
    PORTA=0x82;
    return (6);break;//6
  case 0x48:PORTC=table1[i1];
    PORTA=0xf8;
    return (7);break;//7
  case 0x21:PORTC=table1[i1];
    PORTA=0x80;
    return (8);break;//8
  case 0x22:PORTC=table1[i1];
    PORTA=0x90;
    return (9);break;//9
  default:break;
 }
}
int convert()
{
 l_tmpdisplay[0]=l_tmpdate[2]/10;
 l_tmpdisplay[1]=l_tmpdate[2]%10;
 l_tmpdisplay[2]=10;
 l_tmpdisplay[3]=l_tmpdate[1]/10;
 l_tmpdisplay[4]=l_tmpdate[1]%10;
 l_tmpdisplay[5]=10;
 l_tmpdisplay[6]=l_tmpdate[0]/10;
 l_tmpdisplay[7]=l_tmpdate[0]%10;
}
/*SIGNAL(SIG_OVERFLOW2)
{

    static unsigned char i=0,num;
  
  PORTA=table[l_tmpdisplay[i]];  //查表法得到要显示数字的数码段
 PORTC=table1[7-i];
 i++;
 if(i==8)
   {
    i=0;
   }
 }*/
void main()
{
   unsigned char i;
   unsigned char key=0;
   unsigned char set;
   DDRA=0XFF;
   PORTA=0XFF;
   DDRC=0XFF;
   PORTC=0XFF;
   DDRB=0XFF;
   PORTB=0XFF;
   convert();
   TCCR0=_BV(CS01)|_BV(CS00);//|_BV(CS00);//clk/1024
   //TCCR0|=_BV(CS01);
   TIMSK=_BV(TOIE0);//中断屏蔽寄存器
   //TIMSK=_BV(TOIE2);
   /*UBRRH=0;
   UBRRL=47;//9600 baud 7.3728MHz:38      4MHz:25
   UCSRB=(1<<RXEN)|(1<<TXEN); */
   sei();
  
   while(1)
   {
 key=keyscan();
 //putc(key);
 if(key==0x18)
  {
  
  cli();
  delay(); 
  delay();
  
  for (set=0;set<6;set++)
  {
   delay();
   delay();
   key=keyscan();
   //key=0;
   while(key==0xf0)
   { 
    key=keyscan();
    PORTB=0XFE;
    delay();
    delay();
   }
   
   //key=keyscan();
   delay();
   l_tmpdate[set]=convert1(key,set);
   PORTB=0XFD;
   delay();
  }
   l_tmpdate[0]=l_tmpdate[0]+10*l_tmpdate[1];
   l_tmpdate[1]=l_tmpdate[2]+10*l_tmpdate[3];
   l_tmpdate[2]=l_tmpdate[4]+10*l_tmpdate[5];
    g_bCount=0;
   sei();
  
  
  }
   }
}


分享到:

本站相关资讯链接QQ电子网
找不到想要的,那就在这里Google一下!
(责任编辑:admin)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名:密码: 验证码:点击我更换图片
发布者资料
lihom 查看详细资料 发送留言 加为好友 用户等级:注册会员 注册时间:2010-04-05 09:04 最后登录:2010-04-10 10:04
推荐内容
站长推荐