文章目录
- 前言
- 一、5.3开关检测
- 1.1没按键按下的
- 1.2有按键按下的
- 二、改进
- 1.改进
- 三、独立键盘
- 3.1为什么要取反
- 3.2 实用的按键
- 总结
前言
提示:这里可以添加本文要记录的大概内容:
课程需要:
提示:以下是本篇文章正文内容,下面案例可供参考
一、5.3开关检测
unsigned char temp; /*定义临时变量temp*/
P1=0xff; /* P1口低4位置1,作为输入;高4位置1,发光二极管熄灭*/
temp= P1&0xf0; /*读P1口并屏蔽低4位,送临时变量temp */
temp = temp >>4; /* temp的内容右移4位,P1口高4位状态移至低4位*/
P1= temp; /* 临时变量值写入P1口输出*/
// P1= 0XF0|(P1>>4); /* 临时变量值写入P1口输出*/
delay( );
1.1没按键按下的
1111 1111 P1: 1111 1111
1111 0000 temp:1111 0000
0000 1111 temp: 0000 1111
0000 1111 P1: 0000 1111
delay( );
1.2有按键按下的
xxxx 0000 -1111 中的可能
1111 1111 P1: 1111 1111
xxxx 0000 &1111 0000 temp:xxxx 0000
0000 xxxx temp: 0000 xxxx
0000 xxxx P1: 0000 xxxx
delay( );
二、改进
改进的思路
1.改进
代码如下(示例):
P1= 0XF0|(P1>>4); /* 临时变量值写入P1口输出*/
在这里插入代码片
三、独立键盘
有按键按下:读回来就是0
反之: 读回来就是1
3.1为什么要取反
#include<reg51.h>
void key_scan(void)
{
unsigned char keyval
do
{
P1=0xff; // P1口为输入
keyval=P1; //从P1口读入键盘状态
keyval=~ keyval; //键盘状态求反
switch(keyval)
{
case 1: ……; //处理按下的k1键,“……”为处理程序 break; //跳出switch语句
case 2: ……; //处理按下的k2键
break; //跳出switch语句
case 4: ……; //处理按下的k3键
break; //跳出switch语句
case 8: ……; //处理按下的k4键
break; //跳出switch语句
case 16: ……; //处理按下的k5键
break; //跳出switch语句
case 32: ……; //处理按下的k6键
break; //跳出switch语句
case 64: ……; //处理按下的k7键
break; //跳出switch语句
case 128: ……; //处理按下的k8键
break; //跳出switch语句
default:
break; //无按下键处理
}
}
while(1);
}
3.2 实用的按键
while (1)
{
if(key0==0)
{
led0=0;
num++;
}
else{
led0=1;
}
if(num==0){ //灯1
P3=0X00;
}
else if(num==1){//灯2
P3=0X01;
}
else if(num==2){//灯3
P3=0X02;
}
}
问题1:num 没有清0 255 才自己变0很久,手动清0
while (1)
{
if(key0==0)
{
led0=0;
num++;
}
else{
led0=1;
}
if(num==0){ //灯1
P3=0X00;
}
else if(num==1){//灯2
P3=0X01;
}
else if(num==2){//灯3
P3=0X02;
}
else
{
num=0;
}
}
问题2:按键还是不灵
while (1)
{
if(key0==0) {
delay();//按键消抖
if(key0==0)
{
while(key0==0);
led0=0;
num++;
}
else{
led0=1;
}
}
if(num==0){ //灯1
P3=0X00;
}
else if(num==1){//灯2
P3=0X01;
}
else if(num==2){//灯3
P3=0X02;
}
else{
num=0;
}
}
问题3: 按键松开灯不灭
led0=0; //将灯一直到循环上面
while(key0==0);
#include <reg51.h>
sbit led0 =P1^0;
sbit key0 =P2^0;
unsigned char num=0;
#define uchar unsigned char
void delay( )
{ uchar i,j;
for(i=0; i<255; i++)
for(j=0; j<255; j++);
}
/*
1111 1111
1111 0000
1111 0000 temp
1110 0000
1111 0000
1110 0000 temp
0000 1110 temp>>4
0000 1110 P1=temp
1111 0000
1111 1110 P1=temp
1111 1111 P1=0XFF
*/
void main( ) /*主函数*/
{
while (1)
{
if(key0==0) {
delay();//按键消抖
if(key0==0)
{
led0=0; //将灯一直到循环上面
while(key0==0);
num++;
}
}
else{
led0=1;
}
if(num==0){ //灯1
P3=0X00;
}
else if(num==1){//灯2
P3=0X01;
}
else if(num==2){//灯3
P3=0X02;
}
else{
num=0;
}
}
}
总结
例5-3 程序优化过程,每一个程序没一步,如果你不清晰,就一步步带数字进去计算,看状态。一定要根据电路图来。
增加了独立键盘,一个按键控制 3种灯的状态,自己可以用来测试一个按键控制多个流水灯的状态,需要注意,松手按键检测会导致程序阻塞,阻塞可能会引起一系列问题。具体问题要具体分析。