一、独立键盘输入
使用到C语言中的if语句,键盘输入检测方法,轮询法
按键电路图(查找串口,命名)
记得在头文件中,将各个引脚命名好
P3引脚属于自己在头文件bstv51.h中进行位定义
sbit k1=P3^4; sbit k2=P3^5; sbit k3=P3^6; sbit k4=P3^7;
独立键盘
#include <reg52.h>
#include"bstv51.h"
void main()
{
bstv51_init(); //开发板初始化函数
while(1)
{
if(k1==0)//判断是否为0(低电平),低就是已经按下 (按下为低电平---0)
{
L0=0; //若是 ,点灯L0
}
else
{
L0=1;
}
}
}
改进(有进行防抖动的判断)
#include <reg52.h>
#include"bstv51.h"
void delay(uint x) //延迟函数,用来等会判断抖动
{
int i,j;
for(i=x;i>0;i--)
for(j=112;j>0;j--)
;
}
void main()
{
bstv51_init();//初始化板
while(1)
{
if(k2==0)//判断是否按下
{
delay(5); //进行延迟,抖动判断(一般为5-10ms)
if(k2==0) //延迟后确实的确按下,就执行亮灯的操作
{
L0=~L0; //此处采用了【~】反转。
//即按下进行一次亮灯/灭灯的操作,再次按下进行的操作与上一次相反
}
}
if(k3==0)//判断是否按下k1
{
delay(5); //进行延迟,防抖动
if(k3==0) //确认还是按下,就执行亮灯的操作
{
L2=~L2;
}
}
}
}
二,矩阵键盘输入(单片机入门重点)
如果使用3x3矩阵,需要6个I/O口;使用4x4矩阵,需要8个I/O口,使用5x5矩阵,需要10个I/O口
、
位运算不改变参与运算的变量的值,要改变值就要进行赋值操作。
【位与—&】【逻辑与—&&】
【位或—|】【逻辑或—||】
逻辑运算结果就只有0和1
位运算是8位二进制进行运算,结果也是8位二进制
任何数与上零等于零,任何数与上1等于它本身。&
任何数或上1等于1,任何数或上0等于它本身。 |
{eg. P0=P0&0xfe 结果就是1111 1110 (0xfe=1111 1110)}
思路:1使用数组对数码管的字型码进行输入
2延迟函数防抖动
3数码管显示函数(段选,位选,使能端)
4按键扫描函数
//矩阵键盘 第一列的使用
#include<reg52.h>
#include"bstv51.h"
uchar code s[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
void delay(uint x)
{
uint i,j;
for(i=x;i>0;i--)
for(j=112;j>0;j--) ;
}
void display(uchar n)//数码管显示函数,段选,具体显示的东西
{
P0=s[n];
DU=1;
DU=0; //锁存芯片
}
void sm() //按键扫描函数
{
uchar t,k;
P3=0xfe;//0xfe=1111 11110;要第一口P3^0输出为0.低电平
t=P3;//读取串口数据
t=t&0xf0;//{利用位与}0xf0=1111 0000,主要是判断前四位的状态,1与任何数=任何数本身,同时屏蔽后四位,0与任何数=0
if(t!=0xf0) //判断四个输出端口都不等于1,即没有有按键按下
{ //如果被按下,执行下面的内容
delay(5); //进行防抖
t=P3; //把读到的端口值重新拿来判断
t=t&0xf0; //进行同样的屏蔽操作
if(t!=0xf0) //确认真的按下
{
t=P3; //读值,再次进行判断,存在t这个变量里面
switch(t)
{
case 0xee:k=0;break;//1110 1110
case 0xde:k=1;break;//1101 1110
case 0xbe:k=2;break;//1011 1110
case 0x7e:k=3;break;//0111 1110
}
while(t!=0xf0)//进行判断按键是否松开按键,=0xfe/1111 1110就是松开的时候以及同样的屏蔽操作
{ //一旦松开,就=fe了,执行操作
t=P3;
t=t&0xf0;
}
display(k);
}
}
}
void main()
{
bstv51_init(); //初始化开发板
P0=0; //数码管 位选
WE=1;
WE=0;
while(1)
{
sm();
}
}