按键控制不同窗口显示实现方法

描述

综合小实验,完整的代码,对前一段学习的总结。

按键控制

模块化编程去拼接实现自己想要的功能,一键多义用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();
		
	}
	
}
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分