c52单片机的4*4键盘编码
2012-05-13 12:42
134 查看
硬件连线:
软件实现
:
#include<reg52.h>
#define uchar unsigned char;
#define uint unsigned int;
uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e};/*数码管0-f*/
uchar num,tmp;
void main(void)
{
P2=0x7f;//P2数码管位选,低电平有效
P0=0xff;//p0段选,低电平有效
P1=0xff;
while(1)
{
P1=0x7f;
tmp=P1;
tmp=tmp&0x0f;
while(tmp!=0x0f)
{
tmp=P1; // 虽然没有延时,此处必不可少,是为了实时检测按键,以退出while循环
tmp=tmp&0x0f;//下同...
if(tmp!=0x0f)
{
switch(tmp)
{
case 0x07:num=3;
break;
case 0x0b:num=7;
break;
case 0x0d:num=11;
break;
case 0x0e:num=15;
break;
default: break;
}
P0=table[num];
}
}
//第二列
P1=0xbf;
tmp=P1;
tmp=tmp&0x0f;
while(tmp!=0x0f)
{
tmp=P1;
tmp=tmp&0x0f;
if(tmp!=0x0f)
{
switch(tmp)
{
case 0x07:num=2;
break;
case 0x0b:num=6;
break;
case 0x0d:num=10;
break;
case 0x0e:num=14;
break;
default: break;
}
P0=table[num];
}
}
//第三列
P1=0xdf;
tmp=P1;
tmp=tmp&0x0f;
while(tmp!=0x0f)
{
tmp=P1;
tmp=tmp&0x0f;
if(tmp!=0x0f)
{
switch(tmp)
{
case 0x07:num=1;
break;
case 0x0b:num=5;
break;
case 0x0d:num=9;
break;
case 0x0e:num=13;
break;
default: break;
}
P0=table[num];
}
}
//第四列
P1=0xef;
tmp=P1;
tmp=tmp&0x0f;
while(tmp!=0x0f)
{
tmp=P1;
tmp=tmp&0x0f;
if(tmp!=0x0f)
{
switch(tmp)
{
case 0x07:num=0;
break;
case 0x0b:num=4;
break;
case 0x0d:num=8;
break;
case 0x0e:num=11;
break;
default: break;
}
P0=table[num];
}
}
}
}
总结:程序中没有加延迟去抖,但实验现象正常。原因可能跟这个程序本身要实现的功能有关,需注意,在其他地方不一定就不需要了。
软件实现
:
#include<reg52.h>
#define uchar unsigned char;
#define uint unsigned int;
uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e};/*数码管0-f*/
uchar num,tmp;
void main(void)
{
P2=0x7f;//P2数码管位选,低电平有效
P0=0xff;//p0段选,低电平有效
P1=0xff;
while(1)
{
P1=0x7f;
tmp=P1;
tmp=tmp&0x0f;
while(tmp!=0x0f)
{
tmp=P1; // 虽然没有延时,此处必不可少,是为了实时检测按键,以退出while循环
tmp=tmp&0x0f;//下同...
if(tmp!=0x0f)
{
switch(tmp)
{
case 0x07:num=3;
break;
case 0x0b:num=7;
break;
case 0x0d:num=11;
break;
case 0x0e:num=15;
break;
default: break;
}
P0=table[num];
}
}
//第二列
P1=0xbf;
tmp=P1;
tmp=tmp&0x0f;
while(tmp!=0x0f)
{
tmp=P1;
tmp=tmp&0x0f;
if(tmp!=0x0f)
{
switch(tmp)
{
case 0x07:num=2;
break;
case 0x0b:num=6;
break;
case 0x0d:num=10;
break;
case 0x0e:num=14;
break;
default: break;
}
P0=table[num];
}
}
//第三列
P1=0xdf;
tmp=P1;
tmp=tmp&0x0f;
while(tmp!=0x0f)
{
tmp=P1;
tmp=tmp&0x0f;
if(tmp!=0x0f)
{
switch(tmp)
{
case 0x07:num=1;
break;
case 0x0b:num=5;
break;
case 0x0d:num=9;
break;
case 0x0e:num=13;
break;
default: break;
}
P0=table[num];
}
}
//第四列
P1=0xef;
tmp=P1;
tmp=tmp&0x0f;
while(tmp!=0x0f)
{
tmp=P1;
tmp=tmp&0x0f;
if(tmp!=0x0f)
{
switch(tmp)
{
case 0x07:num=0;
break;
case 0x0b:num=4;
break;
case 0x0d:num=8;
break;
case 0x0e:num=11;
break;
default: break;
}
P0=table[num];
}
}
}
}
总结:程序中没有加延迟去抖,但实验现象正常。原因可能跟这个程序本身要实现的功能有关,需注意,在其他地方不一定就不需要了。
相关文章推荐
- 【单片机】编码键盘实验
- 键盘编码
- 单片机系统与标准PC键盘的接口模块设计
- 89系列单片机的型号编码
- 51单片机的4×4键盘识别与74LS164驱动数码显示
- JSON格式的键盘编码对照表
- 矩阵键盘扫描原理详解——单片机
- 使用单片机捕获红外编码
- 键盘按键的各种编码对照表
- 单片机系统与标准PC键盘的接口模块设计
- Eclipse全键盘编码攻略之一——入门
- 一类单片机基于事件的键盘处理程序
- 单片机键盘-示例程序代码
- 键盘按键编码对应表
- 键盘按键表,按键号,按键编码
- C语言 键盘编码 及 用法
- 键盘编码KeyCode对照图表
- 单片机练习 - 模拟电话键盘
- unity 键盘检测代码编码总结
- 【简便操作】Eclipse全键盘编码攻略