半小时三等奖程序是蓝桥杯单片机比赛的基础程序,并不是真正意义上的三等奖。下面我根据自己的理解,对半小时省赛三等奖的程序进行解读。
基础操作单元:1、LED灯 2、数码管 3、独立按键 4、矩阵键盘 5、蜂鸣器和继电器
我们的程序也是围绕这几个操作单元来写的。下面我通过注释的方式对程序进行解读。
#include <STC15F2K60S2.H>
#define uchar unsigned char
#define uint unsigned int
//变量
uchar num; //矩阵按键赋值变量
uchar S1,S2,S3,S4; //独立按键赋值变量
uchar yi,er,san,si,wu,liu,qi,ba; //数码管的位选值
uchar tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF}; //数码管的段选值
//函数
void Allinit(void); //初始化
void Delayms(uint ms); //延时
void SGM1(uchar yi,uchar er); //数码管
void SGM2(uchar san,uchar si);
void SGM3(uchar wu,uchar liu);
void SGM4(uchar qi,uchar ba);
void Key(void); //独立按键
void Key16(void); //矩阵键盘
void main(void) //主函数
{
while(1)
{
}
}
void Key16(void) //矩阵键盘函数
{
uchar temp;
P44=1;P42=0;P3=0x7f;
//矩阵键盘大部分是由P3口控制,其中列由高四位控制,行由低四位控制
temp=P3;
tmep=temp&0x0f;
//检验低四位是否发生变化
if(temp!=0x0f)//如果发生变化则是有按键按下
{
Delayms(5); //延时消抖
if(temp!=0x0f)
{
temp=P3;
switch(temp) //进入选择判断语句,检测该列的那个按键按下
{
case 0x7e: num=1;break; //0111 1110 高位代表列(1列)低位代表行(1行)
case 0x7d: num=2;break;
case 0x7b: num=3;break;
case 0x77: num=4;break;
}
while(temp!=0x0f) //松手检测,如果有按键按下,则一直进行判断,直到松手
{
temp=P3;
tmep=temp&0x0f;
}
}
}
}
void Key(void) //独立按键函数
{
if(P30==0) //如果按键按下
{
Delayms(5); //延时消抖
if(P30==0)
{
S1=1; //赋值
}
while(!P30);//松手检测
}
if(P31==0)
{
Delayms(5);
if(P31==0)
{
S2=2;
}
while(!P31);
}
if(P32==0)
{
Delayms(5);
if(P32==0)
{
S3=3;
}
while(!P32);
}
if(P33==0)
{
Delayms(5);
if(P33==0)
{
S4=4;
}
while(!P33);
}
}
void SGM1(uchar yi,uchar er) //数码管函数
{
P2=0xC0; //打开数码管位选573
P0=0x01; //选择第一位数码管
P2=0xE0; //打开数码管段选573
P0=tab[yi]; //显示数值
Delayms(1); //进行延时,实现动态数码管
P2=0xC0;
P0=0x02;
P2=0xE0;
P0=tab[er];
Delayms(1);
}
void SGM2(uchar san,uchar si)
{
P2=0xC0;
P0=0x04;
P2=0xE0;
P0=tab[san];
Delayms(1);
P2=0xC0;
P0=0x08;
P2=0xE0;
P0=tab[si];
Delayms(1);
}
void SGM3(uchar wu,uchar liu)
{
P2=0xC0;
P0=0x10;
P2=0xE0;
P0=tab[wu];
Delayms(1);
P2=0xC0;
P0=0x20;
P2=0xE0;
P0=tab[liu];
Delayms(1);
}
void SGM4(uchar qi,uchar ba)
{
P2=0xC0;
P0=0x40;
P2=0xE0;
P0=tab[qi];
Delayms(1);
P2=0xC0;
P0=0x80;
P2=0xE0;
P0=tab[ba];
Delayms(1);
}
void Delayms(uint ms) //延时函数
{
uint i,j;
for(i=0;i<ms;i++)
for(j=845;j>0;j--);
}
void Allinit(void) //初始化函数
{
P2=0x80; //打开LED灯573锁存器
P0=0x00;
P2=0xA0; //打开蜂鸣器和继电器573锁存器
P0=0xFF;
P2=0xC0; //打开数码管位选537锁存器
P0=0x00;
P2=0xE0; //打开数码管段选537锁存器
P0=0x00;
}
想必看了上面的代码注释还是有些云里雾里的吧,其实在学习单片机的过程中,看懂原理图也是很重要的一步,我们写的代码都是根据硬件电路来进行操作的,如果脱离了硬件电路对于我们理解和学习单片机都是困难的,在看代码的过程中,我们一定要结合原理图进行理解。