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

89c51单片机的P3口接一个共阳极的数码管,P1口接4*4的键盘,每个键的键值依次是0~F,要求任意按下一个键,则在数码管上显示该键的键值,编写一段完成上述任务的程序

第1个回答  2011-03-09
#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 delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main()
{
num=0;
P3=0;
while(1)
{
dula(display());显示程序

}
}
void dula(uchar aa)
{
P3=0;初始值
P3=dula[num];

}
char display()//键盘扫描程序
{
P0=0xfe;
temp=P0;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(10);
temp=P0;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P0;
switch(temp)
{
case 0xee:num=0; break;
case 0xde:num=1;break;
case 0xbe:num=2;break;
case 0x7e:num=3;break;
}
while(temp!=0xf0)
{
temp=P0;
temp=temp&0xf0;
}
}
}

P0=0xfd;
temp=P0;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(10);
temp=P0;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P0;
switch(temp)
{
case 0xed:num=4; break;
case 0xdd:num=5;break;
case 0xbd:num=6;break;
case 0x7d:num=7;break;
}
while(temp!=0xf0)
{
temp=P0;
temp=temp&0xf0;
}
}
}

P0=0xfb;
temp=P0;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(10);
temp=P0;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P0;
switch(temp)
{
case 0xeb:num=8; break;
case 0xdb:num=9;break;
case 0xbb:num=10;break;
case 0x7b:num=11;break;
}
while(temp!=0xf0)
{
temp=P0;
temp=temp&0xf0;
}
}
}

P0=0xf7;
temp=P0;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(10);
temp=P0;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P0;
switch(temp)
{
case 0xe7:num=12; break;
case 0xd7:num=13;break;
case 0xb7:num=14;break;
case 0x77:num=15;break;
}
while(temp!=0xf0)
{
temp=P0;
temp=temp&0xf0;
}
}
}
return num;
}
这是键盘扫描程序,你把键盘接到P0口即可!
第2个回答  2011-03-07
没有联系方式啊,那我直接发在这里了,望给分哈~~谢谢
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit BEEP = P3^7;

uchar code DSY_CODE[]=
{
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00
};

uchar Pre_KeyNO = 16,KeyNO = 16; // c d e f

void DelayMS(uint ms)
{
uchar t;
while(ms--)
{
for(t=0;t<120;t++);
}
}

void Keys_Scan()
{
uchar Tmp;
P1 = 0x0f;
DelayMS(1);
Tmp = P1 ^ 0x0f;
switch(Tmp)
{
case 1: KeyNO = 0; break;
case 2: KeyNO = 1; break;
case 4: KeyNO = 2; break;
case 8: KeyNO = 3; break;
default: KeyNO = 16;
}
P1 = 0xf0;
DelayMS(1);
Tmp = P1 >> 4 ^ 0x0f;
switch(Tmp)
{
case 1: KeyNO += 0; break;
case 2: KeyNO += 4; break;
case 4: KeyNO += 8; break;
case 8: KeyNO += 12;
}
}

void Beep()
{
uchar i;
for(i=0;i<100;i++)
{
DelayMS(1);
BEEP = ~BEEP;
}
BEEP = 1;
}

void main()
{
P0 = 0x00;
while(1)
{
P1 = 0xf0;
if(P1 != 0xf0)
Keys_Scan();
if(Pre_KeyNO != KeyNO)
{
P3 = DSY_CODE[KeyNO];
Beep();
Pre_KeyNO = KeyNO;
}
DelayMS(100);
}
}
第3个回答  2011-03-07
把你QQ显示出来!给你发过去追问

发到我邮箱里,谢谢。

第4个回答  2011-03-07
很简单。可以联系我来做,保证速度和质量追问

可以我怎么联系你

本回答被网友采纳

89C51单片机的p3口接一个共阳极的数码管
名称: Keyscan()功能: P1外接4×4按键, 按照扫描法读出键值 输出: 按键值0~15\/如无键按下, 返回16 \/ uchar Keyscan(void){ uchar i, j, temp, Buffer[4] = {0xef, 0xdf, 0xbf, 0x7f};for(j = 0; j < 4; j++) { \/\/循环四次 P1 = Buffer[j]; \/\/在P1高四位分别...

89c51单片机的数字钟程序?
【注意P3口输出模拟和在{实验板}上不一样。实验板不用取反】 【目的】:用20次T0定时产生1s.进而形成 HH-mm-ss时间 【参数说明】: 40H~47H :显示管,每位暂存器,存放要显示的数码的地址。可根据地址加1,实现该位数加1; 并且低4位可以代表管子要显示的值(42H、45H除外)。 48H :要显示的位值(0~7,由...

急求一个由89C51单片机的代码!要求用4*4矩阵键盘控制LED矩阵输出0~9的...
分别按下4×4键盘的按键,显示0~16键值 \/ include<reg51.h> sbit speaker=P3^7;\/\/\/键盘 sbit v1=P2^0;sbit v2=P2^1;sbit v3=P2^2;sbit v4=P2^3;sbit h1=P2^4;sbit h2=P2^5;sbit h3=P2^6;sbit h4=P2^7;\/\/\/显示 sbit shu1=P1^3;\/*第1位数码管共阴端*\/ sbit shu2=P1...

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

STC89C52单片机的P1口高4位连接发光二极管,P1口低4位连接开关,P3口的P...
不需要中断。只是动态扫描LED和键盘。

89C51单片机实验中遇到的一个问题
其实,毛病是在按键上。普通的按键,按一下,会产生多次的脉冲信号。你的程序把多个脉冲都检测出来了,程序是完全正常的。如果把按键改用“单脉冲电路”,就不会出现这些现象了。--- 如果按键不变,可在程序中加上延时,隔10ms再确认按键的状态,也能减少计数加1的现象。这就是软件消抖。如果使用...

求四位共阳数码管接法,接在单片机上。。。
不知道您使用的是什么单片机,告诉你使用89C51的接法。用200欧姆的电阻串联在数码管的笔画引脚上然后直接接在P0引脚就可以了,共阳极引脚直接接5V,对P0写0就可以点亮了,而且电流不至于烧毁数码管。动态显示 需要在共阳极上接PNP三极管,三极管基极串联1K电阻接单片机口,低电平有效。希望我的回答对您有...

用89C51单片机设计多功能低频函数信号发生器,能产生方波、正弦波、三角...
在AT89S51的P2口接5个按扭,通过软件编程来选择各种波形、幅值电压和频率,另有3个P2口管脚接TEC6122芯片,以驱动数码管显示电压幅值和频率,每种波形对应一个按钮。此方案的有点是电路原理比较简单,实现起来比较容易。缺点是,采样频率由单片机内部产生故使整个系统的频率降低。 1、波形发生器技术指标 1)波形:方波、...

89c51单片机的P1、P2口 功能是一样的吧?
一样,没区别

89C51的管脚说明
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为低八位地址接收。P2口:P2口为一个内部上拉电阻的8位双向I\/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻...

相似回答