做5g網(wǎng)站空間容量要多少錢長尾詞在線挖掘
文章目錄
- 前言
- 一、5.3開關(guān)檢測
- 1.1沒按鍵按下的
- 1.2有按鍵按下的
- 二、改進
- 1.改進
- 三、獨立鍵盤
- 3.1為什么要取反
- 3.2 實用的按鍵
- 總結(jié)
前言
提示:這里可以添加本文要記錄的大概內(nèi)容:
課程需要:
提示:以下是本篇文章正文內(nèi)容,下面案例可供參考
一、5.3開關(guān)檢測
unsigned char temp; /*定義臨時變量temp*/P1=0xff; /* P1口低4位置1,作為輸入;高4位置1,發(fā)光二極管熄滅*/temp= P1&0xf0; /*讀P1口并屏蔽低4位,送臨時變量temp */temp = temp >>4; /* temp的內(nèi)容右移4位,P1口高4位狀態(tài)移至低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口讀入鍵盤狀態(tài)keyval=~ keyval; //鍵盤狀態(tài)求反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){ //燈1P3=0X00;}else if(num==1){//燈2P3=0X01;}else if(num==2){//燈3P3=0X02;}}
問題1:num 沒有清0 255 才自己變0很久,手動清0
while (1){if(key0==0){led0=0; num++; }else{ led0=1; }if(num==0){ //燈1P3=0X00;}else if(num==1){//燈2P3=0X01;}else if(num==2){//燈3P3=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){ //燈1P3=0X00;}else if(num==1){//燈2P3=0X01;}else if(num==2){//燈3P3=0X02;}else{num=0;}}
問題3: 按鍵松開燈不滅
led0=0; //將燈一直到循環(huán)上面while(key0==0);
#include <reg51.h>sbit led0 =P1^0;
sbit key0 =P2^0;unsigned char num=0;
#define uchar unsigned charvoid delay( )
{ uchar i,j;for(i=0; i<255; i++)for(j=0; j<255; j++);
}/*1111 1111
1111 00001111 0000 temp1110 0000
1111 0000
1110 0000 temp0000 1110 temp>>40000 1110 P1=temp1111 0000 1111 1110 P1=temp1111 1111 P1=0XFF*/void main( ) /*主函數(shù)*/
{while (1){if(key0==0) { delay();//按鍵消抖if(key0==0){led0=0; //將燈一直到循環(huán)上面while(key0==0); num++; }}else{led0=1; }if(num==0){ //燈1P3=0X00;}else if(num==1){//燈2P3=0X01;}else if(num==2){//燈3P3=0X02;}else{num=0;}}
}
總結(jié)
例5-3 程序優(yōu)化過程,每一個程序沒一步,如果你不清晰,就一步步帶數(shù)字進去計算,看狀態(tài)。一定要根據(jù)電路圖來。
增加了獨立鍵盤,一個按鍵控制 3種燈的狀態(tài),自己可以用來測試一個按鍵控制多個流水燈的狀態(tài),需要注意,松手按鍵檢測會導(dǎo)致程序阻塞,阻塞可能會引起一系列問題。具體問題要具體分析。