⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 miaobiao.c

📁 单片机数码管秒表程序。有复位和计时功能。
💻 C
字号:
/*****************************************************
Project : miaobiao
Date    : 2007-11-3
Author  : LaoLang                       
Chip type           : ATmega16
Clock frequency     : 4.000000 MHz
*****************************************************/
//INT0:500HZ
//INT1:key    键盘输入
 
#include <delay.h>
#include <mega16.h>                             
flash unsigned char led[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; 
flash unsigned char position[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
char tempbuff[6];                             //缓存
char min,sec,dsec;                            
bit point_on;
bit time_ds=0; 
int counter_ds=0;                             //百分之一秒统计
int counter_s=0;                              //秒统计
char pos=0; 
char key=0;

void display(void)                            //显示函数
{
    PORTC=0XFF;                               //关字型
    if(++pos>=6)
    {
        pos=0;
    }
    PORTA=led[tempbuff[pos]];                 //送字形
    if(point_on)
    {
        if(pos==2 || pos==4)
        {
            PORTA |= 0x80;
        }
    }
    PORTC=position[pos];
}

interrupt [EXT_INT0] void ext_int0_isr(void)   //外部中断0服务程序
{
    display();
    if(++counter_ds>=5) 
    {
        time_ds=1;
        counter_ds=0;
    }                
    if(++counter_s>=500)
    {
        point_on=~point_on;
        counter_s=0;
    }
}

interrupt [EXT_INT1] void ext_int1_isr(void) //外部中断1服务程序
{
    delay_ms(20);                            //如果确认有键盘按下就改变当前状态
    if(PIND.3==0)
    {
        ++key;        
    }    
}             

void time_to_buff(void)
{
    tempbuff[0]=dsec%10;
    tempbuff[1]=dsec/10;
    tempbuff[2]=sec%10;
    tempbuff[3]=sec/10;
    tempbuff[4]=min%10;
    tempbuff[5]=min/10;
}

void main(void)
{
    PORTA=0x00;
    DDRA=0xFF; 
    PORTC=0xFF;
    DDRC=0xFF;
    PORTD=0x00;
    DDRD=0x00;
   
    dsec=sec=min=0;
    time_to_buff();
    PORTA=led[0];
    PORTC=0; 
// External Interrupt(s) initialization
// INT0: Off
// INT1: On
// INT1 Mode: Falling Edge
// INT2: Off
    GICR=0x80;                                 //开中断1关中断0
    MCUCR=0x08;
    MCUCSR=0x00;
    GIFR=0x80;
    #asm("sei")

while (1)
    { 
        if(key==1)                             //状态1
        {                                      //开中断0,计时
            GICR=0xC0;                         
            MCUCR=0x0A;
            MCUCSR=0x00;
            GIFR=0xC0; 
            if(time_ds)
            {
                time_ds=0;
                if(++dsec>=100)
                {   
                    dsec=0;
                    if(++sec>=60)
                    {
                        sec=0;
                        if(++min>=100)
                        {   
                            min=0;
                        }
                    }
                } 
                time_to_buff();
            }  
        }     
        if(key==2){}                            //状态2停止计时
        if(key==3)                              //状态3
        {
            key=0;                              //状态清0
            GICR=0x80;                          //关中断0
            MCUCR=0x08;
            MCUCSR=0x00;
            GIFR=0x80;
            PORTA=led[0];
            PORTC=0;                            //清0
            dsec=0;
            sec=0;
            min=0;
        }      
             
    };
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -