文章目录
- 前言
- 一、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 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 sbit led0 =P1^0; sbit key0 =P2^0; unsigned char num=0; #define uchar unsigned char void delay( ) { uchar i,j; for(i=0; i4 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种灯的状态,自己可以用来测试一个按键控制多个流水灯的状态,需要注意,松手按键检测会导致程序阻塞,阻塞可能会引起一系列问题。具体问题要具体分析。