綜合小實(shí)驗(yàn),完整的代碼,對(duì)前一段學(xué)習(xí)的總結(jié)。
模塊化編程去拼接實(shí)現(xiàn)自己想要的功能,一鍵多義用switch語(yǔ)句實(shí)現(xiàn)
延時(shí)函數(shù)
DelayXms.h
#ifndef __DELAYXMS_H__
#define __DELAYXMS_H__
#define u16 unsigned int //宏定義
#define u8 unsigned char//數(shù)據(jù)范圍0--255
void DelayXms(u16 xms);
#endif
DelayXms.c
/*****************************
功能:延時(shí)x毫秒
*****************************/
#include "DelayXms.h"
void DelayXms(u16 xms)
{
u16 i,j; //unsigned int 類(lèi)型的數(shù)據(jù)范圍0-65535
for(i=xms;i>0;i--){
for(j=124;j>0;j--);
}
}
共陰極數(shù)碼管底層顯示驅(qū)動(dòng)
display.h
#ifndef __DISPLAY_H__
#define __DISPLAY_H__
#include
#include "DelayXms.h"
#define GPIO_SEG P1 //段碼 IO
#define GPIO_BIT P3 //位選 IO
#define N 4 //數(shù)碼管的個(gè)數(shù)
extern u8 LEDBuf[];//外部引用申明(DisplayService.c會(huì)用到這個(gè)變量)
void Display();
#endif
display.c
#include "display.h"
u8 code leddata[]={ //共陰極數(shù)碼管的段碼表
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F, //0-9【下標(biāo)0-9】
0x77,0x7C,0x39,0x5E,0x79,0x71, // A-F【下標(biāo)10-15】
0x76,0x38,0x37,0x3e,0x73,0x5c,0x40,//h,l,n,u,p,o,-【下標(biāo)16-22】
0xff
};
u8 LEDBuf[]={23,23,23,23};//數(shù)據(jù)顯示緩沖區(qū),
u8 code BitCode[]={0xfe,0xfd,0xfb,0xf7};//位選控制信號(hào)
void Display()
{
/*靜態(tài)局部變量生命周期:程序結(jié)束為止
可以保持變量?jī)?nèi)容的持久性,函數(shù)調(diào)用結(jié)束時(shí)
變量的值仍在*/
static u8 i = 0;
//1.送段碼
GPIO_SEG = leddata[LEDBuf[i]];
//2.送位選
GPIO_BIT = BitCode[i];
//3.1ms<延時(shí)<10ms
DelayXms(9);
//4.消影
GPIO_SEG = 0x00;//不消影顯示會(huì)出問(wèn)題
i++;
if(N == i)//條件控制
i=0;
}
底層按鍵驅(qū)動(dòng)
Key.h
#ifndef __KEY_H__
#define __KEY_H__
#include
#include "DelayXms.h"
sbit key1 = P2^0;
sbit key2 = P2^1;
sbit key3 = P2^2;
sbit key4 = P2^3;
u8 Key_Scan();//按鍵掃描
#endif
Key.c
#include "Key.h"
u8 Key_Scan()
{
u8 KeyNum = 0;
key1 =1;key2=1;key3=1;key4=1;
if(!key1 || !key2 || !key3 ||!key4)//1.判斷是否有按鍵按下
{
DelayXms(10);//2.延時(shí)消抖 10ms
if(!key1 || !key2 || !key3 ||!key4)//3.再次判斷按鍵是否按下
{
if(!key1)
KeyNum = 1; //4.給按鍵開(kāi)關(guān)賦一個(gè)鍵值
if(!key2)
KeyNum = 2;
if(!key3)
KeyNum = 3;
if(!key4)
KeyNum = 4;
while(!key1 || !key2 || !key3 ||!key4);//5.松手等待
}
}
return KeyNum;
}
應(yīng)用層---顯示服務(wù)函數(shù)
DisplayService.h
#ifndef __DISPLAYSERVICE_H__
#define __DISPLAYSERVICE_H__
#include "Display.h"
extern u8 parm1 ; //外部引用聲明
extern u8 parm2 ;//KeyService.c會(huì)用到
extern u8 parm3 ;
extern u8 parm4 ;
extern u8 windowNum;//KeyService.c會(huì)用到
void DisplayService();
#endif
DisplayService.c
#include "DisplayService.h"
u8 parm1 = 11; //初始顯示的數(shù)據(jù)
u8 parm2 = 22;
u8 parm3 = 33;
u8 parm4 = 44;
u8 windowNum = 0;//窗口變量
void DisplayService()
{
switch(windowNum)
{
case 0:
LEDBuf[0] = 20;//底層顯示驅(qū)動(dòng)中段碼表中的下標(biāo)20 顯示字母P
LEDBuf[1] = 1;//顯示數(shù)字1
LEDBuf[2] = parm1/10;//顯示十位上的數(shù)據(jù)
LEDBuf[3] = parm1%10;//顯示個(gè)位上的數(shù)據(jù)
break;
case 1:
LEDBuf[0] = 20;
LEDBuf[1] = 2;
LEDBuf[2] = parm2/10;
LEDBuf[3] = parm2%10;
break;
case 2:
LEDBuf[0] = 20;
LEDBuf[1] = 3;
LEDBuf[2] = parm3/10;
LEDBuf[3] = parm3%10;
break;
case 3:
LEDBuf[0] = 20;
LEDBuf[1] = 4;
LEDBuf[2] = parm4/10;
LEDBuf[3] = parm4%10;
break;
default:
break;
}
}
應(yīng)用層--按鍵服務(wù)函數(shù)
KeyService.h
#ifndef __KEYSERVICE_H__
#define __KEYSERVICE_H__
#include "Key.h"
#include "Display.h"
#include "DisplayService.h"
void Key_Service();
#endif
KeyService.c
#include "KeyService.h"
void Key_Service()
{
switch(Key_Scan())
{
case 1: //按鍵key1選擇窗口,共4個(gè)窗口
windowNum++;//每按一下按鍵,窗口變量加1
if(windowNum>3) //條件控制
windowNum = 0;//最后一個(gè)窗口銜接到第一個(gè)窗口
break;
case 2: //按鍵key2對(duì)窗口中的數(shù)據(jù)執(zhí)行加1操作
switch(windowNum)//用switch語(yǔ)句判斷對(duì)第幾個(gè)窗口進(jìn)行操作
{
case 0: //第一個(gè)窗口中的數(shù)據(jù)
parm1++;
if(parm1 > 99)//只能顯示2位數(shù),超過(guò)99,需要置0
parm1 =0;
break;
case 1://第二個(gè)窗口中的數(shù)據(jù)
parm1++;
if(parm2 > 99)
parm2 =0;
break;
case 2: //第三個(gè)窗口中的數(shù)據(jù)
parm3++;
if(parm3 > 99)
parm3 =0;
break;
case 3://第四個(gè)窗口中的數(shù)據(jù)
parm4++;
if(parm4 > 99)
parm4 =0;
break;
default: break;
}
break;
case 3: //按鍵key3對(duì)窗口中的數(shù)據(jù)執(zhí)行減1操作
switch(windowNum)//用switch語(yǔ)句判斷對(duì)第幾個(gè)窗口進(jìn)行操作
{
case 0:
parm1--;
if(parm1 > 99)//變量parm范圍0-255,自減小于0會(huì)變成255
parm1 =99;
break;
case 1:
parm1--;
if(parm2 > 99)
parm2 =99;
break;
case 2:
parm3--;
if(parm3 > 99)
parm3 =99;
break;
case 3:
parm4--;
if(parm4 > 99)
parm4 =99;
break;
default: break;
}
break;
case 4: //按鍵key4對(duì)窗口中的數(shù)據(jù)置0
switch(windowNum)//用switch語(yǔ)句判斷對(duì)第幾個(gè)窗口進(jìn)行操作
{
case 0:
parm1=0;
break;
case 1:
parm2=0;
break;
case 2:
parm3=0;
break;
case 3:
parm4=0;
break;
default: break;
}
break;
default: break;
}
}
main函數(shù)
main.c
#include "KeyService.h"
void main()
{
u16 temp;
for(temp=0;temp<100;temp++)
{
Display();//上電顯示一段時(shí)間畫(huà)面
}
while(1)
{
DisplayService();
Key_Service();
Display();
}
}
-
Switch
+關(guān)注
關(guān)注
1文章
532瀏覽量
57927 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4235瀏覽量
61965 -
代碼
+關(guān)注
關(guān)注
30文章
4670瀏覽量
67764 -
按鍵控制
+關(guān)注
關(guān)注
1文章
44瀏覽量
8753
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論