/*******************************
delay。h
********************************/
#ifndef __DELAY__H
#define __DELAY__H
//extern unsigned char bb;
void Delay_us(void);
void Delay_nus(unsigned int t);
void Delay_ms(void);
void Delay_nms(unsigned int t);
#endif
/************************************
delay.c
**************************************/
/*--------------------------------------------------*/
/* AVR系统的处理器为: ATMega128 */
/* AVR系统的晶振频率: 7.3728 Mhz */
/*--------------------------------------------------*/
#include "delay.h"
/*-----------------------------------------------------------------------
Delay_us :1us延时函数
-----------------------------------------------------------------------*/
void Delay_us(void)
{
unsigned char t=3;
while(t--);
}
/*-----------------------------------------------------------------------
Delay_nus :长延时函数
输入参数: t :延时时间 us
-----------------------------------------------------------------------*/
void Delay_nus(unsigned int t)
{
while (t--)
Delay_us();
}
/*-----------------------------------------------------------------------
Delay_ms :1ms延时函数
-----------------------------------------------------------------------*/
void Delay_ms(void)
{
Delay_nus(1000);
}
/*-----------------------------------------------------------------------
Delay_nms :长延时函数
输入参数: t :延时时间 ms
-----------------------------------------------------------------------*/
void Delay_nms(unsigned int t)
{
while (t--)
Delay_ms();
}
/**********************************************
**********************************************/
/*********************************************************
程序名:计数器
功能:从1自加到10000,归零
环境:ICCAVR
编者:江湖浮萍
**********************************************************/
//调用头文件
#include<iom128v.h>
#include"delay.h"
#include<macros.h>
//定义全局变量
int a[11]={0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,0x03};
int b[11]={0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,0x03};
int k=0,interrupt_count=0,ck1=0,ck2=0,ck3=0,ck4=0;
led=0x01;
//初始化时间函数
void timer0_init(void)
{
TCCR0 =0x00;
ASSR =0x00;
TCNT0 =0x64;
OCR0 =0x00;
TCCR0 =0x07;
}
//端口初始化
void port_init(void)
{
DDRA =0xFF;
PORTA=0x01;
DDRB =0xFF;
PORTB=0xFF;
DDRC =0x00;
PORTC=0xFF;
}
/******************************************
定义中断函数,实现累加功能
*******************************************/
#pragma interrupt_handler timer0_ovf_isr:iv_TIMER0_OVF
void timer0_ovf_isr(void)
{
TCNT0=64;
if(k<=9)
{
if(interrupt_count<=1)
{
interrupt_count=interrupt_count+1;
}
else
{
if(ck4<=8)
{
if(ck3<=8)
{
if(ck2<=9)
{
if(ck1<=8)
{
ck1++;
}
else
{
if(ck2<=8)
{
ck1=0;
ck2++;
}
else
{
ck1=0;
ck2=0;
ck3++;
}
}
}
else
{
ck1=0;
ck2=0;
ck3++;
}
}
else
{
ck3=0;
ck4++;
}
}
else
{
ck4=0;
}
interrupt_count=0;
k++;
}
}
else
{
k=0;
}
}
//定义四个数码管所显示控制函数
void bit_1(void)
{
PORTB=a[ck1];
}
void bit_2(void)
{
PORTB=a[ck2];
}
void bit_3(void)
{
PORTB=a[ck3];
}
void bit_4(void)
{
PORTB=a[ck4];
}
void main(void)
{
int i=0,j;
port_init();
CLI(); //关闭中断
timer0_init();
MCUCR=0x00;
TIMSK=0x01;
SEI();
while(1)
{
if(!(PINC&0x01)) //判断是否有开关按下,若是,则开始计数
{ //如打开开关则计数停止,闭合则继续计数
for(i=0;i<4;i++)
{
if(i==0)
{
PORTA=(led<<i);
bit_1();
Delay_nus(10);
}
else if(i==1)
{
PORTA=(led<<i);
bit_2();
Delay_nus(10);
}
else if(i==2)
{
PORTA=(led<<i);
bit_3();
Delay_nus(10);
}
else
{
PORTA=(led<<i);
bit_4();
Delay_nus(10);
}
}
}
else
{
PORTA=0xFF;
PORTB=0x03;
}
}
} |