标题:/* 关于2个程序的合并,请教.c*/
只看楼主
csz9981
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2013-5-16
结帖率:0
 问题点数:0 回复次数:0 
/* 关于2个程序的合并,请教.c*/
/* 关于2个程序的合并,请教.c*/

dig.c
/**************************************************************************
* 实验名         : 静态数码管实验
* 使用的IO         : 数码管使用P0,键盘使用P3.0、P3.1、P3.2、P3.3
* 实验效果       : 按下K1键,显示1,按下K2键,显示2,按下K3键,显示3,按下K4键,显示4。 */

 #include<reg51.h>
#include<intrins.h>

sbit LS0=P2^2;  /*片选信号*/
sbit LS1=P2^3;
sbit LS2=P2^4;

sbit K2=P3^0;    /*4个按键*/
sbit K1=P3^1;
sbit K3=P3^2;
sbit K4=P3^3;

CODE[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};/*0-9的数码对应段值*/

void delay10ms() /*延时函数*/
{unsigned char a,b;
for(a=38;a>0;a--)
for(b=130;b>0;b--);
}

void main()
{
int i;
LS0=0;  /*片选信号*/
LS1=1;
LS2=0;
while(1)
  {
  if(K1==0)
    {
     delay10ms();
     if(K1==0)
       {
        P0=CODE[1];
       }   
     while((i<50)&&(K1==0))
       {
       delay10ms();
       i++;
       }
     i=0;
    }

  if(K2==0)
    {
     delay10ms();
     if(K2==0)
       {
        P0=CODE[2];
       }   
     while((i<50)&&(K2==0))
       {
       delay10ms();
       i++;
       }
     i=0;
    }
  if(K3==0)
    {
     delay10ms();
     if(K3==0)
       {
        P0=CODE[3];
       }   
     while((i<50)&&(K3==0))
       {
       delay10ms();
       i++;
       }
     i=0;
    }

  if(K4==0)
    {
     delay10ms();
     if(K4==0)
       {
        P0=CODE[4];
       }   
     while((i<50)&&(K4==0))
       {
       delay10ms();
       i++;
       }
     i=0;
    }
  }
}


key4-4.c
/******************************************************************************
* 实验名         : 4*4矩阵键盘实验
* 使用的IO         : 数码管使用P0,键盘使用P3.0、P3.1、P3.2、P3.3
* 实验效果       : 按矩阵键盘分别显示在数码管上面显示十六进制的0到F。*/
#include<reg51.h>
#include<intrins.h>   

#define DIG=P0;
#define KEY=P1;
sbit LS0=P2^2;  /*片选信号*/
sbit LS1=P2^3;
sbit LS2=P2^4;
char CODE[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};/*0-F的数码对应段值*/
char k;

void delay10ms() /*延时函数*/
{unsigned char a,b;
for(a=38;a>0;a--);
//for(b=130;b>0;b--);
}

void keydown()
{
char a;
P1=0x0f;
if(P1!=0x0f)
{
 delay10ms();
 if(P1!=0x0f)
 {
  P1=0x0f;
  switch(P1)
  {
  case(0x07):k=0;break;
  case(0x0b):k=1;break;
  case(0x0d):k=2;break;
  case(0x0e):k=3;break;
  default:k=17;
  }
  P1=0xf0;
  switch(P1)
  {
  case(0x70):k=k;break;
  case(0xb0):k=k+4;break;
  case(0xd0):k=k+8;break;
  case(0xe0):k=k+12;break;
  default:k=17;
  }
  while((a<50)&&(P1!=0xf0))
  {
    delay10ms();
    a++;
  }
  a=0;
 }
}
}

void main()
{
LS0=0;  /*片选信号*/
LS1=1;
LS2=0;
while(1)
  {
  keydown();
  P0=CODE[k];
  }
}
  
/*想把2个程序合并到一个程度中,能够控制4+16个按键,我试了下面的程序,没有成功,请指教错在哪里了? */

#include<reg51.h>
#include<intrins.h>   

sbit LS0=P2^2;  /*片选信号*/
sbit LS1=P2^3;
sbit LS2=P2^4;

sbit K2=P3^0;    /*4个按键*/
sbit K1=P3^1;
sbit K3=P3^2;
sbit K4=P3^3;
char CODE[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};/*0-F的数码对应段值*/
char k;

void delay10ms() /*延时函数*/
{unsigned char a;
for(a=38;a>0;a--);
//for(b=130;b>0;b--);
}

void keydown()
{
char a;
P1=0x0f;
if(P1!=0x0f)
{
 delay10ms();
 if(P1!=0x0f)
 {
  P1=0x0f;
  switch(P1)
  {
  case(0x07):k=0;break;
  case(0x0b):k=1;break;
  case(0x0d):k=2;break;
  case(0x0e):k=3;break;
  default:k=17;
  }
  P1=0xf0;
  switch(P1)
  {
  case(0x70):k=k;break;
  case(0xb0):k=k+4;break;
  case(0xd0):k=k+8;break;
  case(0xe0):k=k+12;break;
  default:k=17;
  }
  while((a<50)&&(P1!=0xf0))
  {
    delay10ms();
    a++;
  }
  a=0;
 }
}
}

void key16()
{
LS0=0;  /*片选信号*/
LS1=0;
LS2=0;
while(P1==0xff)
  {
  keydown();
  P0=CODE[k];
  }
}

void key4()
{
int i;
LS0=1;  /*片选信号*/
LS1=1;
LS2=1;
while((K1==0)||(K2==0)||(K3==0)||(K4==0))
  {
  if(K1==0)
    {
     delay10ms();
     if(K1==0)
       {
        P0=CODE[1];
       }   
     while((i<50)&&(K1==0))
       {
       delay10ms();
       i++;
       }
     i=0;
    }

  if(K2==0)
    {
     delay10ms();
     if(K2==0)
       {
        P0=CODE[2];
       }   
     while((i<50)&&(K2==0))
       {
       delay10ms();
       i++;
       }
     i=0;
    }
  if(K3==0)
    {
     delay10ms();
     if(K3==0)
       {
        P0=CODE[3];
       }   
     while((i<50)&&(K3==0))
       {
       delay10ms();
       i++;
       }
     i=0;
    }

  if(K4==0)
    {
     delay10ms();
     if(K4==0)
       {
        P0=CODE[4];
       }   
     while((i<50)&&(K4==0))
       {
       delay10ms();
       i++;
       }
     i=0;
    }
  }
}


void main()
{
key4();
key16();
}

/* 我想把key4-4.c那个程序,用switch语句实现,下面这个程序,key4-4.1.c 只能实现最后一个switch功能,请教,
key4-4.1.c应当怎样修改才能实现 key4-4.c 同样的功能?*/  

key4-4.1.c

#include<reg51.h>
#include<intrins.h>   

#define DIG=P0;
#define KEY=P1;
sbit LS0=P2^2;  /*片选信号*/
sbit LS1=P2^3;
sbit LS2=P2^4;
char CODE[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};/*0-F的数码对应段值*/
char k;

void delay10ms() /*延时函数*/
{unsigned char a,b;
for(a=38;a>0;a--);
//for(b=130;b>0;b--);
}

void keydown()
{
char a;
  P1=0x7f;
  switch(P1)
  {
  case(0x77):k=0;break;
  case(0x7b):k=1;break;
  case(0x7d):k=2;break;
  case(0x7e):k=3;break;
  default:k=17;
  }
  P1=0bf0;
  switch(P1)
  {
  case(0xb7):k=4;break;
  case(0xbb):k=5;break;
  case(0xbd):k=6;break;
  case(0xbe):k=7;break;
  default:k=17;
  }
P1=0df0;
  switch(P1)
  {
  case(0xd7):k=8;break;
  case(0xdb):k=9;break;
  case(0xdd):k=10;break;
  case(0xde):k=11;break;
  default:k=17;
  }

P1=0ef0;
  switch(P1)
  {
  case(0xe7):k=12;break;
  case(0xeb):k=13;break;
  case(0xed):k=14;break;
  case(0xee):k=15;break;
  default:k=17;
  }
  while((a<50)&&(P1!=0xf0))
  {
    delay10ms();
    a++;
  }
  a=0;
 }
}
}

void main()
{
LS0=0;  /*片选信号*/
LS1=1;
LS2=0;
while(1)
  {
  keydown();
  P0=CODE[k];
  }
}


搜索更多相关主题的帖子: include 数码管 键盘 
2016-12-21 22:04



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-472739-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.037827 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved