最后這一講沒什么知識(shí)點(diǎn)講解,我們將前面的七講內(nèi)容集合成最后完整的function文件,以便后面大家弄亂了這兩個(gè)文件的內(nèi)容好過來這里復(fù)制粘貼回去。
1.function.c最終代碼
#include <reg52.h> #include <function.h> u8 code LedChar[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//數(shù)碼管狀態(tài)值初始化 u8 LedBuff[6]={0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};//初始化數(shù)碼管顯示緩存區(qū) void delay_ms(u16 x) { u16 i,j; if(x==1000) { for(i=0;i<19601;i++)//延時(shí)1s { for(j=5;j>0;j--); } } else while(x--)for(j=115;j>0;j--); } void LED_Init() { P1|=0x0E;//讓P1.1,P1.2,P1.3強(qiáng)制輸出1 P1&=0xEE;//讓P1.0和P1.4強(qiáng)制輸出0 } void KEY_Init() { P2=0X7F;//讓P2.7輸出低電平,其他輸出高電平,這樣就可以使能4個(gè)按鍵了 } u8 KEY_Scan(u8 mode,u16 TIMES) { static u8 key_up=1; //按鍵松開標(biāo)志 static u16 times; if(mode)key_up=1; //如果mode等于1,支持連按 if(key_up&&(KEY4==0||KEY8==0||KEY12==0||KEY16==0))//只要在key_up等于1時(shí),其中一個(gè)按鍵被按下就可以進(jìn)入執(zhí)行代碼 { times++; //記錄進(jìn)入低電平的時(shí)間 if(times>=TIMES)//抖動(dòng)的時(shí)間已經(jīng)過去 { times=0; key_up=0; if(KEY4==0)return 4; else if(KEY8==0)return 8; else if(KEY12==0)return 12; else if(KEY16==0)return 16; } } else if(KEY4==1&&KEY8==1&&KEY12==1&&KEY16==1)key_up=1; return 0;// 無按鍵按下 } void SEG_Scan() { static u8 i = 0; P0 = 0xFF; //端口狀態(tài)全部熄滅數(shù)碼管里的LED達(dá)到刷新作用 P1 = (P1 & 0xF8) | i; //i等于0時(shí),就是“ADDR2=0; ADDR1=0; ADDR0=0;”,i等于1時(shí),就是“ADDR2=0; ADDR1=0; ADDR0=1;”,以此類推 P0 = LedBuff[i]; //6個(gè)緩沖區(qū)的值輪流賦給P0 i++; if(i>=6)i=0; //讓i在0~5之間循環(huán)變化 } void ShowNumber(u32 num) { char i;//取值范圍-128~127 u8 buf[6]; for (i=0; i<6; i++) //把長整型數(shù)轉(zhuǎn)換為6位十進(jìn)制的數(shù)組 { buf[i] = num % 10; num = num / 10; //舍掉個(gè)位數(shù),重新裝載 } for (i=5; i>=1; i--) //從最高位起,遇到0填充不顯示的代碼,遇到非0則退出循環(huán) { if (buf[i] == 0) LedBuff[i] = 0xFF; else break; } for ( ; i>=0; i--) //剩余低位都如實(shí)轉(zhuǎn)換為數(shù)碼管顯示字符 { LedBuff[i] = LedChar[buf[i]]; } }
2.function.h最終代碼
#ifndef __FUNCTION_H__ #define __FUNCTION_H__ sbit BEEP = P1^6; sbit KEY4 = P2^3; sbit KEY8 = P2^2; sbit KEY12 = P2^1; sbit KEY16 = P2^0; sbit LED2 = P0^0; sbit LED3 = P0^1; sbit LED4 = P0^2; sbit LED5 = P0^3; sbit LED6 = P0^4; sbit LED7 = P0^5; sbit LED8 = P0^6; sbit LED9 = P0^7; typedef unsigned char u8; //對數(shù)據(jù)類型進(jìn)行聲明定義 typedef unsigned int u16; typedef unsigned long u32; extern u8 LedBuff[6]; //對數(shù)碼管緩存區(qū)進(jìn)行外部聲明 extern u8 code LedChar[16];//對數(shù)碼管真值表進(jìn)行外部聲明 //只要在“function.c”文件中封裝有的函數(shù)都需要在頭文件中聲明一下 void delay_ms(u16 x); void LED_Init(); void KEY_Init(); u8 KEY_Scan(u8 mode,u16 TIMES); void SEG_Scan(); void ShowNumber(u32 num); #endif
3.本講的main.c測試代碼
#include <reg52.h> #include <function.h> void main() { u8 key;//用來讀取按鍵動(dòng)作的返回值 u8 beep_ok=0;//定義標(biāo)志蜂鳴器允許鳴叫的變量,為1時(shí)可以鳴叫,為0時(shí)不能鳴叫 u8 x; u32 NUM=10086; LED_Init();//初始化LED硬件模塊 KEY_Init();//初始化按鍵模塊 ShowNumber(NUM);//更新數(shù)碼管緩存區(qū)內(nèi)容 while(1) { SEG_Scan(); key=KEY_Scan(0,700); //不支持連按模式,判斷閾值為700 if(key==4){NUM++;ShowNumber(NUM);} //K4使NUM自加 if(key==12){NUM--;ShowNumber(NUM);} //K12使NUM自減 if(key==8)beep_ok=1; //K8開啟蜂鳴器鳴叫 if(key==16)beep_ok=0; //K16關(guān)閉蜂鳴器鳴叫 if(beep_ok==1) { x++; } else x=0; if(x>=3) { x=0; BEEP=!BEEP; } } }
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點(diǎn)擊了解:
一點(diǎn)編程也不會(huì)寫的:零基礎(chǔ)C語言學(xué)練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進(jìn)階課程
從零到寫出一個(gè)爬蟲的Python編程課程
只會(huì)語法寫不出代碼?手把手帶你寫100個(gè)編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競賽課入門課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程