4个独立键盘的同时使用

/**********************************************************************

    独立键盘使用

    S2开启数码管计时

    S3暂停数码管计时

    S4打开所有的LED

    S5关闭所有的LED

    而且要控制数码管以1S的间隔闪烁

    **1.要知道按键按下时存在抖动,就像数码管会有重影一样,要知道消抖

    **2.要知道定时器怎么装入初值,根据什么计算初值

    **3.要检测是否松开按键

    **4.要理解打开所有LED可以直接P1 = 0;但关闭所有LED不能P1= 1

*********************************************************************/

#include <reg52.h>

 

#define uint unsigned int

#define uchar unsigned char

 

sbit we = P2^7;

sbit du = P2^6;

sbit key_2 = P3^0;

sbit key_3 = P3^1;

sbit key_4 = P3^2;

sbit key_5 = P3^3;

 

 

uchar code arry[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

 

void delay(uint i);

 

void delay(uint i)//软件延时函数

{

    uchar a,b;

 

    for(a = i;a > 0;a--){

        for(b = 114;b > 0;b--);

    }

 

}

 

void main()

{

    uchar a,b;

    TMOD = 0x01;//使定时器工作模式为定时器的方式1

    TH0 = 0x4b; //装入初值,使定时50ms(根据晶振的不同,初值不同)

    TL0 = 0xfc;

           

    we = 1;

    P0 = 0xfe;

    we = 0;

 

    while(1){

                    

        if(TF0 == 1){//判断定时器是否装满溢出

            TH0 =0x4b;

            TL0 = 0xfc;

            TF0 = 0;

            a++; //统计溢出次数

        }

        if(a == 20){ //溢出次数为20次时,就达到了1s

            a = 0; //重置溢出检测值,以进行下1s检测

            b++;   //秒数计时

        }

        if(b == 10){ //检测是否已经到了10s

            b = 0;

        }

 

        du = 1;

        P0 = arry[b];

        du = 0;

        delay(5);

   

        if(key_2 == 0){ //检测是否S2按下

            delay(5);   //软件消抖(因为按键按下时和松开时,会有抖动,

//                         所以软件延时避开抖动时间)

            if(key_2 == 0){ //再次检测是否按下

                TR0 = 1;//如果按下的话,就打开定时器,开始计时

            }

            while(!key_2);//松手检测(如果松开的话,会有上拉电阻置1,不松开一直为0)

        }

        if(key_3 == 0){

            delay(5);

            if(key_3 == 0){

                TR0 = 0;  //关闭定时器,暂停计时

             }

             while(!key_3);

        }

        if(key_4 == 0){

            delay(5);

            if(key_4 == 0){

                P1 = 0; //因为LED的IO口都在P1,所以将P1直接置1就能打开所有的LED

             }

             while(!key_4);

        }

        if(key_5 == 0){

            delay(5);

            if(key_5 == 0)

                P1 = 0xff ;//关闭LED

            while(!key_5);

       

        }

 

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值