用单片机p2口扩展一个4*4键盘,用c语言实现按键识别程序

作者&投稿:烛盲 (若有异议请与网页底部的电邮联系)
求大神帮写一液晶+STC89c52单片机+4*4矩阵键盘实现简易计算器的C语言程序,实现加减乘除以及扩展功能~


没有液晶的,以前做了一个有一个数码管的,发给你供参考。
#include#define uchar unsigned char;uchar LED1,LED2,LED3,LED4;uchar keyval,calflag,s_dat,d_dat;uchar distab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};unsigned int number,r_dat;void delay(unsigned int a){unsigned int i,j;for(i=0;i3)number=0;}main(){TMOD = 0x01;number = 0;TH0=0xf4;TL0=0x48;TR0=1;ET0=1;EA=1;LED1=0;LED2=0;LED3=0;LED4=0;while(1){getkey();switch(keyval){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:LED3=LED4;LED4=keyval;LED1=0;LED2=0;break;case 10:break;//"ON"case 11://"="d_dat=LED3*10+LED4;dealdat();break;case 12://"/"calflag=3;s_dat=LED3*10+LED4;LED3=0;LED4=0;break;case 13://"*"calflag=2;s_dat=LED3*10+LED4;LED3=0;LED4=0;break;case 14://"-"calflag=1;s_dat=LED3*10+LED4;LED3=0;LED4=0;break;case 15://"+"calflag=0;s_dat=LED3*10+LED4;LED3=0;LED4=0;break;default:break;}}}

下面是在P1口接4X3矩阵键盘的驱动程序,供你参考。上拉电阻也可以不用.
code U8 kcode[]={0xb7,0xbe,0xde,0xee,0xbd,0xdd,0xed,0xbb,0xdb,0xeb,0xd7,0xe7};//反转码对应键值 0 1 2 3 4 5 6 7 8 9 A BU8 key(void){ U8 a,r = 0xff; delay_ms(20); // 延时20毫秒,消除按键抖动 if(P1 == 0xf0) goto rn; a = P1; P1 = a | 0x0f; delay_ms(20); a = P1; for (r = 0;r <= 11;r++) { if(a == kcode[r]) break; };rn: P1 = 0xf0; return r;}

#include<reg51.h>
#define uchar unsigned char;
uchar keyval;
void delay(unsigned int a)
{
unsigned int i,j;
for(i=0;i<a;i++)
for(j=0;j<120;j++);
}
uchar kbscan(void)
{
unsigned char sccode,recode;
P2=0x0f; //发0扫描,列线输入
if ((P2 & 0x0f) != 0x0f) //有键按下
{
delay(20); //延时去抖动
if ((P2&0x0f)!= 0x0f)
{
sccode = 0xef; //逐行扫描初值
while((sccode&0x01)!=0)
{
P2=sccode;
if((P2&0x0f)!=0x0f)
{
recode=(P2&0x0f)|0xf0;
return((~sccode)+(~recode));
}
else
sccode=(sccode<<1)|0x01;
}
}
}
return 0; //无键按下,返回0
}

void getkey(void)
{
unsigned char key;
key=kbscan();
if(key==0){keyval=0xff;return;}
switch(key)
{
case 0x11:keyval=7;break;
case 0x12:keyval=4;break;
case 0x14:keyval=1;break;
case 0x18:keyval=10;break;
case 0x21:keyval=8;break;
case 0x22:keyval=5;break;
case 0x24:keyval=2;break;
case 0x28:keyval=0;break;
case 0x41:keyval=9;break;
case 0x42:keyval=6;break;
case 0x44:keyval=3;break;
case 0x48:keyval=11;break;
case 0x81:keyval=12;break;
case 0x82:keyval=13;break;
case 0x84:keyval=14;break;
case 0x88:keyval=15;break;
default:keyval=0xff;break;
}
}

main()
{
while(1)
{
getkey();
switch(keyval)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
case 11:
case 12:
case 13:
case 14:
case 15:
default:break;
}
}
}

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x67};
void delay(uint m)
{ uint i,j;
for(i=m;i>0;i--)
for(j=110;j>0;j--);
}
void display(uchar num)
{ wela=1;
P0=0xc0;
wela=0;
P0=0XFF;
dula=1;
P0=table[num];
dula=0;
}
void keycans()
{ uchar a,key,c;
P3=0X0f;
if(P3!=0X0f)
{ delay(10);
if(P3!=0x0f)
{
a=P3;
P3=0Xf0;
c=P3;
a=a|c;
switch(a)
{case 0xee:key=1;break;
case 0xde:key=2;break;
case 0xbe:key=3;break;
case 0x7e:key=4;break;
case 0xed:key=5;break;
case 0xdd:key=6;break;
case 0xbd:key=7;break;
case 0x7d:key=8;break;
case 0xeb:key=9;break;
case 0xdb:key=10;break;
case 0xbb:key=11;break;
case 0x7b:key=12;break;
case 0xe7:key=13;break;
case 0xd7:key=14;break;
case 0xb7:key=15;break;
case 0x77:key=16;break;

}
while(!a);
display(key);
}
}
}
void main()
{
while(1)
keycans();
}


单片机的引脚需要扩展吗
MCS-51单片机的并行口有P0、P1、P2和P3,由于P0口是地址/数据总线口,P2口是高8位地址线,P3口具有第二功能,这样,真正可以作为双向I/O口应用的就只有P1口了。这在大多数应用中是不够的,因此,大部分MCS-51单片机应用系统设计都不可避免的需要对P0口进行扩展。由于MCS-51单片机的外部RAM和I/...

单片机并行扩展外接芯片时,p2通常作
这要看是扩展什么芯片了,如果是扩展需要地址线、数据线和控制线的存储器之类的芯片时,就要用P2口作高8位地址线了。而要是扩展只有8位数据的芯片时,如8位数据锁存器,就不一定非要用P2口了,原则上8位的并行口P0~P3都可以用的。

单片机C语言怎么能对P2口的1,2,3,4,5位进行清零或者置一,而不影响其他...
这种单独对指定I\/O口赋值而不改变其他位的操作在430单片机用的很多的。比如:你要给P2.1和P2.2赋1,但不想改变其他位,那么你可以这样写:P2=P2 | 0x06(51单片机的写法)P2OUT|=0x06(430单片机的写法)。要给指定端口置0,而不影响其他位。比如要求P2^1=0,其他位不变。P2=P2&0xFD(即要...

51的单片机中,P0口作为段选,而P2口作为位选,需要挺多数码管显示的。不...
亲,只能选用扩展方案。但138太麻烦了。建议你选用74154,是一个4-16线的译码器。http:\/\/wenku.baidu.com\/view\/5262f0c04028915f804dc25e.html 这是他的数据手册。你的数码管一共都加起来是12位,也就是只要能提供出去12个信号就行了。 74154的4个输入端A0A1A2A3可以分别连接单片机的32脚,21脚...

单片机问题:P2口的低4位为数据口,高4位为控制AD的信号线,初始化时将...
每读一次数据,你就要把p2口置1,要不然就读不出来,程序就出错。p2口是准双向口。还有ad是什么型号,怎么只有4个数据端口,不是要么8位并行要么串行么?

现有一个51单片机系统,P2口接一个共阳极的LED数码管,编写程序满足如下要 ...
delay()能不用别用,这东西会让你的CPU堵塞,使得其利用率大大降低,的如果代码大了,可能会让你的CPU运行起来很卡。另外你程序里出现的是P1,但你的题目描述是P2,如果真是P2口,那么我给你的程序中P1要改为P2,还有就是还不知你的硬件接的对不,要注意一点,51单片机是弱上拉的。

典型51单片机的P0,P1,P2,P3口都有哪些功能?
2. P1口:这是一个简单的I\/O口,输入前同样需要置1,且无高阻态。P1口可作为输出或输入使用,能够驱动4个TTL负载。3. P2口:类似于P1口,P2口也是I\/O口。当外部存储器存在时,P2口用作地址线,以访问64K的外部数据存储器。P2口同样能够驱动4个TTL负载。4. P3口:P3口同样具备I\/O功能,且...

C51单片机P2口直接驱动一个共阴极数码管k可以吗?为什么?谢谢。_百度...
你是要用P2口驱动数码管的段吗?可以的,内部有上拉到电源,一个数码管没问题的,每个单片机引脚的输出电流能力可达10mA以上。如果是P0口直接驱动则不行,因为P0是开漏的,本身不能输出高电平,只能是加上拉

编程实现51单片机,P2口连接一个共阳极数码管,每到1s更新显示0~9s,要求...
include<reg52.h> include <intrins.h> define uchar unsigned char define uint unsigned int uchar code TABLE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77};\/\/七段码表 主程序中:TMOD=0X10;TH1=(65536-50000)\/256;TL1=(65536-50000)%256;ET1=1;\/\/开定时器1...

单片机的四个io口分别是
P1、P2和P3。P0口:作外部三总线的地址总线(低8位)\/数据总线;P1口:作扩展型芯片的外部引脚,例如52的C\/T2外部信号输入,S52之WDT的报警输出等;P2口:作外部三总线的地址总线(高8位);P3口:作串口、定时器、外部中断的输入\/出线,及外部RAM读写的控制信号(外部控制总线的一部分)。

元宝区18710496071: 单片机,用P2口8个口做4*4矩阵键盘,正常,再装四个按键,一半接地,一半接P2.4到P2.7, -
秋齿妇康: 这个问题你还要问的,你仔细看看你的硬件连接,你P2口4*4键盘,肯定是高4为是0低四位是高就是 0x0F,你按键第一个按下是检测到 P2.4是低电平是不是,你又加了4个按键接到P2的低四位按键另一段接地,你按下后P2.4也是低电平,和你按键第一个按键你觉得有区别吗.

元宝区18710496071: 通过单片机外接一个4*4矩阵键盘,设置“0 - 9”启动”10个按键,进行30秒倒计时显示通过2位数码管实时显示 -
秋齿妇康: 1.编码按钮分别为0,1,2,……,9十个按键:可以用矩阵键盘实现,2.用发光二极管作为输出指示灯,灯亮代表锁“开”,灯灭代表锁“不开”,用一个IO口,接上二极管,接上限流电阻,接地.密码正确,另该IO口值为1,否则为0;3.设置开锁密码...

元宝区18710496071: (80C51单片机)设计4*4键盘及8位数码管显示构成的电子密码锁.的C语言程序. -
秋齿妇康: 4*4矩阵键盘检测程序(新手用),本程序用于检测4*4矩阵按键,先检测是否有按 键按下,如果有按键按下,由P1口读出相应的编码值,由P0经两片74HC573输出给8位数码管,P2^0位选,P2^1段选,P1接4*4矩阵按键#include #include //头文...

元宝区18710496071: 51单片机 如何4*4矩阵键盘输入按键 继电器输出信号 -
秋齿妇康: ........... Inter0_process() interrupt 2 //外部中断1 { Key_scan();//你的键盘扫描程序(中断服务程序),一旦触发中断,将运行至本段. } //主程序main() {........... ........... ........... EX1=1; //开中断一 P3.3 IT1=1; //下降沿触发 ET1=1; EA=1;........... ...........} 注:图中的键盘接法都是独立按键接发,矩阵键盘没有见过能直接触发中断的.

元宝区18710496071: C51单片机用IO口做为几个按键的控制,现在想用4X4键盘控制,请问下面显示程序应该怎么改啊?折磨死了 -
秋齿妇康: 4X4太浪费单片机IO了,我为你介绍5个IO控制25按键的电路,如下文:本文以循序渐进的思路,引导大家思考如何用最少的IO驱动更多的按键,并依次给出5种方案原理图提供参考.在实际项目中我们经常会遇到有按键输入的需求,但有的时候...

元宝区18710496071: 4*4矩阵键盘程序的扩展 -
秋齿妇康: 原理 和 思路都是一样的,你当然可以直接用 单片机的并口,来当纵向 和 横向的地址线,但是,通常人们为了节省io口资源,都会外接专门的键盘阵列芯片,来专门处理阵列接键盘,比如zlg7289就可以用,你可以查下它的datasheet,上面应该有典型电路,和测试程序

元宝区18710496071: 单片机4*4矩阵键盘中的4*4指的是什么,是横四个竖四个的意思,还是键盘的大小是4* -
秋齿妇康: 1、4*4=16,总共16个按键,并且按照4行,4列的硬件接法,占用8个IO管脚.采用行扫描或反转法读取键值.但该硬件电路接法并不影响实际的布局,你当然可以摆成横2*竖8,甚至更多形式.2、同样16个按键,2*8也可,2行,8列硬件接法.但是会多用管脚.所以通常采用最少IO矩阵设计.3、按键的PCB封装外形大小,通常是6X6,单位mm.但是高度有很多种,根据实际需要选择高度.

元宝区18710496071: 4*4键盘(行列)单片机接口电路分析
秋齿妇康: 看不清楚具体引脚,貌似是用键盘控制步进电机的一个仿真. 你想问什么呢? 是L298貌似.因为单片机IO口电流太小,所以需要L298来作为驱动芯片来控制电机.L298对电机控制输出共4个引脚ABCD,就是那些DOUT1-DOUT4,功能应该分别是加速,减速,正转和反转.用4X4键盘接在P2口,采用中断方式.一旦有按键,便会执行键盘扫描程序,根据得到的键值从P1口对L298输入相应的控制信号,从而达到对电机的控制.至于那个LED显示因为没程序所以也不知道它具体是在显示什么.下图是L298的四种输入分别对应的输出,其中 A、B、C、D 为步进电机的四个线圈,为 1 表示有电流通过,为 0 表示 没有电流流过

元宝区18710496071: 单片机c语言求救 我做一个4*4的按键扫描, row=P3&0xf0; P3=row|0x0f; col=P3&0x0f; 看不懂中间那句 -
秋齿妇康: row=P3&0xf0; 意思是:屏蔽低4位,只取出高4位的值,高4位是多少与完后还是多少.也就是列值 P3=row|0x0f; 意思是:P3口读会现在按下哪个键的值 col=P3&0x0f; 意思是:同第一句一样屏蔽高4位,取第四位值.也就是行值.

元宝区18710496071: 4*4键盘的电路接法,就是1234567890ABCDEF的那种 -
秋齿妇康: 4*4=8,会占用8根线,用一个I/O口就行了. 如果I/O口不够用,可以用其他片子扩展I/O口.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网