找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2839|回复: 3
打印 上一主题 下一主题
收起左侧

实验例程--独立按键如何增加更多的控制IO口

[复制链接]
跳转到指定楼层
楼主
ID:353 发表于 2017-8-13 15:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
20黑币
本帖最后由 yaofang1010 于 2017-8-14 10:39 编辑

想在实验程序--独立按键4路的基础上增加至14路控制,修改后还是达不要求,求解应当如何修改?谢谢!

原程序如下:
#include<reg51.h>
#include<intrins.h>        

#define GPIO_LED P2                  //宏定义P2口
sbit K1=P1^4;                          //位操作
sbit K2=P1^5;
sbit K3=P1^6;
sbit K4=P1^7;
sbit K5=P3^5;
void Delay10ms( );   //延时10ms

/*******************************************************************************
* 函 数 名         : main
* 函数功能                   : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void main(void)
{

        
        while(1)
        {                 
                if(K1==0)                //检测按键K1是否按下
                {
                        Delay10ms();        //消除抖动
                        if(K1==0)
                        {
                                GPIO_LED = 0xfe;        //1111 1110 第一个灯亮
                        }
                }
               
                if(K2==0)                //检测按键K1是否按下
                {
                        Delay10ms();        //消除抖动
                        if(K2==0)
                        {
                                GPIO_LED = 0xfd;        //1111 1101 第二个灯亮
                        }
                }
               
                if(K3==0)                //检测按键K1是否按下
                {
                        Delay10ms();        //消除抖动
                        if(K3==0)
                        {
                                GPIO_LED = 0xfb;        
                        }
                }
               
                if(K4==0)                //检测按键K1是否按下
                {
                        Delay10ms();        //消除抖动
                        if(K4==0)
                        {
                                GPIO_LED = 0xf7;        
                        }
                }
               
                if(K5==0)                //检测按键K1是否按下
                {
                        Delay10ms();        //消除抖动
                        if(K5==0)
                        {
                                GPIO_LED = 0xef;        
                        }
                }               

        }                                
}
/*******************************************************************************
* 函 数 名         : Delay10ms
* 函数功能                   : 延时函数,延时10ms
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Delay10ms(void)   //误差 0us
{
    unsigned char a,b,c;
    for(c=1;c>0;c--)
        for(b=38;b>0;b--)
            for(a=130;a>0;a--);
}


修改后的:
#include<reg51.h>
#include<intrins.h>        

#define GPIO_LED P0                  //宏定义P2口
#define GPIO_LED P2                  //定义P0口
sbit K1=P1^0;                          //位操作
sbit K2=P1^1;
sbit K3=P1^2;
sbit K4=P1^3;
sbit K5=P1^4;
sbit K6=P1^5;
sbit K7=P1^6;
sbit K8=P1^7;
sbit K9=P3^2;
sbit K10=P3^3;
sbit K11=P3^4;
sbit K12=P3^5;
sbit K13=P3^6;
sbit K14=P3^7;
void Delay10ms( );   //延时10ms

/*******************************************************************************
* 函 数 名         : main
* 函数功能                   : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void main(void)
{

        
        while(1)
        {                 
                if(K1==0)                //检测按键K1是否按下
                {
                        Delay10ms();        //消除抖动
                        if(K1==0)
                        {
                                GPIO_LED = 0x3ffe;        // 11111111111110第一个灯亮
                        }
                }
               
                if(K2==0)                //检测按键K2是否按下
                {
                        Delay10ms();        //消除抖动
                        if(K2==0)
                        {
                                GPIO_LED = 0x3ffd;        //11111111111101 第二个灯亮
                        }
                }
               
                if(K3==0)                //检测按键K3是否按下
                {
                        Delay10ms();        //消除抖动
                        if(K3==0)
                        {
                                GPIO_LED = 0x3ffb;        //11111111111011 第三个灯亮
                        }
                }
               
                if(K4==0)                //检测按键K4是否按下
                {
                        Delay10ms();        //消除抖动
                        if(K4==0)
                        {
                                GPIO_LED = 0x3ff7;        //11111111110111 第四个灯亮
                        }
                }

                if(K5==0)                //检测按键K5是否按下
                {
                        Delay10ms();        //消除抖动
                        if(K5==0)
                        {
                                GPIO_LED = 0x3fef;        //11111111101111 第5个灯亮
                        }
                }

                if(K6==0)                //检测按键K6是否按下
                {
                        Delay10ms();        //消除抖动
                        if(K6==0)
                        {
                                GPIO_LED = 0x3fdf;        //11111111011111 第6个灯亮
                        }
                }

                if(K7==0)                //检测按键K7是否按下
                {
                        Delay10ms();        //消除抖动
                        if(K7==0)
                        {
                                GPIO_LED = 0x3fbf;        //11111110111111第7个灯亮
                        }
                }

                   if(K8==0)                //检测按键K8是否按下
                {
                        Delay10ms();        //消除抖动
                        if(K8==0)
                        {
                                GPIO_LED = 0x3f7f;        //11111101111111第8个灯亮
                        }
                }

                   if(K9==0)                //检测按键K9是否按下
                {
                        Delay10ms();        //消除抖动
                        if(K9==0)
                        {
                                GPIO_LED = 0x3eff;        //11111011111111第9个灯亮
                        }
                }

                        if(K10==0)                //检测按键10是否按下
                {
                        Delay10ms();        //消除抖动
                        if(K10==0)
                        {
                                GPIO_LED = 0x3dff;        //11110111111111第10个灯亮
                        }
                }

                         if(K11==0)                //检测按键K11是否按下
                {
                        Delay10ms();        //消除抖动
                        if(K11==0)
                        {
                                GPIO_LED = 0x3bff;        //11101111111111第11个灯亮
                        }
                }

                        if(K12==0)                //检测按键K12是否按下
                {
                        Delay10ms();        //消除抖动
                        if(K12==0)
                        {
                                GPIO_LED = 0x37ff;        //11011111111111第12个灯亮
                        }
                }
                          
                           if(K13==0)                //检测按键K13是否按下
                {
                        Delay10ms();        //消除抖动
                        if(K13==0)
                        {
                                GPIO_LED = 0x2fff;        //10111111111111第13个灯亮
                        }
                }
                        
                if(K14==0)                //检测按键K14是否按下
                {
                        Delay10ms();        //消除抖动
                        if(K14==0)
                        {
                                GPIO_LED = 0x1fff;                //10111111111111第14个灯亮
                        }
                }               

        }                                
}
/*******************************************************************************
* 函 数 名         : Delay10ms
* 函数功能                   : 延时函数,延时10ms
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Delay10ms(void)   //误差 0us
{
    unsigned char a,b,c;
    for(c=1;c>0;c--)
        for(b=38;b>0;b--)
            for(a=130;a>0;a--);
}



使用距阵键盘后如下,已达到要求。如何在程序增加一路LED闪烁程序在里面呢?
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[4]={0xFE,0xFD,0xFB,0xF7};
uchar scan()
{
uchar Temp=0;
uchar num=0,i=0;
for(i=0;i<4;i++)
{
P1=table;
Temp=P1& 0xF0;
if(Temp!=0xF0)
{
switch(Temp)
{Temp=P1;
case 0xE0: num=0;break;
case 0xD0: num=1;break;
case 0xB0: num=2;break;
case 0x70: num=3;break;
default: num=50;break;
}
break;
}
}
return num+4*i+1;
}
void display(uchar num1)
{switch(num1)
{
case 1:P2=0xfe;P3=0xff;break;   //1
case 2:P2=0xfd;P3=0xff;break;   //2
case 3:P2=0xfb;P3=0xff;break;  // 3
case 4:P2=0xf7;P3=0xff;break;  // 4
case 5:P2=0xef;P3=0xff;break;  // 5
case 6:P2=0xdf;P3=0xff;break;  // 6
case 7:P2=0xbf;P3=0xff;break;  // 7
case 8:P2=0x7f;P3=0xff;break;  // 8  
case 9:P2=0xff;P3=0xfe;break;  // 9
case 10:P2=0xff;P3=0xfd;break;  // 10
case 11:P2=0xff;P3=0xfb;break;  // 11
case 12:P2=0xff;P3=0xf7;break;  // 12
case 13:P2=0xff;P3=0xef;break;  // 13
case 14:P2=0xff;P3=0xdf;break;  // 14
case 15:P2=0xff;P3=0xbf;break;  // 15
case 16:P2=0xff,P3=0x7f;break;  // 16
default:break;  
};   
}
void main()
{char num1;  
while(1)   
{  
num1=scan();
display(num1);  
  }
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:218476 发表于 2017-8-13 23:40 | 只看该作者
矩阵键盘不好吗?
回复

使用道具 举报

板凳
ID:227474 发表于 2017-8-14 00:28 来自手机 | 只看该作者
用74hc138
回复

使用道具 举报

地板
ID:353 发表于 2017-8-14 10:35 | 只看该作者

已使用距阵键盘解决问题,谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表