关于c51做4x4矩阵按键矩阵检测实验原理检测2位7段数码管显示

51单片机的4X4矩阵键盘的C语言程序
#include&AT89X52.H&&
&/////////////////////////////////////////数码管常量/////////////////////////////////////////////////////////&
unsigned char code
table[]={0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80,0x90};
//LED段码&
unsigned char code position[]={1,2,4,8}; //LED选位码
/////////////////////////////////////////延时函数////////////////////////////////////////////////////////////&
& 延时t毫秒&
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////&
void &delay_ms(unsigned char
& unsigned char
& while(t--)while(t2--);
///////////////////////////// &数码管显示函数
&////////////////////////////////////////////////////////////////////////&
参数:待显示的数据&
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////&
void led_display(unsigned int dat ) &
unsigned int dat1=dat000;
&//四位数码管只能显示到一千,此处用于防止溢出 &
P0=table[dat1/1000]|position[0];&
delay_ms(2);&
P0=table[(dat100)/100]|position[1];&
delay_ms(2);&
P0=table[dat10/10]|position[2];&
delay_ms(2); & &
P0=table[(dat1)]|position[3];&
delay_ms(2); &
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
& & 按键扫描函数
& & 若有按键按下:返回 键值(1-16);
& & 若没按键按下:返回
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
unsigned char getch ( &)
& & unsigned char X=0,
& & k=255;
& & P2=0x0f;
& & & //先对P2置数
&行扫描 &&
& & if(P2!=0x0f)
& & //判断是否有键按下
& //延时,软件去干扰
& if(P2!=0x0f) & //确认按键按下X = P2;
& & & X=P2;
& &//保存行扫描时有键按下时状态
& & & P2=0xf0;
& & & //列扫描
& & & Y=P2;
& &//保存列扫描时有键按下时状态
& & & Z=X|Y;
& //取出键值
& & & switch ( Z
) & //判断键值(那一个键按下)
& & case 0xee: k=0;
//对键值赋值 &&
& & case 0xde: k=1;
& & case 0xbe: k=2;
& & case 0x7e: k=3;
& & case 0xed: k=4;
& & case 0xdd: k=6;
& & case 0xbd: k=7;
& & case 0x7d: k=8;
& & case 0xeb: k=9;
& & case 0xdb: k=7;
& & case 0xbb: k=10;
& & case 0x7b: k=11;
& & case 0xe7: k=12;
& & case 0xd7: k=13;
& & case 0xb7: k=14;
& & case 0x77: k=15;
while(P2!=0xf0); &&
void main() &&
& & unsigned char
temp=0,key=255; &&
& & while(1)
& key=getch(); &
& //扫描 &&
& if(key!=255)temp= &//有按键按下
& led_display(temp); &
& //显示按键值
单片机教程:http://www.ipbb.cn
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。【新提醒】基于proteus的51单片机仿真实例八十二、4X4矩阵键盘应用实例
我的图书馆
【新提醒】基于proteus的51单片机仿真实例八十二、4X4矩阵键盘应用实例
1、矩阵键盘的工作原理:
1)接口电路:在单片机系统中,当按键数量较多时,为了减少IO口的使用,通常将按键排列成矩阵型式,例如本例中的16个按键,被排列成了如下图所示的4X4矩阵方式。即由4根行线和4根列线组成,每个行线和列线的交叉点既是一个按键。这样共需8个IO口。
2)工作原理
使用矩阵键盘的关键是如何判断那个按键被按下。根据下面的电路图,如果已知P1.0端口被置为低电平“0”,那么当按键K0被按下时,可以肯定P1.4端口的电平也变为了低电平“0”。基于这个原理,总结矩阵键盘识别按键的步骤如下:
a)首先判断是否有按键被按下。将全部行线置为低电平“0”,全部列线置为高电平“1”。然后检测列线的状态。只要有一根列线的电平为低,则表示有按键被按下。否则没有按键按下。
b)按键消抖。当判断到有按键被按下后,还要进行消抖处理,以确认真正有按键被按下。
c)按键识别:当确认有键被按下后,采用逐行扫描的方法来确定是哪一个按键被按下。先扫描第一行,即将第一行输出低电平“0”,然后读取列值,那一列出现低电平“0”,则说明该列与第一行交叉处的按键被按下。如果读入的列值全部为"1",说明与第一行连接的按键均没有被按下。那么接下来开始扫描第二行,以此类推。直到完成全部行线的扫描。
本例中矩阵键盘中P1端口低4位连接的是列线,高4位连接的是行线。
2、在keil c51中新建工程ex70,编写如下程序代码,编译并生成ex70.hex文件
//数码管显示4X4矩阵键盘键值#include &reg51.h&
//数码管段码表,共阳极段码表,实际电路用的共阴极数码管unsigned char code disp_buff[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00};//上次按键和当前按键序号,该矩阵中序号范围0-15,16表示无按键unsigned char pre_keyno = 16,keyno = 16;
//延时函数void delayms(unsigned int x){&&&while(x--)&{&&for(i = 0;i & 120;i++);&}}
//按键扫描函数,首先判断按键发生在那一列,然后根据所发生的行附加不同的值,从而得到键盘按键序号void key_scan(void){&&&//高4位置1,放入4行&P1 = 0x0f;&delayms(1);
&//有键按下后,其中一列将变为低电平&i = P1^0x0f;&//判断按键发生在哪一列&switch(i)&{& &case 1: keyno = 0;&&case 2: keyno = 1;&&case 4: keyno = 2;&&case 8: keyno = 3;&&default: keyno = 16;&&&&&&&&& //无键按下&}
&//低四位置1,放入4列&P1 = 0xf0;&delayms(1);&//&i = P1 && 4 ^ 0x0f;
&//对0-3行分别附件起始值&& switch(i)&{& &case 1: keyno += 0;&&case 2: keyno += 4;&&case 4: keyno += 8;&&case 8: keyno += 12;&}
// 主函数void main(void){&P0 = 0x00;&while(1)&{& &P1 = 0xf0;&&if(P1 != 0xf0)&&& //扫描键盘获得按键序号&&{&& &key_scan();&&&&&&}&&if(pre_keyno != keyno)&&{&& &P0 = ~disp_buff[keyno];&&//显示,共阳极段码取反作为共阴极段码&&&pre_keyno =&&}&&delayms(100);&}}
3、在proteus中新建仿真文件ex70.dsn,电路原理图如下所示
4、将ex70.hex文件载入at89c51中,注意将晶振频率改为11.0592MHz,启动仿真,按动按键,观察运行结果。下图是某一时刻程序运行结果
喜欢该文的人也喜欢51单片机的4X4矩阵键盘的C语言程序
> 51单片机的4X4矩阵键盘的C语言程序
51单片机的4X4矩阵键盘的C语言程序
#include/////////////////////////////////////////数码管常量/////////////////////////////////////////////////////////unsigned charcode table[]={0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80,0x90}; //LED段码unsigned char code position[]={1,2,4,8}; //LED选位码 /////////////////////////////////////////延时函数////////////////////////////////////////////////////////////延时t毫秒/////////////////////////////////////////////////////////////////////////////////////////////////////////////////void delay_ms(unsigned char t){unsigned char t2=126;while(t--)while(t2--); }///////////////////////////// 数码管显示函数 ////////////////////////////////////////////////////////////////////////参数:待显示的数据///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void led_display(unsigned int dat ) { unsigned int dat1=dat000; //四位数码管只能显示到一千,此处用于防止溢出 P0=table[dat1/1000]|position[0];delay_ms(2);P0=table[(dat100)/100]|position[1];delay_ms(2);P0=table[dat10/10]|position[2];delay_ms(2); P0=table[(dat1)]|position[3];delay_ms(2); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////// 按键扫描函数 若有按键按下:返回 键值(1-16); 若没按键按下:返回 255 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// unsigned char getch ( ) { unsigned char X=0, Y=0, Z=0, k=255; P2=0 P2=0x0f; //先对P2置数 行扫描 if(P2!=0x0f) //判断是否有键按下 { //延时,软件去干扰 if(P2!=0x0f) //确认按键按下X = P2; { X=P2; //保存行扫描时有键按下时状态 P2=0xf0; //列扫描 Y=P2; //保存列扫描时有键按下时状态 Z=X|Y; //取出键值 switch ( Z ) //判断键值(那一个键按下) { case 0xee: k=0; //对键值赋值 case 0xde: k=1; case 0xbe: k=2; case 0x7e: k=3; case 0xed: k=4; case 0xdd: k=6; case 0xbd: k=7; case 0x7d: k=8; case 0xeb: k=9; case 0xdb: k=7; case 0xbb: k=10; case 0x7b: k=11; case 0xe7: k=12; case 0xd7: k=13; case 0xb7: k=14; case 0x77: k=15; } while(P2!=0xf0); } }
} void main() { unsigned char temp=0,key=255; while(1) { key=getch(); //扫描 if(key!=255)temp= //有按键按下 led_display(temp); //显示按键值 } }
分享给小伙伴们:
我来说两句……
微信公众号二
微信公众号一【图文】数码管显示矩阵键盘实验_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&10W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
数码管显示矩阵键盘实验
阅读已结束,下载本文到电脑
想免费下载本文?
登录百度文库,专享文档复制特权,积分每天免费拿!
你可能喜欢单片机4X4矩阵键盘 数码管显示的proteus仿真及源程序
查看数: 2719 | 评论数: 0 |
提示:支持键盘翻页&-左 右-&
Powered by}

我要回帖

更多关于 4x4矩阵 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信