蓝桥杯单片机半小时三等奖代码详解

本文解析了蓝桥杯单片机比赛半小时三等奖程序,介绍了基础操作单元如LED灯、数码管等,并通过注释详细解读了程序的每一部分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        半小时三等奖程序是蓝桥杯单片机比赛的基础程序,并不是真正意义上的三等奖。下面我根据自己的理解,对半小时省赛三等奖的程序进行解读。

         基础操作单元: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;
}

想必看了上面的代码注释还是有些云里雾里的吧,其实在学习单片机的过程中,看懂原理图也是很重要的一步,我们写的代码都是根据硬件电路来进行操作的,如果脱离了硬件电路对于我们理解和学习单片机都是困难的,在看代码的过程中,我们一定要结合原理图进行理解。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值