//电路说明如下。
//单片机:使用51系列兼容的即可;
//4×4矩阵键盘:接在P1口;
//两位数码显示器: P0口输出七段码,P2口输出位选码。
//==============================================================
//C语言程序如下。
/*************************************************************
* 文件名: KEY_LED.c
* 功能 : 对4×4矩阵键盘进行输出,在数码管后两位显示按键值。
**************************************************************/
#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
//uchar code table[10] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09};
uchar code table[10] = {0xC0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};
/**************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***************************************************************/
void Delay_1ms(uint x)
{
uint i;
uchar j;
for(i = 0; i < x; i++) for(j = 0; j <= 148; j++);
}
/**************************************************************
* 名称: 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高四位分别输出一个低电平
temp = 0x01; //计划先判断P1.0位
for(i = 0; i < 4; i++) { //循环四次
if(!(P1 & temp)) //从P1低四位,截取1位
return (i + j * 4); //返回取得的按键值
temp <<= 1; //判断的位,左移一位
} }
return 16; //判断结束,没有键按下,返回16
} //呵呵,实质性的语句不过8行,就是这么简练!
/**************************************************************
* 名称: Display(uchar k)
* 功能: 将参数分成十位、个位分别显示
* 输入: k (键盘数值)
* 输出: P0口输出七段码,P2口输出位选码
***************************************************************/
void Display(uchar k)
{
P2 = 0; //消隐
P0 = table[k / 10];
P2 = 0x02; Delay_1ms(5); //显示5ms十位
P2 = 0; //消隐
P0 = table[k % 10];
P2 = 0x01; Delay_1ms(5); //显示5ms个位
}
/**************************************************************
* 名称 : Main()
* 功能 : 主函数
***************************************************************/
void Main(void)
{
uchar Key_Value = 16, Key_Temp1, Key_Temp2; //两次读出的键值
while(1) {
//---------以下读入按键、消掉、等待按键释放
P1 = 0xff;
Key_Temp1 = Keyscan(); //先读入按键
if(Key_Temp1 != 16) { //如果有键按下
//Delay_1ms(10); //延时一下
Display(Key_Value); //可用显示代替延时
Key_Temp2 = Keyscan(); //再读一次按键
if (Key_Temp1 == Key_Temp2)//必须是两次相等
Key_Value = Key_Temp1; //才保存下来,这就是消除抖动
while(Keyscan() <= 16); //等待按键释放
}
//---------以下是对按键的处理
Display(Key_Value); //显示键值
}
}
温馨提示:内容为网友见解,仅供参考
89C51单片机的p3口接一个共阳极的数码管
\/\/4×4矩阵键盘:接在P1口;\/\/两位数码显示器: P0口输出七段码,P2口输出位选码。\/\/=== \/\/C语言程序如下。\/ 文件名: KEY_LED.c 功能 : 对4×4矩阵键盘进行输出,在数码管后两位显示按键值。\/ include <reg51.h> include <intrins.h> define uint unsigned int define uchar unsigned ...
单片机89c51中p0到p3口的作用是什么?
单片机89c51中,p0到p3口都是I\/O口。他们的具体作用如下:1、P0口用作地址(地址总线低8位)\/数据(8位数据总线)复用口时,是一个真正的双向口;用作通用IO口时,是一个准双向口,开漏输出,需要外置上拉电阻。2、P1口作I\/O口时与P2,P3一样不要外接上拉电阻,但是作输入使用时应注意先向其写"...
89C51管脚说明
89C51管脚功能说明VCC: 供电电压,为微控制器提供电源。GND: 接地,用于电路的电气连接和信号参考点。P0口: 这是一个8位双向I\/O口,具有漏极开路特性,每脚能承受8TTL门电流。首次写入1时,被设置为高阻输入。P0口可用于外部程序数据存储器,作为数据地址的低八位。在Flash编程时,P0口作为原码输入...
我用89C51单片机控制数码管四位的共阳的。为什么要把对应的位选和段选...
它把位选输出的低,变成了高,送到公共的阳极上。此时,段选再输出低,就满足了共阳数码管的发光条件。
89C51的管脚说明
P3口:P3口管脚是8个带内部上拉电阻的双向I\/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。P3口也可作为AT89C51的一些特殊功能口,...
89c51单片机定时计数器的工作原理?
单片机C51计数器要求:编写一个计数器程序,将T0作为计数器来使用,对外部信号计数,将所计数字显示在数码管上。 该部分的硬件电路如图所示,U1的P0口和P2口的部份引脚构成了6位LED数码管驱动电路,数码管采用共阳型,使用PNP型三极管作为片选端的驱动,所有三极管的发射极连在一起,接到正电源端,它...
89c51单片机的数字钟程序?
\/\/CPL A \/\/根据数码管是共阴、共阳 是否取反 MOV P0,A \/\/从P0输出每位的码值,注意:该端口时下面的“清屏”一起改 LCALL DELAY \/\/进入每位延时 MOV P0,#0FFH \/\/清屏 INC 48H \/\/暂存器后移 INC R0 \/\/位后移 MOV A,48H \/\/通过 (48H)的值+08H 判断是否到了 位尾 ADD A,#08H JB 0D6H,...
89c51单片机有几组I\/O口,请简单介绍其主要功能
P3口除作为一般IO口还为第二输入\/输出功能(P3.0 串行数据接入端;P3.1 串行数据发送端;P3.2 外中断0输入端 ;P3.3 外中断1输入端;P3.4 定时或计数器TO 的外部输入端;P3.5 定时或计数器T1的外部输入端;P3.6 外部数据存储器写选通信号;P3.7 外部数据存储器读选通信号;)...
89C51用keil c51写程序时要用某一个口的某一位时必须要先定义位变量吗...
看你用什么语言写了,如果用汇编的话不用定义,直接用就行了,如:p1.0、p2.2……如果用C编写的话,应该先把头文件加进来,#include<reg51.h>,加进来后,如果不定义端口的话:P1、P1^1,这里的P是大写的……当然也可以自己定义了……如:sbit R_A=P2^0;等等……...
用89c51接4位数码管的原理图怎么画
PNP三极管+限流、分压电阻+共阳极或共阴极数码管