在上一講的代碼中我們可以不用寫“sbit GND = P2^3;”,像宋老師那樣直接在開頭“P2 = 0xF7;”僅讓P2.3輸出0其他輸出1即可,這樣P2.7就有被拉低的條件了。
1.趁熱打鐵
沿襲上一講的功能,我們新學的按鍵知識需要結合所學過的無源蜂鳴器硬件一起搗鼓玩玩。同上一講的代碼功能一樣,這次用的是無源蜂鳴器,按鍵按下時,蜂鳴器就響,松開不按時就不響。
2.分析
我們先縷縷思路,顯然無源蜂鳴器要想鳴叫,就不能像“LED2=KEY4;”這樣賦值的方式。我們已經知道,在P2.3輸出低電平的情況下,K4按下的時候程序中KEY4就等于0,松開不按時KEY4等于1。
這里可以在主函數(shù)中的死循環(huán)里用“if(KEY4==0)”來一直等待K4被按下,于是KEY4的值等于0才能進入if語句的大括號里去執(zhí)行程序。不按下時“KEY4等于1”也就進入不了里面去執(zhí)行程序了,CPU只能空循環(huán)不做任何事。
那這個if 語句的大括號里的內容大家也就明白需要做什么事了
#include <reg52.h> sbit BEEP = P1^6; sbit KEY4 = P2^7; void main() { unsigned int i; P2 = 0xF7;//讓K4能具備有被拉低的條件先 while(1) { if(KEY4==0) { BEEP=!BEEP; for(i=0;i<25;i++);//不同時間的延時鳴叫的音調不同 } } }
如果按鍵一直按著不放,那這個代碼跟第二章第二講里的例程可以說是一模一樣了。
3.鞏固
小燈和無源蜂鳴器都上場了,數(shù)碼管也不能一邊愣著吧,這里筆者給大家提供一段代碼,自行下載進去后按著K4不放,觀察現(xiàn)象然后嘗試解析代碼的原理,能力有限分析不出來也不必擔心,繼續(xù)往下學先。
#include <reg52.h> sbit ADDR2 = P1^2; sbit ADDR1 = P1^1; sbit ADDR0 = P1^0; sbit ENLED = P1^4; sbit ADDR3 = P1^3; sbit KEY4 = P2^7; unsigned char code LedChar[6]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF};//a,b,c,d,e,f段單獨亮的真值表 void delay_ms(unsigned int x) { unsigned int i,j; if(x==1000) { for(i=0;i<19601;i++)//延時1s { for(j=5;j>0;j--); } } else while(x--)for(j=115;j>0;j--); } void IO0_OUT() {ADDR2 = 0;ADDR1 = 0;ADDR0 = 0;} void IO1_OUT() {ADDR2 = 0;ADDR1 = 0;ADDR0 = 1;} void IO2_OUT() {ADDR2 = 0;ADDR1 = 1;ADDR0 = 0;} void IO3_OUT() {ADDR2 = 0;ADDR1 = 1;ADDR0 = 1;} void IO4_OUT() {ADDR2 = 1;ADDR1 = 0;ADDR0 = 0;} void IO5_OUT() {ADDR2 = 1;ADDR1 = 0;ADDR0 = 1;} void main() { unsigned char i=0; ADDR3 = 1;//使能三八譯碼器 ENLED = 0;// P2 = 0xF7;//讓K4能具備有被拉低的條件先 while(1) { P0=0xFF; switch(i) { case 0: IO0_OUT();P0=LedChar[0];break; case 1: IO0_OUT();P0=LedChar[1];break; case 2: IO0_OUT();P0=LedChar[2];break; case 3: IO0_OUT();P0=LedChar[3];break; case 4: IO1_OUT();P0=LedChar[3];break; case 5: IO2_OUT();P0=LedChar[3];break; case 6: IO3_OUT();P0=LedChar[3];break; case 7: IO4_OUT();P0=LedChar[3];break; case 8: IO5_OUT();P0=LedChar[3];break; case 9: IO5_OUT();P0=LedChar[4];break; case 10:IO5_OUT();P0=LedChar[5];break; case 11:IO5_OUT();P0=LedChar[0];break; case 12:IO4_OUT();P0=LedChar[0];break; case 13:IO3_OUT();P0=LedChar[0];break; case 14:IO2_OUT();P0=LedChar[0];break; case 15:IO1_OUT();P0=LedChar[0];break; } if(KEY4==0)i++; if(i>=16)i=0; delay_ms(30); } }
C語言網提供由在職研發(fā)工程師或ACM藍橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習題和答疑,點擊了解:
一點編程也不會寫的:零基礎C語言學練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進階課程
從零到寫出一個爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個編程真題的編程百練課程
信息學奧賽或C++選手的 必學C++課程
藍橋杯ACM、信息學奧賽的必學課程:算法競賽課入門課程
手把手講解近五年真題的藍橋杯輔導課程