在蓝桥杯单片机中,独立键盘和矩阵键盘是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();
}
}