#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();
}
}
}
本站相关资讯链接
找不到想要的,那就在这里Google一下!
(责任编辑:admin)
