綜合小實(shí)驗(yàn),完整的代碼,對(duì)前一段學(xué)習(xí)的總結(jié)。
模塊化編程去拼接實(shí)現(xiàn)自己想要的功能,一鍵多義用switch語句實(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 類型的數(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ì)出問題
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.給按鍵開關(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語句判斷對(duì)第幾個(gè)窗口進(jìn)行操作
{
case 0: //第一個(gè)窗口中的數(shù)據(jù)
parm1++;
if(parm1 > 99)//只能顯示2位數(shù),超過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語句判斷對(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語句判斷對(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í)間畫面
}
while(1)
{
DisplayService();
Key_Service();
Display();
}
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。
舉報(bào)投訴
-
Switch
+關(guān)注
關(guān)注
1文章
533瀏覽量
58279 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4333瀏覽量
62696 -
代碼
+關(guān)注
關(guān)注
30文章
4791瀏覽量
68693 -
按鍵控制
+關(guān)注
關(guān)注
1文章
44瀏覽量
8807
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
emwin窗口之間的消息傳遞方法
轉(zhuǎn)一個(gè)經(jīng)驗(yàn)主要有三種方法:函數(shù)WM_SendMessageNoPara此函數(shù)用于將不帶參數(shù)的消息發(fā)送到指定窗口,通過此函數(shù)可以實(shí)現(xiàn)不同窗口之間的消息傳遞。函數(shù)WM_SendMessag
發(fā)表于 04-22 11:30
你都知道STM32按鍵控制led的方法有哪些嗎
按鍵控制led(有鎖存)第4種方式實(shí)現(xiàn)按鍵控制led(有鎖存,在2個(gè)LED上顯示二進(jìn)制加法)楊桃32學(xué)習(xí)筆記,本文圖片文字皆為轉(zhuǎn)述回顧按鍵電
發(fā)表于 08-24 06:47
按鍵控制外部中斷實(shí)現(xiàn)LED亮滅的方法
一,按鍵控制外部中斷實(shí)現(xiàn)LED亮滅開機(jī)使得P1.0管腳的LED亮按下按鍵使得LED呈現(xiàn)“常亮”,“滅”,“閃爍”的三個(gè)狀態(tài)循環(huán)顯示。設(shè)計(jì)思路:在程序初始化時(shí)直接將P1.0置位為高電平,
發(fā)表于 12-06 08:19
STM32按鍵控制小車代碼
好用的stm32小車代碼,STM32按鍵控制小車代碼,STM32按鍵控制小車代碼,STM32按鍵控制小車代碼,STM32按鍵控制小車代碼
發(fā)表于 06-08 16:28
?49次下載
按鍵控制單個(gè)數(shù)碼管顯示
19-按鍵控制單個(gè)數(shù)碼管顯示----------51單片機(jī)源程序 用keil直接打開
發(fā)表于 06-16 15:36
?34次下載
fpga按鍵控制數(shù)碼管顯示
本文主要介紹了fpga按鍵控制數(shù)碼管顯示程序設(shè)計(jì)。數(shù)碼管是由多個(gè)發(fā)光二極管封裝在一起組成“8”字型的器件,引線已在內(nèi)部連接完成,只需引出它們的各個(gè)筆劃,公共電極。下面我們來了解一下按鍵控制數(shù)碼管
發(fā)表于 01-16 16:19
?1.7w次閱讀
FPGA入門系列實(shí)驗(yàn)教程之按鍵控制LED亮滅的詳細(xì)資料說明
實(shí)現(xiàn)按鍵控制LED亮滅。通過這個(gè)實(shí)驗(yàn),掌握采用Verilog HDL語言編程實(shí)現(xiàn)按鍵控制LED亮滅方法。
發(fā)表于 06-11 16:50
?31次下載
使用Arduino實(shí)現(xiàn)按鍵控制LED實(shí)驗(yàn)的例程免費(fèi)下載
本文檔的主要內(nèi)容詳細(xì)介紹的是使用Arduino實(shí)現(xiàn)按鍵控制LED實(shí)驗(yàn)的例程免費(fèi)下載。
發(fā)表于 12-01 17:47
?19次下載
HT32F5232學(xué)習(xí)之四種方法實(shí)現(xiàn)按鍵控制LED燈
HT32F5232學(xué)習(xí)之四種方法實(shí)現(xiàn)按鍵控制LED燈
發(fā)表于 11-29 16:51
?11次下載
STM32實(shí)現(xiàn)按鍵控制繼電器
學(xué)習(xí)目標(biāo): 通過上次學(xué)習(xí)的按鍵控制的知識(shí),實(shí)現(xiàn)按鍵控制繼電器。 學(xué)習(xí)內(nèi)容: 一、看接入的繼電器電路圖右上圖可知:接入的引腳為PB1/PB3 由繼電器特性可以知道,未有信號(hào)時(shí),即PB1為低電平時(shí),3
發(fā)表于 04-26 09:35
?10次下載
評(píng)論