微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 矩阵键盘有几行代码不懂,求高手支招!

矩阵键盘有几行代码不懂,求高手支招!

时间:10-02 整理:3721RD 点击:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
uchar disnum,temp,key,num;
uchar code table_du[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0};
delay(uchar);
uchar keyscan();
void main()
{        
        disnum=16;
        wela=1;
        P0=0XFE;
        wela=0;
        while(1)
        {
        num=keyscan();        
        P0=table_du[num];
        dula=1;
        dula=0;
        
        }
        
}
uchar keyscan()
{
                P3=0xf0;
                temp=P3;                  
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                        delay(10);
                        if(temp!=0xf0)
                        {
                                temp=P3;
                            temp=temp|0X0f;        //这行代码表示什么意思?
                                P3=temp;
                                key=P3;
                                switch(key)
                                {
                                        case 0xee:disnum=0;         
                                                        break;
                                        case 0xde:disnum=1;
                                                        break;
                                        case 0xbe:disnum=2;
                                                        break;
                                        case 0x7e:disnum=3;
                                                        break;
                                        case 0xed:disnum=4;
                                                        break;
                                        case 0xdd:disnum=5;
                                                        break;
                                        case 0xbd:disnum=6;
                                                        break;
                                        case 0x7d:disnum=7;
                                                        break;
                                        case 0xeb:disnum=8;
                                                        break;
                                        case 0xdb:disnum=9;
                                                        break;
                                        case 0xbb:disnum=10;
                                                        break;
                                        case 0x7b:disnum=11;
                                                        break;
                                        case 0xe7:disnum=12;
                                                        break;
                                        case 0xd7:disnum=13;
                                                        break;
                                        case 0xb7:disnum=14;
                                                        break;
                                        case 0x77:disnum=15;
                                                        break;
                                }
                        }
                }
        return disnum;
}
delay(uchar x)
{
        uchar a,b;
        for(a=x;a>0;a--)
                for(b=200;b>0;b--);
}

uchar keyscan()
{
        P3=0xf0;                                                        //先给P3赋一个初值
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)                                        //如果有键按下temp!=0xf0成立
        {
                delay(10);                                        //延时消抖
                if(temp!=0xf0)                                //再次判断有键按下temp!=0xf0成立
                {
                        temp=P3;                                        //读取P3的值保存在temp
                        temp=temp|0X0f;      //temp保留高4位的值,低4位全置1  //这行代码表示什么意思?
                        P3=temp;                                        //再把temp的值赋给P3,高4位不会变化,低4位会变化
                        key=P3;                             //此时读取P3的值就是高4位+低4位值,此值赋给key
                        switch(key)
                        {

我这样理解对不


你理解的不准确
uchar keyscan()
{
        P3=0xf0;                                //先给P3赋一个初值  1111 0000
        temp=P3;                                //此句无实际意义,可以舍弃
        temp=temp&0xf0;                        //此句无实际意义,可以舍弃
        if(temp!=0xf0)          //如果有键按下temp!=0xf0成立  XXXX 0000(高4位4个X中有1个为0其余为1)
        {
                delay(10);          //延时消抖
                if(temp!=0xf0)      //再次判断有键按下temp!=0xf0成立  XXXX 0000
                {
                temp=P3;            //读取P3的值保存在temp  XXXX 0000
                temp=temp|0X0f;     //temp保留高4位的值,低4位全置1  XXXX 1111
                P3=temp;            //再把temp的值赋给P3,高4位不会变化,低4位会变化 XXXX XXXX(低4位4个X中有1个为0其余为1)
                key=P3;             //此时读取P3的值就是高4位+低4位值,此值赋给key
                switch(key)
                {

还是不太懂

个人认为应该要加几行语句,如下
uchar keyscan()
{
                P3=0xf0;
                temp=P3;                  
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                        delay(10);
                temp=P3;              //增加      
                temp=temp&0xf0;   //增加
                        if(temp!=0xf0)
                        {
                                temp=P3;

给你一个比较好懂的写法
uchar keyscan()
{
        uchar temp1,temp2,temp3;//临时变量
        P3=0xf0;                                //先给P3赋一个初值,1111 0000
        if(temp!=0xf0)          //如果有键按下,假设1110 0000,执行花括号内语句,
        {
                delay(10);          //延时消抖
                if(temp!=0xf0)      //再次判断有键按下,1110 0000
                {
                        temp1=P3;                //读取P3实际值保存在temp1,1110 0000
                        P3=0x0f;                //再给P3赋值0x0f,0000 1111
                        temp2=P3;                //读取P3实际值保存在temp2,假设0000 1110
                        temp3=temp1|temp2;//temp3=1110 0000按位或0000 1110,结果是1110 1110
                        key=temp3;                //把temp3值赋与key,1110 1110
                        switch(key)
                        {
                                ......

你确定一楼贴出来的程序是能正确运行的吗


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

网站地图

Top