Autorleaders控制组--任务3

数码管显示和闪烁

要用到数码管显示的代码和定时器代码。

数码管显示

#include <REGX52.H>
#include "Delay.h"
#include "DS1302.h"


unsigned char num[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x3E,0x40,0x00};

void a(unsigned char LOCATE,number)
{
	  switch(LOCATE)
	  {
			 case 1:
			    P2_4=1;P2_3=1;P2_2=1; 
		      break;
		   case 2:
					P2_4=1;P2_3=1;P2_2=0; 
			    break;
		   case 3:
			    P2_4=1;P2_3=0;P2_2=1;
		      break;
		   case 4:
			    P2_4=1;P2_3=0;P2_2=0; 
		      break;
		   case 5:
			    P2_4=0;P2_3=1;P2_2=1;
		      break;
		   case 6:
			    P2_4=0;P2_3=1;P2_2=0;
		      break;
		   case 7:
		    	P2_4=0;P2_3=0;P2_2=1;
		      break;
	     case 8:
		    	P2_4=0;P2_3=0;P2_2=0;
		      break;
			 case 9:
			    P2_4=1;P2_3=1;P2_2=1; 
		      break;
			}
	   P0=num[LCD_Time[number]];
		 Delay(1);
		 P0=0x00;      
}

void c(unsigned char LOCATE,number)
{
	  switch(LOCATE)
	  {
			 case 1:
			    P2_4=1;P2_3=1;P2_2=1; 
		      break;
		   case 2:
					P2_4=1;P2_3=1;P2_2=0; 
			    break;
		   case 3:
			    P2_4=1;P2_3=0;P2_2=1;
		      break;
		   case 4:
			    P2_4=1;P2_3=0;P2_2=0; 
		      break;
		   case 5:
			    P2_4=0;P2_3=1;P2_2=1;
		      break;
		   case 6:
			    P2_4=0;P2_3=1;P2_2=0;
		      break;
		   case 7:
		    	P2_4=0;P2_3=0;P2_2=1;
		      break;
	     case 8:
		    	P2_4=0;P2_3=0;P2_2=0;
		      break;
			 case 9:
			    P2_4=1;P2_3=1;P2_2=1; 
		      break;
			}
	   P0=num[number];
		 Delay(1);
		 P0=0x00;      
}

这里用到两个代码,下面的是用来显示‘-’的。

定时器

要用到两个定时器,因为要在调置时间和‘-’闪烁。所以先对两个定时器初始化。初始化使得定时器每溢出一次刚好过1ms。

#include <REGX52.H>


void Timer0_Init(void)   
{
	TMOD&=0xF0;      
	TMOD|=0x01;      
	TL0 = 0x66;				
	TH0 = 0xFC;				
	TF0 = 0;				
	TR0 = 1;				
	ET0=1;
	EA=1;
	PT0=0;
}

void Timer1_Init(void)   
{
	TMOD&=0x0F;      
	TMOD|=0x10;      
	TL1 = 0x66;				
	TH1 = 0xFC;				
	TF1 = 0;				
	TR1 = 1;				
	ET1=1;
	EA=1;
	PT0=0;
}
void Timer0_Routine() interrupt 1   //‘--’的闪烁
{
	static unsigned int T0Count;    
	TH0=0xFC;    
	TL0=0x66;
	T0Count++;
	if(T0Count>=500)          //亮占0.5s,暗占0.5s
	{
		T0Count=0;
		b=!b;
	}
}

void Timer1_Routine() interrupt 3      //时间设置时的闪烁
{
	static unsigned int T1Count;    
	TH1=0xFC;    
	TL1=0x66;
	T1Count++;
	if(T1Count>=250)          
	{
		T1Count=0;
		TimeSetFlashFlag=!TimeSetFlashFlag;
	}
}

 矩阵键盘的控制

unsigned char MatrixKey()  
{
	unsigned char KeyNumber=0;  
	
	P1=0xFF;
	P1_3=0;
	if(P1_7==0){Delay(20);if(P1_7==0)KeyNumber=1;}
	if(P1_6==0){Delay(20);if(P1_6==0)KeyNumber=5;}
	if(P1_5==0){Delay(20);if(P1_5==0)KeyNumber=9;}
	if(P1_4==0){Delay(20);if(P1_4==0)KeyNumber=13;}

	P1=0xFF;
	P1_2=0;
	if(P1_7==0){Delay(20);if(P1_7==0)KeyNumber=2;}
	if(P1_6==0){Delay(20);if(P1_6==0)KeyNumber=6;}
	if(P1_5==0){Delay(20);if(P1_5==0)KeyNumber=10;}
	if(P1_4==0){Delay(20);if(P1_4==0)KeyNumber=14;}

	P1=0xFF;
	P1_1=0;
	if(P1_7==0){Delay(20);if(P1_7==0)KeyNumber=3;}
	if(P1_6==0){Delay(20);if(P1_6==0)KeyNumber=7;}
	if(P1_5==0){Delay(20);if(P1_5==0)KeyNumber=11;}
	if(P1_4==0){Delay(20);if(P1_4==0)KeyNumber=15;}

	P1=0xFF;
	P1_0=0;
	if(P1_7==0){Delay(20);if(P1_7==0)KeyNumber=4;}
	if(P1_6==0){Delay(20);if(P1_6==0)KeyNumber=8;}
	if(P1_5==0){Delay(20);if(P1_5==0)KeyNumber=12;}
	if(P1_4==0){Delay(20);if(P1_4==0)KeyNumber=16;}

	
	return KeyNumber;   
}

用到学长上次讲的代码,这样按下去后就不会熄灭。

时间设置代码

void TimeSet()
{
	if(KeyNum_Last==0&&KeyNum==1)
	{
		n=1;
		DS1302_Time[0]++;
		if(DS1302_Time[0]>23){DS1302_Time[0]=0;}
		Key=1;
	    DS1302_SetTime();
		DS1302_ReadTime();
	}
	if(KeyNum_Last==0&&KeyNum==5)
	{
		n=1;
		DS1302_Time[0]--;
		if(DS1302_Time[0]<0){DS1302_Time[0]=23;}
		Key=2;
	    DS1302_SetTime();
		DS1302_ReadTime();
	}
	if(KeyNum_Last==0&&KeyNum==2)
	{
    n=1;		
		DS1302_Time[1]++;
		if(DS1302_Time[1]>59){DS1302_Time[1]=0;}
		Key=3;
	    DS1302_SetTime();
		DS1302_ReadTime();
	}
	if(KeyNum_Last==0&&KeyNum==6)
	{
		n=1;		
		DS1302_Time[1]--;
		if(DS1302_Time[1]<0){DS1302_Time[1]=59;}
		Key=4;
	    DS1302_SetTime();
		DS1302_ReadTime();
	}
	if(KeyNum_Last==0&&KeyNum==3)
	{
		n=1;
		DS1302_Time[2]++;
		if(DS1302_Time[2]>59){DS1302_Time[2]=0;}
		Key=5;
	    DS1302_SetTime();
		DS1302_ReadTime();
	}
	if(KeyNum_Last==0&&KeyNum==7)
	{
		n=1;
		DS1302_Time[2]--;
		if(DS1302_Time[2]<0){DS1302_Time[2]=59;}
		Key=6;
	    DS1302_SetTime();
		DS1302_ReadTime();
	}
	
	if(n==0)
	{
    	a(1,0);
        a(2,1);
        a(4,2);
        a(5,3);
        a(7,4);
        a(8,5);
		c(3,11);
		c(6,11);
	}
	
	if(Key==1 &&TimeSetFlashFlag==1)
	{
		 c(1,12);
		 c(2,12);
	     a(4,2);
	     a(5,3);
	     a(7,4);
	     a(8,5);
		 c(3,11);
		 c(6,11);
	}
	else if(Key==1 &&TimeSetFlashFlag==0)
	{
		 a(1,0);
         a(2,1);
         a(4,2);
         a(5,3);
         a(7,4);
         a(8,5);
		 c(3,11);
		 c(6,11);
	}
	
	if(Key==2 &&TimeSetFlashFlag==1)
	{
		 c(1,12);
		 c(2,12);
	     a(4,2);
	     a(5,3);
	     a(7,4);
	     a(8,5);
		 c(3,11);
		 c(6,11);
	}
	else if(Key==2 &&TimeSetFlashFlag==0)
	{
		 a(1,0);
         a(2,1);
         a(4,2);
         a(5,3);
         a(7,4);
         a(8,5);
		 c(3,11);
		 c(6,11);
	}
	
	if(Key==3 &&TimeSetFlashFlag==1)
	{
		 a(1,0);
         a(2,1);
	     c(4,12);
	     c(5,12);
	     a(7,4);
	     a(8,5);
		 c(3,11);
		 c(6,11);
	}
	else if(Key==3 &&TimeSetFlashFlag==0)
	{
		 a(1,0);
         a(2,1);
         a(4,2);
         a(5,3);
         a(7,4);
         a(8,5);
		 c(3,11);
		 c(6,11);
	}
	
	if(Key==4 &&TimeSetFlashFlag==1)
	{
		 a(1,0);
         a(2,1);
	     c(4,12);
	     c(5,12);
	     a(7,4);
	     a(8,5);
		 c(3,11);
		 c(6,11);
	}
	else if(Key==4 &&TimeSetFlashFlag==0)
	{
		 a(1,0);
         a(2,1);
         a(4,2);
         a(5,3);
         a(7,4);
         a(8,5);
		 c(3,11);
		 c(6,11);
	}
	
	if(Key==5 &&TimeSetFlashFlag==1)
	{
    	 a(1,0);
         a(2,1);
	     a(4,2);
	     a(5,3);
	     c(7,12);
	     c(8,12);
		 c(3,11);
		 c(6,11);
	}
	else if(Key==5 &&TimeSetFlashFlag==0)
	{
		 a(1,0);
         a(2,1);
         a(4,2);
         a(5,3);
         a(7,4);
         a(8,5);
		 c(3,11);
		 c(6,11);
	}
	
	if(Key==6 &&TimeSetFlashFlag==1)
	{
		 a(1,0);
         a(2,1);
	     a(4,2);
	     a(5,3);
	     c(7,12);
	     c(8,12);
		 c(3,11);
		 c(6,11);
	}
	else if(Key==6 &&TimeSetFlashFlag==0)
	{
		 a(1,0);
         a(2,1);
         a(4,2);
         a(5,3);
         a(7,4);
         a(8,5);
		 c(3,11);
		 c(6,11);
	}
}

思路:

就是在定时器工作的情况下,每一次溢出就轮换亮和暗。TimeSetFlashFlag==0就暗,TimeSetFlashFlag==1就亮。

注意,每次设置完时间都要先将数据给定时器,即定时器先读取,再设置才能在设置时间的界面看到加减后的时间。

主函数

void main()
{	
	LCD_Init();
  DS1302_Init();
  Timer0_Init();
  Timer1_Init();
	
	DS1302_SetTime();
	
	while(1)
	{
	  KeyNum=MatrixKey(); 
		if(KeyNum==4)
		{
				MODE=1;
		}
		if(KeyNum==8)
		{
				MODE=0;
			  DS1302_SetTime();
		}
		switch(MODE)
		{
			case 0:	  
				DS1302_ReadTime();
        if(b==0){c(3,11);c(6,11);}
	      else if(b==1){c(3,12);c(6,12);}	
		    a(1,0);
		    a(2,1);
		    a(4,2);
		    a(5,3);
		    a(7,4);
		    a(8,5);
        break;
			case 1:TimeSet();break;
		}
		KeyNum_Last=KeyNum;
  }
}

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值