1.上一講的代碼
#include <reg52.h> sbit ADDR2 = P1^2; sbit ADDR1 = P1^1; sbit ADDR0 = P1^0; sbit ENLED = P1^4; sbit ADDR3 = P1^3; sbit BEEP = P1^6; sbit KEY13 = P2^4; sbit KEY14 = P2^5; sbit KEY15 = P2^6; #define TIMES 300 //此例程的主循環(huán)里循環(huán)一次所要花費(fèi)的時(shí)間比以往的例程要多,所以按鍵的times判斷需要減少到300,不然還是500的話(huà)需要我們長(zhǎng)按住一段時(shí)間才會(huì)響應(yīng)功能代碼 unsigned char code LedChar[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//數(shù)碼管狀態(tài)值初始化 unsigned char LedBuff[6]={0xFF, 0xFF, 0xBF, 0xBF, 0xFF, 0xFF};//初始化數(shù)碼管顯示緩存區(qū) unsigned char man=30,woman=30;//初始化男人和女人的錢(qián) void UPDATE_LED()//更新數(shù)碼管顯示緩存區(qū) { LedBuff[5]=LedChar[man/10]; LedBuff[4]=LedChar[man%10]; LedBuff[1]=LedChar[woman/10]; LedBuff[0]=LedChar[woman%10]; } void SEG_task()//數(shù)碼管顯示函數(shù) { static unsigned char i=0; P0=0xFF;//端口狀態(tài)全部熄滅數(shù)碼管里的LED達(dá)到刷新作用 switch(i) { case 0: ADDR2 = 0;ADDR1 = 0;ADDR0 = 0;P0=LedBuff[0];i++;break; case 1: ADDR2 = 0;ADDR1 = 0;ADDR0 = 1;P0=LedBuff[1];i++;break; case 2: ADDR2 = 0;ADDR1 = 1;ADDR0 = 0;P0=LedBuff[2];i++;break; case 3: ADDR2 = 0;ADDR1 = 1;ADDR0 = 1;P0=LedBuff[3];i++;break; case 4: ADDR2 = 1;ADDR1 = 0;ADDR0 = 0;P0=LedBuff[4];i++;break; case 5: ADDR2 = 1;ADDR1 = 0;ADDR0 = 1;P0=LedBuff[5];i=0;break; } } void KEY13_task() { static unsigned char key_up=1; static unsigned int times=0; //用來(lái)記錄進(jìn)入過(guò)按鍵判斷語(yǔ)句的次數(shù) if(key_up==0) { times++; if(times>=TIMES&&KEY13==1) { times=0; man+=3; //男人的錢(qián)加3塊 woman-=3; //女人的錢(qián)減3塊 UPDATE_LED();//更新數(shù)碼管顯示緩存區(qū) } } key_up=KEY13; } void KEY14_task() { static unsigned char key_up=1; static unsigned int times=0; //用來(lái)記錄進(jìn)入過(guò)按鍵判斷語(yǔ)句的次數(shù) if(key_up==0) { times++; if(times>=TIMES&&KEY14==1) { times=0; man+=1; //男人的錢(qián)加1塊 woman-=1; //女人的錢(qián)減1塊 UPDATE_LED();//更新數(shù)碼管顯示緩存區(qū) } } key_up=KEY14; } void KEY15_task() { static unsigned char key_up=1; static unsigned int times=0; //用來(lái)記錄進(jìn)入過(guò)按鍵判斷語(yǔ)句的次數(shù) if(key_up==0) { times++; if(times>=TIMES&&KEY15==1) { times=0; man-=2; //男人的錢(qián)減2塊 woman+=2; //女人的錢(qián)加2塊 UPDATE_LED();//更新數(shù)碼管顯示緩存區(qū) } } key_up=KEY15; } void BEEP_ON(unsigned char x) { unsigned int i,time; for(time=0;time<2000;time++)//“time<2000”決定鳴叫的時(shí)間 { if(x==1)BEEP=!BEEP; else BEEP=0; for(i=0;i<30;i++); } } void main() { unsigned int i,x;//做循環(huán)和延時(shí)用 ADDR3 = 1;//使能三八譯碼器 ENLED = 0;// P2 = 0xFE;//讓K13,K14,K15能具備有被拉低的條件先 UPDATE_LED();//更新數(shù)碼管顯示緩存區(qū) while(1) { SEG_task(); //數(shù)碼管顯示函數(shù) KEY13_task();//K13按鍵的任務(wù) KEY14_task();//K14按鍵的任務(wù) KEY15_task();//K15按鍵的任務(wù) if(man>=45 || woman>=45)//只要其中一方的錢(qián)到達(dá)45塊及以上就結(jié)束游戲,程序進(jìn)入死循環(huán) { if(man>=45){LedBuff[1]=0xFF; LedBuff[0]=0xFF;}//不再顯示女人的錢(qián) else {LedBuff[5]=0xFF; LedBuff[4]=0xFF;} //不再顯示男人的錢(qián) while(1) { P0=0xFF; //熄滅所有數(shù)碼管 BEEP_ON(1); //蜂鳴器鳴叫一段時(shí)間 for(i=0;i<300;i++) //讓數(shù)碼管顯示一段時(shí)間 { SEG_task(); for(x=0;x<200;x++);//加此延時(shí)是為了讓數(shù)碼管顯示亮一點(diǎn),不然僅讓“SEG_task();”循環(huán),顯示就會(huì)暗一些 } } } } }
“man+=3;”就是“man= man+3;”的簡(jiǎn)化書(shū)寫(xiě)。
2.感言
我們現(xiàn)在是模塊化編程了,在了解了美女與男人的游戲題目后,閱讀主函數(shù)都清晰明朗很多。
這個(gè)題目的要求就像是全國(guó)電子設(shè)計(jì)競(jìng)賽一樣,需要我們一步一步地完成每個(gè)模塊功能,包括以后做產(chǎn)品項(xiàng)目,模塊化編程是為了靈活運(yùn)用和增加可讀性,以后在做其他項(xiàng)目時(shí)遇到相似的要求我們拿來(lái)主義即可,維護(hù)起來(lái)也方便,但大家都需要習(xí)慣寫(xiě)很詳細(xì)的注釋才行。
在本講代碼的基礎(chǔ)上其實(shí)也可以簡(jiǎn)單地改寫(xiě)成一個(gè)籃球簡(jiǎn)易計(jì)分器的功能,如果大家能自己實(shí)現(xiàn)的出來(lái),以后去打球拿塊開(kāi)發(fā)板去計(jì)分也可騙騙一些不懂的同學(xué),認(rèn)為這是很高大上的玩意。
C語(yǔ)言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競(jìng)賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點(diǎn)擊了解:
一點(diǎn)編程也不會(huì)寫(xiě)的:零基礎(chǔ)C語(yǔ)言學(xué)練課程
解決困擾你多年的C語(yǔ)言疑難雜癥特性的C語(yǔ)言進(jìn)階課程
從零到寫(xiě)出一個(gè)爬蟲(chóng)的Python編程課程
只會(huì)語(yǔ)法寫(xiě)不出代碼?手把手帶你寫(xiě)100個(gè)編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競(jìng)賽課入門(mén)課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程