微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求帮忙看一下程序

求帮忙看一下程序

时间:10-02 整理:3721RD 点击:

#include <reg52.h>

sbit  KEY1 = P2^4;

sbit  KEY2 = P2^5;

sbit  KEY3 = P2^6;

sbit  KEY4 = P2^7;

sbit  ADDR0 = P1^0;

sbit  ADDR1 = P1^1;

sbit  ADDR2 = P1^2;

sbit  ADDR3 = P1^3;

sbit  ENLED = P1^4;

unsigned char code LedChar[] = {

    0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,

    0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8e

};  //数码管真值表

void delay(void);       //延时函数声明

void main(void)

{

    bit keybuf = 1;    //按键值暂存,临时保存按键的扫描值

    bit backup = 1;    //按键值备份,保存前一次的扫描值

    unsigned char counter = 0;  //计数器记录按键按下的次数

   

    //选择最右边的数码管进行显示

    P0 = LedChar[counter];

    ADDR0 = 0;

    ADDR1 = 0;

    ADDR2 = 0;

    ADDR3 = 1;

    ENLED = 0;

    //选中第一行按键以进行扫描

    P2 = 0xF7;

   

    while(1)

    {

        keybuf = KEY4;            //只取KEY4为例,把当前扫描值暂存

        if (keybuf != backup)    //当前值与前一次值不相等说明此时按键有动作

        {

            delay();              //延时大约10ms

            if (keybuf == KEY4)   //判断扫描值有没有发生改变,即按键抖动

            {

                if (backup == 0)  //如果前一次的值为0,则说明当前状态是由0变为1,即按键弹起

                {

                    counter++;    //计数器+1

                    if (counter >= 10)

                    {         //只用1个数码管显示,所以记到10就清零重新开始

                        counter = 0;

                    }

                    P0 = LedChar[counter];  //计数值显示到数码管上

                }

                backup = keybuf;  //更新备份为当前值,以备进行下次比较

            }

        }

    }

}

void delay(void)

{

    unsigned int i = 1000;

    while (i--);  //通过debug的KEIL软件延时方式计算得出大概是10ms

}

把图纸传上来,不然没法分析,还有程序有什么问题

学习一下

这个程序是记录按键弹起次数 并通过数码管显示出来

  keybuf = KEY4;            //只取KEY4为例,把当前扫描值暂存

        if (keybuf != backup)    //当前值与前一次值不相等说明此时按键有动作


这两步不知道怎么来的


将当前IO口状态与之前的状态对比     不同的话肯定就说明按键状态变化了

嗯嗯,谢谢你哈

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top