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

📄 testmega8.c

📁 mega8数码管电子钟程序
💻 C
字号:

#include<avr/io.h>
#include<avr/interrupt.h>
#include<avr/signal.h>
#include<avr/delay.h>
#include"io_bit.h"
#define uchar unsigned char
uchar a[]={0x81,0xed,0x43,0x49,0x2d,0x19,0x11,0xcd,0x01,0x09,0xef};  //LED码"0,1,2,3,4,5,6,7,8,9,-"
uchar b[]={0x08,0x04,0x02,0x01};                                    //位选
uchar w=0,x=0,y=0,z=0,s=0;
uchar hh=0,hl=0,mh=0,ml=0;
uchar v,j=0xff,kg=0;
unsigned int ii=0x42a,iii=0;
unsigned int c=0;
unsigned int u;
uchar signal=0;      //标志寄存器
void led(uchar h,uchar hh,uchar m,uchar mm)  //数码管扫描程序模块
{     uchar i;
      
     PORTD=a[h]; PORTC=b[3];
      for(i=0;i<60;i++)
     {}  
    
     PORTC=0X0;PORTD=0Xff; for(i=0;i<40;i++){}
          
	   
	 PORTD=a[hh]; PORTC=b[2];
      for(i=0;i<60;i++)
     {}   
     PORTC=0X0;PORTD=0Xff; for(i=0;i<40;i++){}
     if(c!=0)
        {c=c-1;PORTD=0XFE; PORTC=b[2];
	        	for(i=0;i<60;i++){}
              PORTC=0X0;PORTD=0Xff; for(i=0;i<60;i++){} }    

     PORTD=a[m]; PORTC=b[1];
     
     for(i=0;i<60;i++)
     {}
     PORTC=0X0; PORTD=0XFF;for(i=0;i<40;i++){}
     PORTD=a[mm]; PORTC=b[0];
     for(i=0;i<60;i++)
     {}   
     PORTC=0X0;PORTD=0XFF; for(i=0;i<40;i++){} 
  
     }
	 


void check1(void)    //	检查时钟进位
{ 
	  if(z==10){z=0;y=y+1;}
      if(y==6){y=0;x=x+1;}
      if(x==10){x=0;w=w+1;}
      if((w==2)&&(x==4)){w=0;x=0;}  
	  if((w==hh)&&(x==hl)&&(y==mh)&&(z==ml)&&(s==0)&&((signal&0x01)==0x01)){kg=0xff;} //开闹钟            
}       


   	  
SIGNAL(SIG_OVERFLOW2) //中断服务程序,减1秒模块 
{
      j=~j;
      TIFR|=_BV(TOV1);    //清中断标志寄存器       
	  c=0x01CF;	
      s=s+1;
	  if(s==60){s=0;z=z+1;check1();} 
	 
}

//初始化程序
void Init_DS18B20(void)
{   unsigned char x=0;
  DQ=1;         					 //DQ先置高
  delay(8);          				  //稍延时
  DQ=0;           					  //发送复位脉冲
  delay(85);     				      //延时(>480us)
  DQ=1;         					 //拉高数据线
  delay(14);     					   //等待(15~60us)
  x=DQ;        						  //用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1
  delay(20);    
} /

int main()      //主函数
{
DDRD=0XFF;                           //定义d口输出
DDRC=0XFF;
DC4_0;
DB6_0;
DDRB=0X00;                           //定义b口输入
PORTB=_BV(PB0)|_BV(PB1)|_BV(PB2)|_BV(PB3);                         
TIMSK=0X00;        //关溢出中断允许
ASSR=_BV(AS2);     //选择32768时钟源
TCCR2=0x05;  //128分频
while(ASSR&0X07)    //等待
{}
SREG=0x80;     //开全局中断
//TIFR|=_BV(TOV2);  //请溢出中断标志

TIMSK=0x40;     //允许TIMER2溢出中断

//sei();                  //开中断

   while(1)
    { 
       v=PINB;       //判断有无按键按下
	   v=v&0x0f;
       switch(v)
       {   case 0x0E:cli(); x=x+1; 
				   check1();              //检查进位
				   if(w==2&&x==5){x=0;}
	               for(u=0;u<500;u++){led(w,x,y,z);} ;break;	               	               
	            	               
		case 0x0D:cli(); z=z+1; 
				   check1();   //检查进位
	               for(u=0;u<500;u++){led(w,x,y,z);} ;break;	               

	               
	    }
		 sei();

        led(w,x,y,z);
     }
   
  

}




⌨️ 快捷键说明

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