你的程序有问题哦!
#include <reg51h>
#include <mathh>
#include <intrinsh>
#define uchar unsigned char
#define TURE 1
#define FALSE 0
int key;
int del;
void Tkey(void);
/主 程序/
void main(void)
{
void tkey(void);
void delay(int);
SCON=0x00;
TI=0;
while(TURE)
{
Tkey();
delay(2000);
} //这是一个死循环
}
void Tkey(void)
{
uchar readkey;//rereadkey;
uchar x_temp,y_temp;
/你给出的程序提示你的键盘是4X4的/
P1=0x0f; //给行送高电平,列送低电平
x_temp=P1&0x0f; //读回行的状态
if(x_temp==0x0f) goto keyout; /若行中有低电平也即不等于0x0f,
/表示有键按下
P1=0xf0; //给给列送高电平,行送低电平
y_temp=P1&0xf0; //读回列状态
readkey=x_temp|y_temp; //行状态列状态并起代表一个按键
readkey=~readkey; //取反
switch(readkey) //判定按键代码
{
case 0x11:key=0; break;
case 0x21:key=1; break;
case 0x41:key=2; break;
case 0x81:key=3; break;
case 0x12:key=4; break;
case 0x22:key=5; break;
case 0x42:key=6; break;
case 0x82:key=7; break;
case 0x14:key=8; break;
case 0x24:key=9; break;
case 0x44:key=10;break;
case 0x84:key=11;break;
case 0x18:key=12;break;
case 0x28:key=13;break;
case 0x48:key=14;break;
case 0x88:key=15;break;
default: key=16;break;
}
keyout:_nop_();
}
/延时程序/
void delay(del)
{
for(del;del>0;del--);
}
按照行顺序,一行一行的开启,如下图:44共16键,假设P00-P03为H0-H3,P04-P07为L0-L3
(列)
L0
L1
L2
L3
(行)
H0
0
1
2
3
H1
4
5
6
7
H2
8
9
A
B
H3
C
D
E
F
首先让
H0
=
0,然后依次检测L0-L3,看那个键按下了
,则对应的L0-L3为0,这样第一行检测结束。比如扫描H0
行时
第一个键按下了,则L0=0,获得的P0=0xee,你也可以返回一个值,比如就是0,来代表第一个键(0)被按下,这样依次检测就扫描满16个键就行了。
完全可以,主要是程序编制,和4*4键盘原理是一样的, 一个口的5根线作为输出,轮换有一根线输出低电平,另一个口5根线作为输入,通过读到的输入数据就可以知道哪个键按下
我认为编程比4*4键盘还简单,因4*4按键只占用一个端口如P0,输出数据和读取数据用的
都是它, 而5*5键盘用的是2个端口,输出和读取相互独立,互不影响
你要放到“死循环”中不断扫描。他的原理图一般是这样的
以第一个按键为例,当你按下时I/O口读到的数据就不是0x0f了。好吧你最开始的赋值错了。你要用0xee,0xde检测的话你应该给0xfe。每四个按键是一组。我这有一个我做密码锁的程序你参考一下。
void key()
{
P3=0xfe;
if(P3!=0xfe)
{
time(50);
if(P3!=0xfe)
{
switch(P3)
{
case 0xee:num=1,cs++;
break;
case 0xde:num=2,cs++;
break;
case 0xbe:num=3,cs++;
break;
case 0x7e:num=4,cs++;
break;
}
}
while(P3!=0xfe);
}
P3=0xfd;
if(P3!=0xfd)
{
time(50);
if(P3!=0xfd)
{
switch(P3)
{
case 0xed:num=5,cs++;
break;
case 0xdd:num=6,cs++;
break;
case 0xbd:num=7,cs++;
break;
case 0x7d:num=8,cs++;
break;
}
}
while(P3!=0xfd);
}
P3=0xfb;
if(P3!=0xfb)
{
time(50);
if(P3!=0xfb)
{
switch(P3)
{
case 0xeb:num=9,cs++;
break;
case 0xdb:num=0,cs++;
break;
case 0xbb:cs++;
break;
case 0x7b:num=10,cs=0,a=b=c=d=e=f=10,ply=1;
break;
}
}
while(P3!=0xfb);
}
}
在单片机应用系统中,对键盘的处理工作仅是CPU工作内容的一部分,CPU还要进行数据处理、显示和其他输入输出 *** 作,因此键盘处理工作既不能占用CPU太多时间,又需要CPU对键盘 *** 作能及时作出响应。CPU对键盘处理控制的工作方式有以下几种:
(1)程序控制扫描方式
程序控制扫描方式是在CPU工作空余,调用键盘扫描子程序,响应键输入信号要求。程序控制扫描方式的键处理程序固定在主程序的某个程序段。当主程序运行到该程序段时,依次扫描键盘,判断有否键输入。若有,则计算按键编号,执行相应键功能子程序。这种工作方式,对CPU工作影响小,但应考虑键盘处理程序的运行间隔周期不能太长,否则会影响对键输入响应的及时性。
(2)定时控制扫描方式
定时控制扫描方式是利用定时/计数器每隔一段时间产生定时中断,CPU响应中断后对键盘进行扫描,并在有键闭合时转入该键的功能子程序。定时控制扫描方式与程序控制扫描方式的区别是,在扫描间隔时间内,前者用CPU工作程序填充,后者用定时/计数器定时控制。定时控制扫描方式也应考虑定时时间不能太长,否则会影响对键输入响应的及时性。
(3)中断控制方式
中断控制方式是利用外部中断源,响应键输入信号。当无按键按下时,CPU执行正常工作程序。当有按键按下时,CPU立即产生中断。在中断服务子程序中扫描键盘,判断是哪一个键被按下,然后执行该键的功能子程序。这种控制方式克服了前两种控制方式可能产生的空扫描和不能及时响应键输入的缺点,既能及时处理键输入,又能提高CPU运行效率,但要占用一个宝贵的中断资源。
以上就是关于这个键盘扫描程序怎么理解(急急急急急!!!!)全部的内容,包括:这个键盘扫描程序怎么理解(急急急急急!!!!)、单片机4*4键盘扫描程序时如何开启的、8051单片机5x5键盘扫描程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)