标题:
单片机4*4矩阵键盘扫描做的表决器与计算器源码
[打印本页]
作者:
999994
时间:
2018-9-12 20:06
标题:
单片机4*4矩阵键盘扫描做的表决器与计算器源码
表决器是用1602液晶显示的,基于51单片机和矩阵按键,计算器是用数码管显示的
4*4矩阵键盘扫描方法一:
逐行扫描:我们可以通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一个按键被按下。
方法二:
行列扫描:我们可以通过高四位全部输出低电平,低四位输出高电平。当接收到的数据,低四位不全为高电平时,说明有按键按下,然后通过接收的数据值,判断是哪一列有按键按下,然后再反过来,高四位输出高电平,低四位输出低电平,然后根据接收到的高四位的值判断是那一行有按键按下,这样就能够确定是哪一个按键按下了。
0.png
(6.1 KB, 下载次数: 22)
下载附件
2018-9-13 00:42 上传
ppt课件:
0.jpg
(68.33 KB, 下载次数: 19)
下载附件
2018-9-13 00:42 上传
表决器单片机源程序如下:
/**********************BST-M51实验开发板例程************************
* 平台:BST-M51 + Keil U4 + STC89C52
* 名称:表决器
* 公司:深圳市亚博软件开发有限公司
* 日期:2012-8-12
* 晶振:11.0592MHZ
******************************************************************
程序功能:表决器,模拟三位评委的表决,并做出判断,将结果显示于1602上。
共用到薄膜键盘上的“1,2,4,5,7,8,*”
其中“*”为清零键,对1602进行清屏和对相关变量清零。
每位评委操控两个按键,分别代表“通过”和“不通过”。
第一位评委控制“1”(通过)与“2”(不通过);
第二位评委控制“3”(通过)与“4”(不通过);
第三位评委控制“5”(通过)与“6”(不通过);
当按“通过”次数多于“不通过”时,1602将显示“yes”,否则显示“no”。
在一个回合中,每位评委只有一次按键的权利,一旦按下,其操控的两个
按键均将被封锁,再按也不会有任何作用。除非按下清零键“*”清零后开始下一回合。
************************************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P1^0;
sbit rw=P1^1;
sbit beep=P2^3;
sbit lcden=P2^5;
bit ok1,ok2,ok3,clear;
uchar pass,nopass,temp;
uchar table[]="yes";
uchar table1[]="no";
uchar table2[]="agree";
uchar table3[]="disagree";
uchar table4[]=" ";
uchar table5[]=" ";
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{
rs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date)
{
rs=1;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()
{
rw=0;
write_com(0x38);
delay(20);
write_com(0x0c);
delay(20);
write_com(0x06);
delay(20);
write_com(0x01);
delay(20);
}
void yes()
{
uchar a;
write_com(0x80+12);
delay(20);
for(a=0;a<3;a++)
{
write_date(table[a]);
delay(20);
}
}
void no()
{
uchar a;
write_com(0x80+0x40+12);
delay(20);
for(a=0;a<2;a++)
{
write_date(table1[a]);
delay(20);
}
}
void agree()
{
uchar a;
write_com(0x80);
delay(20);
for(a=0;a<5;a++)
{
write_date(table2[a]);
delay(20);
}
}
void disagree()
{
uchar a;
write_com(0x80+0x40);
delay(20);
for(a=0;a<8;a++)
{
write_date(table3[a]);
delay(20);
}
}
void keyscan()
{
if(!ok1)
{
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee: //1110 1110 "1"被按下
pass++;
ok1=1; //一号评委已判决。
break;
case 0xde: //1101 1110 "2"被按下
nopass++;
ok1=1;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
}
if(!ok2)
{
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed: //1110 1101 "4"被按下
pass++;
ok2=1;
break;
case 0xdd: //1101 1101 "5"被按下
nopass++;
ok2=1;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
}
if(!ok3)
{
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb: //1110 1011 "7"被按下
pass++;
ok3=1;
break;
case 0xdb: //1101 1011 "8"被按下
nopass++;
ok3=1;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7: //1110 0111 "*"被按下
clear=1;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
}
void main()
{
uchar a,b;
init();
while(1)
{
agree();
disagree();
keyscan();
if(pass||nopass)
{
write_com(0x80+10);
delay(20);
write_date(0x30+pass);
write_com(0x80+0x40+10);
delay(20);
write_date(0x30+nopass);
}
a=pass+nopass;
if(a==3)
{
if(pass>nopass)
yes();
if(pass<nopass)
no();
}
if(clear)
{
ok1=0; ok2=0; ok3=0;
pass=0; nopass=0; clear=0; a=0;
agree();
disagree();
write_com(0x80+10);
delay(20);
write_date(0x30+pass);
write_com(0x80+0x40+10);
delay(20);
write_date(0x30+nopass);
write_com(0x80+12);
for(b=0;b<3;b++)
{
write_date(table4[b]);
delay(20);
}
write_com(0x80+0x40+12);
for(b=0;b<2;b++)
{
write_date(table5[b]);
delay(20);
}
}
}
}
复制代码
单片机源程序如下:
/**********************BST-M51实验开发板例程**************
* 平台:BST-M51 + Keil U4 + STC89C52
* 名称:矩阵键盘扫描 数码管显示
* 公司:深圳市亚博软件开发有限公司
* 日期:2015-7
* 晶振:11.0592MHZ
*实验效果 :按4*4矩阵按键,数码管4位依次显示1,2,3,A,
4,5,6,B,
7,8,9,C,
E,0,F,D
*********************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[17]={0x3f , 0x06 , 0x5b ,0x4f , 0x66 , 0x6d ,0x7d ,
0x07 , 0x7f , 0x6f ,0x77 , 0x7c , 0x39 ,
0x5e , 0x79 , 0x71 , 0x00}; //0-9&A-F&“不显示” 字型码
void delay(uint xms) //延迟xms
{
uint i,j;
for(i=xms;i>0;i--)
for(j=112;j>0;j--);
}
void display(uchar num) //数码管显示函数
{
P0=table[num]; //段选
}
void keyscan4x4()
{
uchar temp,key;
///////////////第一行扫描///////////////////
P3=0xfe;//1111 1110 让P3.0口输出低
temp=P3;
temp=temp&0xf0;//1111 0000 位与操作 屏蔽后四位
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee: //1110 1110 "1"被按下
key=1;
break;
case 0xde: //1101 1110 "2"被按下
key=2;
break;
case 0xbe: //1011 1110 "3"被按下
key=3;
break;
case 0x7e: //0111 1110 "A"被按下
key=10;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
///////////////第二行扫描///////////////////
P3=0xfd;//1111 1101 让P3.1口输出低
temp=P3;
temp=temp&0xf0;//1111 0000 位与操作 屏蔽后四位
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed: //1110 1101 "4"被按下
key=4;
break;
case 0xdd: //1101 1101 "5"被按下
key=5;
break;
case 0xbd: //1011 1101 "6"被按下
key=6;
break;
case 0x7d: //0111 1101 "B"被按下
key=11;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
///////////////第三行扫描///////////////////
P3=0xfb;//1111 1011 让P3.2口输出低
temp=P3;
temp=temp&0xf0;//1111 0000 位与操作 屏蔽后四位
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb: //1110 1011 "7"被按下
key=7;
break;
case 0xdb: //1101 1011 "8"被按下
key=8;
break;
case 0xbb: //1011 1011 "9"被按下
key=9;
break;
case 0x7b: //0111 1011 "C"被按下
key=12;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
///////////////第四行扫描///////////////////
P3=0xf7;//1111 0111 让P3.0口输出低
temp=P3;
temp=temp&0xf0;//1111 0000 位与操作 屏蔽后四位
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7: //1110 0111 "*"被按下
key=14;
break;
case 0xd7: //1101 0111 "0"被按下
key=0;
break;
case 0xb7: //1011 0111 "#"被按下
key=15;
break;
case 0x77: //0111 0111 "D"被按下
key=13;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
}
void main()
{
P2 = P2 | 0xf0; //位选 锁存为4位同时显示
while(1)
{
keyscan4x4();
}
}
复制代码
所有资料51hei提供下载:
矩阵键盘扫描.zip
(4.68 MB, 下载次数: 29)
2018-9-12 20:06 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
admin
时间:
2018-9-13 00:46
补全原理图或者详细说明一下电路连接即可获得100+黑币
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1