89c51单片机的P3口接一个共阳极的数码管,P1口接4*4的键盘,每个键的键值依次是0~F,要求任意按下一个键,

作者&投稿:司马蚂 (若有异议请与网页底部的电邮联系)
AT89C51单片机 4*4矩阵键盘控制一个数码管显示~

你好!要显示出矩阵键盘的键值 0-F 吗?
程序是c语言写吗?

ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
MOV DPTR,#LEDTAB

MOV A,P3

CJNE A,#16,MAIN1

MAIN1:
JNC MAIN

MOVC A,@A+DPTR

MOV P1,A

SJMP MAIN

LEDTAB:
DB 0C0H;"0"00H
DB 0F9H;"1"01H
DB 0A4H;"2"02H
DB 0B0H;"3"03H
DB 99H;"4"04H
DB 92H;"5"05H
DB 82H;"6"06H
DB 0F8H;"7"07H
DB 80H;"8"08H
DB 90H;"9"09H
END

#include<reg51.h>
#define p0 P0
#define p2 P2
sbit p23=P2^3;
sbit p22=P2^2;
sbit p21=P2^1;
sbit p20=P2^0;
int i,j;
int tab[4][4]={ {0xc0,0xf9,0xa4,0xb0},
{0x99,0x92,0x82,0xf8},
{0x80,0x90,0x88,0x83},
{0xc6,0xa1,0x86,0x8e}}; //0到F的16个键植
scankey()
{ if(p23==0)
{p0=0xff;
p2=0xf0;
switch(P2)
{case 0xe0:p0=tab[0][0];break;
case 0xd0:p0=tab[1][0];break;
case 0xb0:p0=tab[2][0];break;
case 0x70:P0=tab[3][0];break;
}
}

if(p22==0)
{p2=0xf0;
p0=0xff;
switch(P2)
{case 0xe0:p0=tab[0][1];break;
case 0xd0:p0=tab[1][1];break;
case 0xb0:p0=tab[2][1];break;
case 0x70:P0=tab[3][1];break;
}
}

if(p21==0)
{p2=0xf0;
p0=0xff;
switch(P2)
{case 0xe0:p0=tab[0][2];break;
case 0xd0:p0=tab[1][2];break;
case 0xb0:p0=tab[2][2];break;
case 0x70:P0=tab[3][2];break;
}
}

if(p20==0)
{p2=0xf0;
p0=0xff;
switch(P2)
{case 0xe0:p0=tab[0][3];break;
case 0xd0:p0=tab[1][3];break;
case 0xb0:p0=tab[2][3];break;
case 0x70:P0=tab[3][3];
}
}
return p0;
}

delay(int m)
{for(i=100;i>0;i--);
}
main()

{p0=0xff;
p2=0xff;
/*if(p2!=0x0f)
delay(50);*/
while(1)
{
p2=0x0f;
if(P2!=0x0f)
delay(10);
if(P2!=0x0f)
p0=scankey();
}

}

可见:
http://zhidao.baidu.com/question/233572395.html

89c51单片机的P3口接一个共阳极的数码管,P1口接4*4的键盘,每个键的键值...
答:include<reg52.h> define uint unsigned int define uchar unsigned char //sbit w=P3^4;uchar code dula[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//数码管段选 uchar temp,num,key;char display();void dula(uchar aa);void...

89C51单片机的P0~P3端口进行输入时为什么要设置为1?
答:端口锁存器中原来状态有可能为0,加到输入驱动场效应管栅极的信号为1,该场效应管就导通,对地呈现低阻抗,这是即使引脚上输入的是1的信号,也会因端口的低阻抗而使信号变低,使得外加的1信号读入后不一定是1,若先执行置1操作,则可以驱动场效应管截止,引脚信号直接加到三态缓冲器,实现正确的读...

89c51单片机 (线与) 问题
答:令51的P1 P2 P3,输出1时,即设置为输入状态。此后,外部芯片,送来的低电平,即可输入到51的P1 P2 P3。

89C51单片机的P0~P3端口进行输入时为什么要设置为1?
答:89C51单片机的P0~P3口不是标准意义的双向口 ,他只是准双向口 你可以对照着P0口的结构图看这段话,向端口写1,就是向锁存器写1,也就是让其口输出FF,为什么,是这样的,给锁存器写1,那么锁存器 的反向端就输出0,那么和它相接的MOS管也就在截止状态,也就是呈高 阻态,这样P0口上数据就...

89c51p3口的第二功能是什么?
答:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。管脚第二功能对照 P3.0 RXD(串行输入口)P3.1 TXD(串行输出口)P3.2 /INT0(...

单片机89c51中p0到p3口的作用是什么?
答:单片机89c51中,p0到p3口都是I/O口。他们的具体作用如下:1、P0口用作地址(地址总线低8位)/数据(8位数据总线)复用口时,是一个真正的双向口;用作通用IO口时,是一个准双向口,开漏输出,需要外置上拉电阻。2、P1口作I/O口时与P2,P3一样不要外接上拉电阻,但是作输入使用时应注意先向其写"...

89C51的管脚说明
答:P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。P3口也可作为AT89C51的一些特殊功能口,...

单片机89c51,总共8个开关,倒着控制8个灯, 求图和程序
答:switch (case P1_0==0:P2_7=1;break;case P1_1==0:P2_6=1;break;case P1_2==0:P2_5=1;break;case P1_3==0:P2_4=1;break;case P1_4==0:P2_3=1;break;case P1_5==0:P2_2=1;break;case P1_6==0:P2_1=1;break;case P1_7==0:P2_0=1;break;)P1口接SW,SW另...

89c51单片机有几组I/O口,请简单介绍其主要功能
答:4组,P0可以作普通IO口,也可以在读写外部存储器作低8位的地址总线和8位的数据总线;P1口只作为一般IO口;P2作为一般IO口还在在读写外部存储器作高8位的地址总线;P3口除作为一般IO口还为第二输入/输出功能(P3.0 串行数据接入端;P3.1 串行数据发送端;P3.2 外中断0输入端 ;P3.3 外中断1输入...

用C语言编写,单片机89C51控制,四个按键控制灯亮,用一个P3口控制8个LED...
答:/*图片上的P3.3口不接,LED 正端接个470欧电阻到5V电源,LED负端接P3口*/ include"c51.h"include"stdio.h"define Key0 P1^0 define Key1 P1^2 define Key2 P1^3 define Key3 P1^4 define LED0 P3^0 define LED0 P3^1 define LED0 P3^2 define LED0 P3^...