/* 关于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];
}
}