/****以下是一个用数码管显示的简易
电子时钟,只有分秒****/
#include<iom16v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
uchar smg_data[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
uchar sec,min;
uint flag=0;
/************中断初始化***************/
void init(void) //两毫秒延时
{
TCCR0|=(1<<CS00)|(1<<CS02);//普通计数模式,1024分频
TCNT0=0Xf0; //附计算初值
tiMSK|= (1<<TOIE0); //BIT(0); //开使能TOIE0=1
SREG|= BIT(7); //开总中断
}
/*************数码管显示函数***************/
void display(uchar sum1,uchar sum2)
{
static uchar i;
static uchar temp[4];
temp[0] = smg_data[sum1/10];//数码管的进制
temp[1] = smg_data[sum1%10];
temp[2] = smg_data[sum2/10];
temp[3] = smg_data[sum2%10];
PORTC=0Xff; //消影
PORTD&=~0X04<<i;//位选
PORTC=temp[i];
if(++i>=4){i=0;}
}
/******************主函数********************/
void main(void)
{
DDRC=0XFF;
DDRD=0XFF;
PORTC=0Xff;
PORTD=0Xff;
DDRB|=BIT(0);
PORTB|=BIT(0);//初始化
init();
while(1)
{
if(++flag==500) //2ms重复500次,1秒
{
flag=0;
if(++sec>=60)
{
sec=0;
if(++min>=60){min=0;}
}
}
display(min,sec);
}
}
/***********中断函数**************/
#pragma interrupt_handler timer0_isr:10
void timer0_isr(void)
{
TCNT0=0Xf0;
flag++;
}
-
-
AVR的学习开发板.pdf
下载积分: 积分 -1 分
57.02 KB, 下载次数: 13, 下载积分: 积分 -1 分
-
-
ATmega16_cn.PDF
下载积分: 积分 -1 分
2.78 MB, 下载次数: 3, 下载积分: 积分 -1 分
一周热门 更多>