0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

按鍵控制不同窗口顯示實(shí)現(xiàn)方法

CHANBAEK ? 來(lái)源:頭條號(hào)電子秘探 ? 作者:頭條號(hào)電子秘探 ? 2023-03-23 15:58 ? 次閱讀

綜合小實(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();
		
	}
	
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 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
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    emwin窗口之間的消息傳遞方法

    轉(zhuǎn)一個(gè)經(jīng)驗(yàn)主要有三種方法:函數(shù)WM_SendMessageNoPara此函數(shù)用于將不帶參數(shù)的消息發(fā)送到指定窗口,通過(guò)此函數(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亮滅開(kāi)機(jī)使得P1.0管腳的LED亮按下按鍵使得LED呈現(xiàn)“常亮”,“滅”,“閃爍”的三個(gè)狀態(tài)循環(huán)顯示。設(shè)計(jì)思路:在程序初始化時(shí)直接將P1.0置位為高電平,
    發(fā)表于 12-06 08:19

    按鍵控制花樣燈【匯編版】

    按鍵控制花樣燈【匯編版】按鍵控制花樣燈【匯編版】按鍵控制花樣燈【匯編版】按鍵控制花樣燈【匯編版】
    發(fā)表于 12-29 11:04 ?0次下載

    按鍵控制源程序

    一個(gè)按鍵控制3種功能按鍵控制按鍵控制按鍵控制按鍵控制
    發(fā)表于 02-23 14:06 ?0次下載

    STM32按鍵控制小車(chē)代碼

    好用的stm32小車(chē)代碼,STM32按鍵控制小車(chē)代碼,STM32按鍵控制小車(chē)代碼,STM32按鍵控制小車(chē)代碼,STM32按鍵控制小車(chē)代碼
    發(fā)表于 06-08 16:28 ?49次下載

    按鍵控制單個(gè)數(shù)碼管顯示

    19-按鍵控制單個(gè)數(shù)碼管顯示----------51單片機(jī)源程序 用keil直接打開(kāi)
    發(fā)表于 06-16 15:36 ?31次下載

    1602按鍵控制數(shù)字變化

    通過(guò)按鍵控制1602數(shù)字顯示,暫停,加減
    發(fā)表于 12-09 16:38 ?30次下載

    fpga按鍵控制數(shù)碼管顯示

    本文主要介紹了fpga按鍵控制數(shù)碼管顯示程序設(shè)計(jì)。數(shù)碼管是由多個(gè)發(fā)光二極管封裝在一起組成“8”字型的器件,引線(xiàn)已在內(nèi)部連接完成,只需引出它們的各個(gè)筆劃,公共電極。下面我們來(lái)了解一下按鍵控制數(shù)碼管
    發(fā)表于 01-16 16:19 ?1.7w次閱讀
    fpga<b class='flag-5'>按鍵控制</b>數(shù)碼管<b class='flag-5'>顯示</b>

    利用FPGA DIY開(kāi)發(fā)板實(shí)現(xiàn)按鍵控制LED的顯示

    asean的 FPGA DIY 按鍵控制LED顯示的視頻
    的頭像 發(fā)表于 06-20 14:06 ?6999次閱讀
    利用FPGA DIY開(kāi)發(fā)板<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>按鍵控制</b>LED的<b class='flag-5'>顯示</b>

    FPGA DIY 按鍵控制數(shù)碼管顯示

    asean的 FPGA DIY 按鍵控制數(shù)碼管顯示的視頻
    的頭像 發(fā)表于 06-20 00:37 ?7671次閱讀

    FPGA入門(mén)系列實(shí)驗(yàn)教程之按鍵控制LED亮滅的詳細(xì)資料說(shuō)明

    實(shí)現(xiàn)按鍵控制LED亮滅。通過(guò)這個(gè)實(shí)驗(yàn),掌握采用Verilog HDL語(yǔ)言編程實(shí)現(xiàn)按鍵控制LED亮滅方法。
    發(fā)表于 06-11 16:50 ?31次下載
    FPGA入門(mén)系列實(shí)驗(yàn)教程之<b class='flag-5'>按鍵控制</b>LED亮滅的詳細(xì)資料說(shuō)明

    使用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次下載
    HT32F5232學(xué)習(xí)之四種<b class='flag-5'>方法</b><b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>按鍵控制</b>LED燈

    STM32實(shí)現(xiàn)按鍵控制繼電器

    學(xué)習(xí)目標(biāo): 通過(guò)上次學(xué)習(xí)的按鍵控制的知識(shí),實(shí)現(xiàn)按鍵控制繼電器。 學(xué)習(xí)內(nèi)容: 一、看接入的繼電器電路圖右上圖可知:接入的引腳為PB1/PB3 由繼電器特性可以知道,未有信號(hào)時(shí),即PB1為低電平時(shí),3
    發(fā)表于 04-26 09:35 ?9次下載
    STM32<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>按鍵控制</b>繼電器