#include <avr/interrupt.h>
#include <util/delay.h>#define INT8U unsigned char
#define INT16U unsigned int
#define k1() ((PIND &(1<<PD0))==0x00)
#define k2() ((PIND &(1<<PD1))==0x00)
#define k3() ((PIND &(1<<PD2))==0x00)
#define k4() ((PIND &(1<<PD3))==0x00)
#define k5() ((PIND &(1<<PD4))==0x00)
#define k6() ((PIND &(1<<PD5))==0x00)
#define k7() ((PIND &(1<<PD6))==0x00)
#define k8() ((PIND &(1<<PD7))==0x00)const INT8U seg[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00}
INT8U seg11[]={0,0,0x40,0,0,0x40,0,0}
INT8U ja
INT8U key=0xff
INT8U h,m,s,m1,d
INT16U yvoid hour1()
{
if (++h>23) {h=0day()}
seg11[0]=seg[h/10]
seg11[1]=seg[h%10]
} void minute1()
{
if (++m>59)
{m=0<br> hour1()<br> }
seg11[3]=seg[m/10]
seg11[4]=seg[m%10]
} void second1() {
if (++s>59)
{ s=0
minute1()
}
seg11[6]=seg[s/10]
seg11[7]=seg[s%10]
}const INT8U Days1[]={0,31,28,31,30,31,30,31,31,30,31,30,31}
const INT8U Days2[]={0,31,29,31,30,31,30,31,31,30,31,30,31}
void year()
{if (++y>9999) y=0<br> <br>seg11[0]=seg[y/1000]<br>seg11[1]=seg[y%1000/100]<br>seg11[2]=seg[y%100/10]<br>seg11[3]=seg[y%10]<br>} void month1()
{
if (++m1>12)
{m1=0<br> year()<br> }
seg11[4]=seg[m1/10]
seg11[5]=seg[m1%10]
} void day()
{ INT8U DAY
DAY=(( y%4==0 &&y%100!=0 )||( y%400==0 ) ) ? Days1[m1]:Days2[m1]//判断闰年
if(++d>DAY)
{ d=0
month1()
}
seg11[6]=seg[d/10]
seg11[7]=seg[d%10]
} //时间函数
void time()
{
seg11[0]=seg[h/10]
seg11[1]=seg[h%10]
seg11[3]=seg[m/10]
seg11[4]=seg[m%10]
seg11[6]=seg[s/10]
seg11[7]=seg[s%10]
PORTA=0x00
PORTA=seg11[ja]PORTB=~(1<<ja)
ja=(ja+1)&0x07
_delay_ms(5) }
//日期
void date()
{seg11[0]=seg[y/1000]
seg11[1]=seg[y%1000/100]
seg11[2]=seg[y%100/10]
seg11[3]=seg[y%10]
seg11[4]=seg[m1/10]
seg11[5]=seg[m1%10]
seg11[6]=seg[d/10]
seg11[7]=seg[d%10]
//seg11[2]=seg11[5]=0x00
PORTA=0x00
PORTA=seg11[ja]
PORTB=~(1<<ja)
ja=(ja+1)&0x07
_delay_ms(3)
}
int main()
{ INT8U ja=0
DDRA=0xffPORTA=0xff
DDRB=0xffPORTB=0xff
DDRD=0x00PORTD=0xffPIND=0x00
MCUCR=0X0A//MCU 控制寄存器- MCUCR
GICR=0XC0 //通用中断控制寄存器- GICR ASSR=0x08
TCCR2=0x04
TCNT2=0
TIMSK=_BV(TOIE2)|_BV(TOIE0) d=26y=2000m1=2
h=m=s=12
sei()
while(1)
{time()
if(k1())
/{ while(k1())hour1()}
if(k8())
{ while(k8())
while(2)//日期循环
{
date()
if(k8())
{while(k8())break}}
}
}}
ISR(TIMER2_OVF_vect) {
if( seg11[2]==0x40)
{
seg11[2]=seg11[5]=0x00
}
else
{ seg11[2]=seg11[5]=0x40
second1()
}
}
程序设计思路:1.利用单片机内部定时器作为计时器,调用timer函数;2、设计州隐一套按键子程序;(3)设计一套数码显示管子程序。下列提供一套程序供参考。
#include<iom16v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
const uchar table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}//0-9对应字符
const uchar key_value[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}
uchar data[4]={0}//显示初始值为0
uint count=0 //初始计数值为0
uchar keynum
void port_init() //端口初始化函数
{DDRA=0XFF //端口A为推挽1输出
PORTA=0XFF
PORTB=0XFF //端口B为推挽1输出
DDRB=0XFF
DDRC=0XFF //端口C为不带上拉电阻的输入
PORTC=0XFF
DDRD=0XFF //端口D低4位为输出
PORTD=0X0F
}
void delay(uint j) //延时函数
{uint k
while(j--)
{for(k=1000k>0k--) }
}
void display(uchar *p) //显示函数
{uchar i,sel=0x01
for(i=0i<4i++)
{PORTA=sel //选通最右边的数码管
PORTB=table[p[i]]//送字型码
delay(1)
sel=sel<<1 盯穗 //左移一位
}
}
uchar get_key(void)
{if((PIND&0X0F)!=0X0F) delay(3)
{
PORTD=0XEF
switch(PIND&0X0F)
{case 0x0e: keynum=key_value[0]break
case 0x0d: keynum=key_value[4]break
case 0x0b: keynum=key_value[8]break
case 0x07: keynum=key_value[12]break
default:break
}
PORTD=0xdf
switch(PIND&0X0F)
{case 0x0e:keynum=key_value[1]break
case 0x0d:keynum=key_value[5]break
case 0x0b:keynum=key_value[9]break
case 0x07:keynum=key_value[13]break
default:break
}
PORTD=0xbf
switch(PIND&0X0F)
{case 0x0e:keynum=key_value[2]break
case 0x0d:keynum=key_value[6]break
case 0x0b:keynum=key_value[10]break
case 0x07:keynum=key_value[14]break
default:break
}
PORTD=0x7f
switch(PIND&0X0F)
{case 0x0e:keynum=key_value[3]break
case 0x0d:keynum=key_value[7]break
case 0x0b:keynum=key_value[11]break
case 0x07:keynum=key_value[15]break
default:break
}
while((PIND&0x0f)!=0x0f)
}
return keynum
}
void process(uint i,uchar *q) //拆分BCD码函数,显示千、百、十、个位
{ q[0]=i/1000
凯迹卜i=i%1000
q[1]=i/100
i=i%100
q[2]=i/10
i=i%10
q[3]=i
}
void main(void)
{port_init()
PORTB=0xff
PORTA=0X00
delay(50)
PORTA=0xff
while(1)
{get_key()
count=keynum
process(count,data)
display(data)
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)