綜合小實驗,完整的代碼,對前一段學習的總結。
模塊化編程去拼接實現自己想要的功能,一鍵多義用switch語句實現
延時函數
DelayXms.h
#ifndef __DELAYXMS_H__
#define __DELAYXMS_H__
#define u16 unsigned int //宏定義
#define u8 unsigned char//數據范圍0--255
void DelayXms(u16 xms);
#endif
DelayXms.c
/*****************************
功能:延時x毫秒
*****************************/
#include "DelayXms.h"
void DelayXms(u16 xms)
{
u16 i,j; //unsigned int 類型的數據范圍0-65535
for(i=xms;i>0;i--){
for(j=124;j>0;j--);
}
}
共陰極數碼管底層顯示驅動
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 //數碼管的個數
extern u8 LEDBuf[];//外部引用申明(DisplayService.c會用到這個變量)
void Display();
#endif
display.c
#include "display.h"
u8 code leddata[]={ //共陰極數碼管的段碼表
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F, //0-9【下標0-9】
0x77,0x7C,0x39,0x5E,0x79,0x71, // A-F【下標10-15】
0x76,0x38,0x37,0x3e,0x73,0x5c,0x40,//h,l,n,u,p,o,-【下標16-22】
0xff
};
u8 LEDBuf[]={23,23,23,23};//數據顯示緩沖區,
u8 code BitCode[]={0xfe,0xfd,0xfb,0xf7};//位選控制信號
void Display()
{
/*靜態局部變量生命周期:程序結束為止
可以保持變量內容的持久性,函數調用結束時
變量的值仍在*/
static u8 i = 0;
//1.送段碼
GPIO_SEG = leddata[LEDBuf[i]];
//2.送位選
GPIO_BIT = BitCode[i];
//3.1ms<延時<10ms
DelayXms(9);
//4.消影
GPIO_SEG = 0x00;//不消影顯示會出問題
i++;
if(N == i)//條件控制
i=0;
}
底層按鍵驅動
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.延時消抖 10ms
if(!key1 || !key2 || !key3 ||!key4)//3.再次判斷按鍵是否按下
{
if(!key1)
KeyNum = 1; //4.給按鍵開關賦一個鍵值
if(!key2)
KeyNum = 2;
if(!key3)
KeyNum = 3;
if(!key4)
KeyNum = 4;
while(!key1 || !key2 || !key3 ||!key4);//5.松手等待
}
}
return KeyNum;
}
應用層---顯示服務函數
DisplayService.h
#ifndef __DISPLAYSERVICE_H__
#define __DISPLAYSERVICE_H__
#include "Display.h"
extern u8 parm1 ; //外部引用聲明
extern u8 parm2 ;//KeyService.c會用到
extern u8 parm3 ;
extern u8 parm4 ;
extern u8 windowNum;//KeyService.c會用到
void DisplayService();
#endif
DisplayService.c
#include "DisplayService.h"
u8 parm1 = 11; //初始顯示的數據
u8 parm2 = 22;
u8 parm3 = 33;
u8 parm4 = 44;
u8 windowNum = 0;//窗口變量
void DisplayService()
{
switch(windowNum)
{
case 0:
LEDBuf[0] = 20;//底層顯示驅動中段碼表中的下標20 顯示字母P
LEDBuf[1] = 1;//顯示數字1
LEDBuf[2] = parm1/10;//顯示十位上的數據
LEDBuf[3] = parm1%10;//顯示個位上的數據
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;
}
}
應用層--按鍵服務函數
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個窗口
windowNum++;//每按一下按鍵,窗口變量加1
if(windowNum>3) //條件控制
windowNum = 0;//最后一個窗口銜接到第一個窗口
break;
case 2: //按鍵key2對窗口中的數據執行加1操作
switch(windowNum)//用switch語句判斷對第幾個窗口進行操作
{
case 0: //第一個窗口中的數據
parm1++;
if(parm1 > 99)//只能顯示2位數,超過99,需要置0
parm1 =0;
break;
case 1://第二個窗口中的數據
parm1++;
if(parm2 > 99)
parm2 =0;
break;
case 2: //第三個窗口中的數據
parm3++;
if(parm3 > 99)
parm3 =0;
break;
case 3://第四個窗口中的數據
parm4++;
if(parm4 > 99)
parm4 =0;
break;
default: break;
}
break;
case 3: //按鍵key3對窗口中的數據執行減1操作
switch(windowNum)//用switch語句判斷對第幾個窗口進行操作
{
case 0:
parm1--;
if(parm1 > 99)//變量parm范圍0-255,自減小于0會變成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對窗口中的數據置0
switch(windowNum)//用switch語句判斷對第幾個窗口進行操作
{
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函數
main.c
#include "KeyService.h"
void main()
{
u16 temp;
for(temp=0;temp<100;temp++)
{
Display();//上電顯示一段時間畫面
}
while(1)
{
DisplayService();
Key_Service();
Display();
}
}
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
Switch
+關注
關注
1文章
533瀏覽量
58222 -
函數
+關注
關注
3文章
4327瀏覽量
62573 -
代碼
+關注
關注
30文章
4780瀏覽量
68527 -
按鍵控制
+關注
關注
1文章
44瀏覽量
8773
發布評論請先 登錄
相關推薦
emwin窗口之間的消息傳遞方法
轉一個經驗主要有三種方法:函數WM_SendMessageNoPara此函數用于將不帶參數的消息發送到指定窗口,通過此函數可以實現不同窗口之間的消息傳遞。函數WM_SendMessag
發表于 04-22 11:30
你都知道STM32按鍵控制led的方法有哪些嗎
按鍵控制led(有鎖存)第4種方式實現按鍵控制led(有鎖存,在2個LED上顯示二進制加法)楊桃32學習筆記,本文圖片文字皆為轉述回顧按鍵電
發表于 08-24 06:47
按鍵控制外部中斷實現LED亮滅的方法
一,按鍵控制外部中斷實現LED亮滅開機使得P1.0管腳的LED亮按下按鍵使得LED呈現“常亮”,“滅”,“閃爍”的三個狀態循環顯示。設計思路:在程序初始化時直接將P1.0置位為高電平,
發表于 12-06 08:19
STM32按鍵控制小車代碼
好用的stm32小車代碼,STM32按鍵控制小車代碼,STM32按鍵控制小車代碼,STM32按鍵控制小車代碼,STM32按鍵控制小車代碼
發表于 06-08 16:28
?49次下載
fpga按鍵控制數碼管顯示
本文主要介紹了fpga按鍵控制數碼管顯示程序設計。數碼管是由多個發光二極管封裝在一起組成“8”字型的器件,引線已在內部連接完成,只需引出它們的各個筆劃,公共電極。下面我們來了解一下按鍵控制數碼管
發表于 01-16 16:19
?1.7w次閱讀
FPGA入門系列實驗教程之按鍵控制LED亮滅的詳細資料說明
實現按鍵控制LED亮滅。通過這個實驗,掌握采用Verilog HDL語言編程實現按鍵控制LED亮滅方法。
發表于 06-11 16:50
?31次下載
STM32實現按鍵控制繼電器
學習目標: 通過上次學習的按鍵控制的知識,實現按鍵控制繼電器。 學習內容: 一、看接入的繼電器電路圖右上圖可知:接入的引腳為PB1/PB3 由繼電器特性可以知道,未有信號時,即PB1為低電平時,3
發表于 04-26 09:35
?10次下載
評論