0基础5天学完蓝桥杯单片机————第二天(独立键盘/矩阵键盘、定时器)

在蓝桥杯单片机中,独立键盘和矩阵键盘是2选1,所以两种都需要学会,定时器也是如此。

这部分是基于定时器1的时钟,可以通过矩阵键盘/独立键盘去设置时钟时间,开启、暂停,并具有整点报时功能。

#include <STC15F2K60S2.H>
#include <intrins.h> //包括延时函数的nop,左移,右移函数


#define uc unsigned char
#define ui unsigned int

#define LED(X) {P0=X;P2=P2&0X1F|0X80;P2=P2&0X1F;}//通道4
#define BUZ(X) {P0=X;P2=P2&0X1F|0XA0;P2=P2&0X1F;}//通道5
#define COM(X) {P0=X;P2=P2&0X1F|0XC0;P2=P2&0X1F;}//通道6
#define SEG(X) {P0=X;P2=P2&0X1F|0XE0;P2=P2&0X1F;}//通道7

void smg_sz();

/*******全局变量定义********/
ui count;
uc s=23;
uc f=59;
uc m=50;
char Rdat;
/***********独立按键定义************/
//sbit S7=P3^0;
//sbit S6=P3^1;
//sbit S5=P3^2;
//sbit S4=P3^3;
/***********矩阵按键定义************/
sbit H1=P3^0;
sbit H2=P3^1;
sbit H3=P3^2;
sbit H4=P3^3;
sbit L1=P3^4;
sbit L2=P3^5;
sbit L3=P4^2;
sbit L4=P4^4;

uc code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc6,0x8e,0x8C,0xC1,0x86,0xbf,0x88};//0-9,C,F,P,U,E,-


/*********分别定义led,蜂鸣器/继电器的共用体***********/
typedef union{
    uc led_dat;//定义一个8位数据
	struct{
	uc led1:1;
	uc led2:1;
	uc led3:1;
	uc led4:1;
	uc led5:1;
	uc led6:1;
	uc led7:1;
	uc led8:1;
	}led_one;
}led_two;
static xdata led_two s_led;
typedef union{
    uc other_dat;//定义一个8位数据
	struct{
	uc other1:4;
	uc other2:1;
	uc other3:1;
	uc other4:1;
	}other_one;
}other_two;
static xdata other_two s_other;
/*************led独立控制***************/
void led_dlkz(uc led_x,uc on_of)
{
	switch(led_x)
	 {
	  case 1:s_led.led_one.led1=(on_of==1)?1:0;break;
	  case 2:s_led.led_one.led2=(on_of==1)?1:0;break;
	  case 3:s_led.led_one.led3=(on_of==1)?1:0;break;
	  case 4:s_led.led_one.led4=(on_of==1)?1:0;break;
	  case 5:s_led.led_one.led5=(on_of==1)?1:0;break;
	  case 6:s_led.led_one.led6=(on_of==1)?1:0;break;
	  case 7:s_led.led_one.led7=(on_of==1)?1:0;break;
	  case 8:s_led.led_one.led8=(on_of==1)?1:0;break;
	 }
	 LED(s_led.led_dat);
}
/*************蜂鸣器、继电器独立控制***************/
void FMQ(on_of)
{
 s_other.other_one.other4=(on_of==1)?1:0;
 BUZ(s_other.other_dat);
}
void JDQ(on_of)
{
 s_other.other_one.other2=(on_of==1)?1:0;
 BUZ(s_other.other_dat);
}
/***********数码管显示函数***************/
void Delay100us()		//@12.000MHz
{
	unsigned char i, j;

	i = 2;
	j = 39;
	do
	{
		while (--j);
	} while (--i);
}
void OutputSMG(uc gqb,uc yxl)
{
   uc i=0;
  for(i=0;i<8;i++)
   {
	SEG(0xff);
	COM(0X01<<gqb);
	SEG(yxl);
	Delay100us();
   }
   COM(0X00);
   SEG(0x00);
}
/*******************定时器的应用**********/
 void Timer1Init(void)		//500微秒@12.000MHz
{
	AUXR |= 0x40;		//定时器时钟1T模式
	TMOD &= 0x0F;		//设置定时器模式
	TL1 = 0x90;		//设置定时初值
	TH1 = 0xE8;		//设置定时初值
	TF1 = 0;		//清除TF1标志
	TR1 = 1;		//定时器1开始计时
	EA=1;
	ET1=1;
}
void tim0()interrupt 3
{
  count++;
 if(count==2000)
 {
   count=0;
   m++;
   if(m>59)
   { m=0;f++;
   	if(f>59)
	{f=0; s++;
	  if(s>23)
	  {s=0;}
	}}}
}

/*******************独立键盘***************/
void Delay1ms()		//@12.000MHz
{
	unsigned char i, j;

	i = 12;
	j = 169;
	do
	{
		while (--j);
	} while (--i);
}
/***********独立按键函数***************/
//void keycan()
//{
// if(S7==0) //s7
//  {
//    Delay1ms(); 
//    if(S7==0)
//	  {	while(S7==0)
//	   {smg_sz();}
//	   TR1=~TR1;
//	  }
//	 }
//	 if(S6==0) //s6
//  {
//    Delay1ms(); 
//    if(S6==0)
//	  {	while(S6==0)
//	   {smg_sz();}
//	   m++;if(m>59){m=0;}
//	  }
//	 }
//	 if(S5==0) //s7
//  {
//    Delay1ms(); 
//    if(S5==0)
//	  {	while(S5==0)
//	   {smg_sz();}
//	  f++;if(f>59){f=0;}
//	  }
//	 }
//	 if(S4==0) //s7
//  {
//    Delay1ms(); 
//    if(S4==0)
//	  {	while(S4==0)
//	   {smg_sz();}
//	  s++;if(s>23){s=0;}
//	  }
//	 }
//}
/*************矩阵按键函数***********/
void keycan()
{
 H1=0;
 H2=H3=H4=1;
 L1=L2=L3=L4=1;
 if(L4==0)
 {Delay1ms();while(L4==0){smg_sz();} TR1=~TR1;}
 H2=0;
 H1=H3=H4=1;
 L1=L2=L3=L4=1;
 if(L4==0)
 {Delay1ms();while(L4==0){smg_sz();}  m++;if(m>59){m=0;}}
 H3=0;
 H2=H1=H4=1;
 L1=L2=L3=L4=1;
 if(L4==0)
 {Delay1ms();while(L4==0){smg_sz();}  f++;if(f>59){f=0;}}
 H4=0;
 H2=H3=H1=1;
 L1=L2=L3=L4=1;
 if(L4==0)
 {Delay1ms();while(L4==0){smg_sz();} s++;if(s>23){s=0;}}
}
/*************其他显示*****************/
void other_x()
{
   if(m==0&&f==0)
	{ 
	JDQ(1);
	FMQ(1);
	led_dlkz(1,0);
	led_dlkz(8,0);
	}
	else
	{
	JDQ(0);
	FMQ(0);
	led_dlkz(1,1);
	led_dlkz(8,1);
	}

}
/*************数码管显示时钟*****************/
void smg_sz()
{
    OutputSMG(0,tab[s/10]);
	OutputSMG(1,tab[s%10]);
	   OutputSMG(2,tab[15]);
	OutputSMG(3,tab[f/10]);
	OutputSMG(4,tab[f%10]);
	   OutputSMG(5,tab[15]);
    OutputSMG(6,tab[m/10]);
	OutputSMG(7,tab[m%10]);
	other_x();
}
/*****************系统初始化****************/
void system_init()
{
   LED(0XFF);
   BUZ(0X00);
   COM(0X00);
   SEG(0x00);
}
/*********MAIN函数**********/
void main()
{
   system_init();
   Timer1Init();
   led_dlkz(5,1);
   while(1)
   {
/************时钟,整点报时,时钟设置**********/
    keycan();
	smg_sz();
   }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唐诗宋詞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值