标题: 51单片机矩阵键盘16个键值控制数码管的输出0000到1111 [打印本页]
作者: YaoXinnnn 时间: 2018-11-2 17:09
标题: 51单片机矩阵键盘16个键值控制数码管的输出0000到1111
如何用矩阵键盘的16个键值对应四段数码管显示0000到1111?我写的一个子函数 dectobin(int n)是先十进制转化成二进制,再放到数组里,数组里对应键值得2进制数,然后再数码管上显示出来,我仿真不出来 求解
#include <reg51.h>
#define GPIO_DIG P0
#define GPIO_KEY P1
#define GPIO_PLACE P2
unsigned char code DIG_CODE[2]={0xc0,0xf9};//0xc0 0cf9
unsigned char code DIG_PLACE[4]={0xfe,0xfd,0xfb,0xf7};//fe fd fb f7
unsigned char KeyState;//×′ì¬
unsigned char DigplayDate[4];//????????4????
unsigned char SHUZU[4];
unsigned char KeyValue;//????????????
void Delay10ms(unsigned int c);
void KeyDown();
void dectobin(int n);//?????????
void DigDisplay();//??????
void main(void)
{
KeyState=0;
while(1)
{
KeyDown();
if(KeyState==1)
{
dectobin(KeyValue);
/*DigplayDate[3]=SHUZU[0];
DigplayDate[2]=SHUZU[1];
DigplayDate[1]=SHUZU[2];
DigplayDate[0]=SHUZU[3];
*///KeyState=0;
}
DigDisplay();
}
KeyState=0;
}
void DigDisplay()//???????
{
unsigned char i;
unsigned int j;
unsigned char DigplayDate[4];
for(i=0;i<4;i++)
{
if(SHUZU[i]==0)
DigplayDate[i] = DIG_CODE[0];
else
DigplayDate[i] = DIG_CODE[1];
GPIO_PLACE=DIG_PLACE[i]; //????
GPIO_DIG=DigplayDate[i];//????
Delay10ms(1);
j=10;
while(j--);
GPIO_DIG=0xff;//??
}
}
void KeyDown(void)
{
unsigned int a=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)
{
Delay10ms(1);
a++;
a=0;
if(GPIO_KEY!=0x0f)
{
KeyState=1;//óD°′¼ü°′ÏÂ
//2aêÔáD
GPIO_KEY=0X0F;
// Delay10ms(1);
switch(GPIO_KEY)
{
case(0X07): KeyValue=0;break;
case(0X0b): KeyValue=4;break;
case(0X0d): KeyValue=8;break;
case(0X0e): KeyValue=12;break;
// default: KeyValue=17; //¼ì2a3ö′í»Ø¸′17òa˼êǰÑêyÂë1üè«Ãeμô¡£
}
//2aêÔDD
GPIO_KEY=0XF0;
// Delay10ms(1);
switch(GPIO_KEY)
{
case(0X70): KeyValue=KeyValue+3;break;
case(0Xb0): KeyValue=KeyValue+2;break;
case(0Xd0): KeyValue=KeyValue+1;break;
case(0Xe0): KeyValue=KeyValue;break;
// default: KeyValue=17;
}
while((a<50)&&(GPIO_KEY!=0xf0)) //°′¼üËéêÖ¼ì2a
{
Delay10ms(1);
a++;
}
a=0;
}
}
}
void dectobin(int n)
{
int i,temp,j=0;
temp=n;
for(i=0;i<4;i++)
{
if(temp==0)
SHUZU[i]=0;
else
{
j=temp%2;
SHUZU[i]=j;
temp=temp/2;
}
}
}
void Delay10ms(unsigned int c) //?? 0us
{
unsigned char a, b;
//--c???????????????,???for???????????--//
for (;c>0;c--)
{
for (b=38;b>0;b--)
{
for (a=130;a>0;a--);
}
}
}
作者: zl2168 时间: 2018-11-2 21:26
本帖最后由 zl2168 于 2018-11-3 08:42 编辑
实例75 4×4矩阵式键盘
先Proteus仿真一下,确认有效。
实例
77 74HC595+165
扩展8×8键盘
以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil C和Proteus》清华大学出版社ISBN 978-7-302-41682-1.。书中电路和程序设计有详细说明,程序语句条条有注解。
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |