用单片机的并行口接4×4矩阵键盘,以P1.0-P1.3作输入线,以P1.4-P1.7作输出线;谁有完整的包括仿真

谢谢QQ840290582

第1个回答  2012-06-30
这个没有,不过这种程序网上很好找啊,还有不同的单片机接口不一样,你随便找个改改就好了,很简单的,你只要看懂原理了就很容易的,不要所有东西都希望别人给你整完整啊,这样学不到东西的,给你找了一个大概的,你看看
#include<reg52.h>
#define uint unsignedint
#define uchar unsignedchar
uchar code table[]={
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0xff};//数码管段选
sbit shu1=P3^0;//数码管位选
sbit shu2=P3^1;//数码管位选
uchar num;
void delay(uint z)//延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
uchar keyscan();//键盘扫描函数
void main()
{
num=17;
while(1)
{
keyscan(); //键盘扫描
if(num==17)//如果没有键按下
{
P2=table[10]; //数码管什么也不显示
}
else//有键按下
{
shu1=1;//打开数码管
P2=table[(num-1)/10]; // 显示十位
delay(7);//延时显示
shu1=0;//关闭数码管

shu2=1; //打开数码管
P2=table[(num-1)%10]; // 显示个位
delay(7);//延时显示
shu2=0; //关闭数码管
}
}
}
uchar keyscan()//键盘扫描
{
P1=0xfe;
while(P1!=0xfe) //第一行有键按下
{
delay(5);//延时消抖
while(P1!=0xfe)//确实有键按下
{
switch(P1)//检测是哪个键按下
{
case 0xee:num=1;
break;
case 0xde:num=2;
break;
case 0xbe:num=3;
break;
case 0x7e:num=4;
break;
}
while(P1!=0xfe);//松手检测
}
}

P1=0xfd;
while(P1!=0xfd)//第二行有键按下
{
delay(5);//延时消抖
while(P1!=0xfd)//确实有键按下
{
switch(P1)//检测是哪个键按下
{
case 0xed:num=5;
break;
case 0xdd:num=6;
break;
case 0xbd:num=7;
break;
case 0x7d:num=8;
break;
}
while(P1!=0xfd) ;//松手检测
}
}

P1=0xfb;
while(P1!=0xfb)//第三行有键按下
{
delay(5);//延时消抖
while(P1!=0xfb)//确实有键按下
{
switch(P1)//检测是哪个键按下
{
case 0xeb:num=9;
break;
case 0xdb:num=10;
break;
case 0xbb:num=11;
break;
case 0x7b:num=12;
break;
}
while(P1!=0xfb);//松手检测
}
}

P1=0xf7;
while(P1!=0xf7)//第四行有键按下
{
delay(5);//延时消抖
while(P1!=0xf7)//确实有键按下
{
switch(P1)//检测是哪个键按下
{
case 0xe7:num=13;
break;
case 0xd7:num=14;
break;
case 0xb7:num=15;
break;
case 0x77:num=16;
break;
}
while(P1!=0xf7);//松手检测
}
}
return num;

}
第2个回答  2012-07-08

#include<reg51.h>

#include<intrins.h>

#include<absacc.h>

#define uchar unsigned char

#define uint unsigned int

#define led P0

sbit  c1=P2^0;

sbit c2=P2^1;

uchar j,b;

uchar num;

uchar code a[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

///////////////////////////////////////////delay 

void delay(unsigned int c)

{

while (c!=0)

  {

    unsigned int i;

 for(i=0;i<100;i++);

 c--;

  }

}

////////////////////////////////////////////

uchar checkkey()

{

uchar i,j;

j=0x0f;

P3=j;

i=P3;

if(i==j) return(0);

else return (1);

}

//////////////////////////////////////

uchar scan()

{

uchar scancode,codevalue;

uchar i,j;

uchar m=0;

uchar k,x;

if(checkkey()==1) 

{

     delay(100);

     if(checkkey()==1)//key_presss

    {

     scancode=0xfe;

  m=0x00;

    for(i=1;i<=4;i++)//line_scan

     {

         k=0x10;

         P3=scancode;

         x=P3;

           for(j=1;j<=4;j++)//row_scan

           {

             if((x&k)==0)

              {

                codevalue=m+j;

                while(checkkey()!=0);

                return (codevalue);

               }

      else k=k<<1;

    }

   m=m+4;

   scancode=~scancode;

   scancode=scancode<<1;

   scancode=~scancode;

   }

}

}

}

//////////////////////////////////////////////////////////

void display(uchar num)

{

 if(num<10)

 { 

   c1=0;

   c2=1;

 

   led=a[num];

   delay(800);

 }

 else

 {

 for(j=0;j<10;j++)

   {

   c2=0;

   c1=1;

   led=a[num/10];

   delay(400);

   c1=0;

   c2=1;

   led=a[num%10];

   delay(40);

   c2=0;

   c1=0;

   

}

 }

 }

///////////////////////////////////////////////////////

void main()

 {

uchar d;

 while(1)

 {

 if(checkkey()==1)

      {

   

      d=scan();

   delay(100);

  display(d);

   }

 

}

}

 

 

PIC16F877A的4*4矩阵式按键程序该怎么写
如图4.14.2所示,用AT89S51的并行口P1接4×4矩阵键盘,以P1.0-P1.3作输入线,以P1.4-P1.7作输出线;在数码管上显示每个按键的“0-F”序号。对应的按键的序号排列如图4.14.1所示图4.14.1硬件电路原理图图4.14.2系统板上硬件连线把“单片机系统“区域中的P3.0-P3.7端口用8芯排线连接到“4X4行列式键盘”区域中的C1...

使用单片机的P1口扩展4*4键盘矩阵,实现在键盘上每按一个数字键用静态...
P1.0~P1.3为列线,P1.4~P1.7为行线;列线和行线的交叉点接按键。先在列线上依次输出1,然后再在行线上读取;可根据行线的输入和列线的输出来判定是哪个按键按下。具体的显示部分,应该很简单吧。

写一程序,要求按什么键就在数码管上显示其键值
;实验任务:用AT89S51的并行口P1接4×4矩阵键盘,以P1.0-P1.3作列输入线,以P1.4-P1.7作行输出线.; 在数码管上显示每个按键的"0-F"序号,使用使共阳码管显示对应的键值.;;;程序初始化 ;LEDOUT EQU P2 KEYMATRIX EQU P1 SCANCODE EQU R2 KEYCODE EQU R3 COUNT...

写一个2*4的矩阵式按键的检测程序,方便移植
图4.14.2所示用AT89S51并行口P1接4×4矩阵键盘P1.0-P1.3作输入线P1.4-P1.7作输线;数码管显示每按键0-F序号应按键序号排列图4.14.1所示 图4.14.1 硬件电路原理图 图4.14.2 系统板硬件连线 单片机系统区域P3.0-P3.7端口用8芯排线连接4X4行列式键盘区域C1-C4 R1-R4端口;单片...

单片机4*4行列式键盘程序! 动态显示,开始时,显示“——”,按键后显示相...
\/*行线接P1.0-P1.3,列线接P1.4-P1.7。根据扫描键盘返回的键值编码查键值编码表,从而得到键值并送数码管显示。开机时,数码管显示“-”。当键按下时,数码管显示按下键的键值,蜂鸣器响一声。*\/ include <reg52.h> include <intrins.h> define uchar unsigned char define uint ...

proteus仿真4x4矩阵键盘中断方式扫描数码管显示
1. **硬件连接**:将4x4矩阵键盘的行线连接到单片机的某个I\/O口(如P1.0~P1.3),列线连接到另一个I\/O口(如P1.4~P1.7)。数码管的段选线连接到单片机的另一个I\/O口(如P0),用于显示按键对应的字符。2. **中断设置**:配置单片机的中断系统,将键盘的列线或行线配置为外部中断...

利用AT89S51单片机的P1.0-P1.3接四个发光二极管L1-L4,用来指示当前计数...
这个工作量,需要几天的时间完成。谁有时间白给你做这些事,就是闲得闹心也不会做的。

怎样知道单片机的矩阵键盘每个按键的地址?
1、比如是一个4行×4列的矩阵键盘。2、将4行和4列共8根线分别接到单片机的I\/O口,比如接P1口,行接低4位(P1.0~P1.3),列接高4位(P1.4~P1.7)。3、单片机先将行置第电平0,列置高电平1.4、在键盘扫描程序中,判断是否有任意按键按下:if((P1&0xf0)!=0xf0),表示有按键...

AT89S51单片机的P1.0~P1.3 接四个发光二极管, P1.4~P1.7 接四个开关...
ABC:MOV A,P1 \/\/把P1送入A SWAP A \/\/A高四位和低四位互换,反映到发光二极管上开关闭合对应的灯亮开关断开 ANL A,#0FH \/\/保留低四位 MOV P1,A \/\/输出 ORL P1,#0F0H \/\/把P1高四位置1,等待下一次按键按下 SJMP ABC \/\/调回ABC,循环 给分吧~~

AT89S51单片机的P1.0~P1.3 接四个发光二极管, P1.4~P1.7 接四个开关...
ORG 0000H LJMP MAIN ORG 0030H MAIN:MOV A,P1 ANL A,#0F0H SWAP A MOV P1,A SJMP MAIN END

相似回答