我在网上找了一个程序,关于扫描的那部分看不懂,望高人能够指点。
/* 本程序的功能是用数码管上显示4X4矩阵键盘按下的键号,
分别定义为0-f 矩阵键盘原理图如上图
其中P2是位选、P0是段选,低电平有效 */
#include <reg51.h> //51头文件
#define uchar unsigned char
#define uint unsigned int
uchar table[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82, //0,1,2,3,4,5,6
0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xBF};//7,8,9,A,B,C,D,E,F,- 段码数组
uchar dis_buf; //显示缓存
uchar temp;
uchar key; //键号
/*---------延时函数-------------*/
void delay(unsigned int a)
{
uint i;
while(a--)
{
for(i=0;i<120;i++);
}
}
/*-----------键扫描子程序-----------------*/
void keyscan(void)
{
P1=0x0F; //低四位输入
delay(1); //稍稍延时
temp=P1; //读P1口
temp=temp&0x0F; //取低四位
temp=~(temp|0xF0);
if(temp==1) //检测按下的键所在的列号,在第一列
key=0;
else if(temp==2) //在第二列
key=1;
else if(temp==4) //在第三列
key=2;
else if(temp==8) //在第四列
key=3;
else
key=16; //否则显示-
P1=0xF0; //高四位输入
delay(1);
temp=P1; //读P1口
temp=temp&0xF0;
temp=~((temp>>4)|0xF0);
if(temp==1) //检测按下的键所在的行号,在第一行
key=key+0;
else if(temp==2) //在第二行
key=key+4;
else if(temp==4) //在第三行
key=key+8;
else if(temp==8) //在第四行
key=key+12;
else
key=16; //否则显示-
/* 根据行号和列号得到按下的键号 */
dis_buf=table[key]; //查表得键值
}
/*----------判断键是否按下-------------*/
void keydown(void)
{
P1=0xF0;
if(P1!=0xF0)
{
keyscan(); //调用keyscan()子函数
while(P1!=0xF0); //等待键释放
}
}
/*---------------主函数--------------------*/
main()
{
P0=0xFF; //置P0口
P2=0xFF; //置P2口
dis_buf=0xBF; //赋初值,没有键按下时,数码管显示-
while(1) //大循环
{
keydown(); //调用keydown()子函数
P0 = dis_buf; //键值赋给P0口,显示
delay(2);
P2 = 0x7F;
}
}
能否尽量详细地说一下:
P1=0x0F; //低四位输入
delay(1); //稍稍延时
temp=P1; //读P1口
temp=temp&0x0F; //取低四位
temp=~(temp|0xF0);
if(temp==1) //检测按下的键所在的列号,在第一列
key=0;
else if(temp==2) //在第二列
key=1;
else if(temp==4) //在第三列
key=2;
else if(temp==8) //在第四列
key=3;
else
key=16; //否则显示-
这一段的意义。谢谢!!
4x4矩阵键盘的工作原理是什么?
您好,楼主工作的原理是:用4条I\/O线作为行线,4条I\/O线作为列线组成的键盘。在行线和列线的每个交叉点上,设置一个按键。而这样的按键中按键的个数是4 X 4个。这样的行列式键盘结构能够有效地提高单片机系统中I\/O口的利用率。 本回答由网友推荐 举报| 答案纠错 | 评论 9 3 金醋 采纳率:62% 擅长: 暂...
矩阵键盘检测按钮是否被按下为何要检测两次
P2照这样看应该是端口值,写2次中间有一个delay(10);看清楚了没有,这个是按键检测防抖动用的,必须的 一看就知道你是一个菜鸟中的菜鸟。再告诉你一下,你看的这个程序也是菜鸟写的 垃圾得要命 可以写成一个简单的程序,10或者20ms循环一次,将值保存下来,将2次得到的值相比较,相同的话,又...
单片机在扫描是否有键按下时,为什么要做这么多次的判断?有什么作用...
是为了防止键盘抖动,键盘抖动的时间是很短的,通过延时一段时间后,如果再判断键盘是按下的,这是才真正能说明键盘按下了,相反,则是抖动,不能说明键盘按下!所以,软件中一般都需要两次判断键盘按下!第一次之后,加段延时,之后再判断
单片机菜鸟求高人指点 矩阵键盘 数码管,怎么实现:按1显示1,再按2显示1...
include<reg52.h> unsigned char key_num,count=0,k;unsigned long sum=0;unsigned char code str[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xff};void scan();void disp_led(unsigned long int dat);void delay(unsigned int dly);void main(){for(k=0;k<=7;k...
请问矩阵键盘电路板该如何调试?
矩阵键盘,通常都是用扫描的了。JTAG是仿真器接口,CAN是通讯接口,CAN总线可能会有点难度,建议你先调矩阵键盘,因为它是比较容易的。tms2808dsp,我不了解,在网上也没有查到任何资料,看来得靠你努力了。
键盘矩阵行反转法的讲解 有程序有注释 但是就是不明白它怎么实现的...
1、行反转法的基本概念是:行列线的交叉位置布置按键。所有行和列加上拉电阻。所有行作输出先送低电平,然后读入列值。 如果有任意键按下,那么一定对应列值有0出现,也就知道了按下的键所在列。反过来驱动这一列为0,其他列为1。把行作输入。就可以判断按下的键所在行。2、掌握8255的接口。如何...
求关于单片机的电子琴C程序
列式键盘”区域中的C1-C4 R1-R4 端口上;4. 相关程序内容 (1. 4X4 行列式键盘识别;(2. 音乐产生的方法;一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我 们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片 机来产生不同的频率非常方便,我们...
单片机高手,帮我看看这个反转发循环扫描矩阵键盘程序,帮我详细的解释哈...
以S10被按下为例说明:uchar keyscan(void) \/\/键盘扫描函数,使用行列反转扫描法 { uchar cord_h,cord_l;\/\/行列值中间变量 P3=0x0f; \/\/行线输出全为0 cord_h=P3&0x0f; \/\/读入列线值 if(cord_h!=0x0f) \/\/先检测有无按键按下,如果cord_h=0x0f说明无键按下 { delay(...
...有有关电脑基本知识的资料(硬件的话最好有图片辨认,某人系菜鸟!)
启动磁盘扫描程序,对C盘(系统盘)进行扫描,看看能否完成,如果无法完整甚至死机,则重新启动,即可关机。但是最好的办法是修复系统或者从新安装系统。 2.如果是XP或者2003、NT的话;则是系统所运行的进程太多了,关闭程序需要时间就多,等几分钟依然可以正常关机。 出自:http:\/\/zhidao.baidu.com\/question\/32469539.html?
矩阵键盘和独立按键的区别是什么?
独立按键:一个按键占用单独的一个I\/O口; 矩阵键盘:为了节省I\/O口,通常将按键排列成矩阵形式,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。(上个图,一看就明白) 本回答由提问者推荐 举报| 答案纠错 | 评论(2) 30 1 ShoW_DonG 采纳率:31% 擅长: 暂未定制 为...