0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

CHANBAEK 来源:头条号电子秘探 作者:头条号电子秘探 2023-03-23 15:58 次阅读

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

模块化编程去拼接实现自己想要的功能,一键多义用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

    文章

    532

    浏览量

    58090
  • 函数
    +关注

    关注

    3

    文章

    4273

    浏览量

    62290
  • 代码
    +关注

    关注

    30

    文章

    4708

    浏览量

    68175
  • 按键控制
    +关注

    关注

    1

    文章

    44

    浏览量

    8761
收藏 人收藏

    评论

    相关推荐

    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

    按键控制花样灯【汇编版】

    按键控制花样灯【汇编版】按键控制花样灯【汇编版】按键控制花样灯【汇编版】按键控制花样灯【汇编版】
    发表于 12-29 11:04 0次下载

    按键控制源程序

    一个按键控制3种功能按键控制按键控制按键控制按键控制
    发表于 02-23 14:06 0次下载

    STM32按键控制小车代码

    好用的stm32小车代码,STM32按键控制小车代码,STM32按键控制小车代码,STM32按键控制小车代码,STM32按键控制小车代码
    发表于 06-08 16:28 49次下载

    按键控制单个数码管显示

    19-按键控制单个数码管显示----------51单片机源程序 用keil直接打开
    发表于 06-16 15:36 34次下载

    1602按键控制数字变化

    通过按键控制1602数字显示,暂停,加减
    发表于 12-09 16:38 30次下载

    fpga按键控制数码管显示

    本文主要介绍了fpga按键控制数码管显示程序设计。数码管是由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,只需引出它们的各个笔划,公共电极。下面我们来了解一下按键控制数码管
    发表于 01-16 16:19 1.7w次阅读
    fpga<b class='flag-5'>按键控制</b>数码管<b class='flag-5'>显示</b>

    利用FPGA DIY开发板实现按键控制LED的显示

    asean的 FPGA DIY 按键控制LED显示的视频
    的头像 发表于 06-20 14:06 7058次阅读
    利用FPGA DIY开发板<b class='flag-5'>实现</b><b class='flag-5'>按键控制</b>LED的<b class='flag-5'>显示</b>

    FPGA DIY 按键控制数码管显示

    asean的 FPGA DIY 按键控制数码管显示的视频
    的头像 发表于 06-20 00:37 7744次阅读

    FPGA入门系列实验教程之按键控制LED亮灭的详细资料说明

    实现按键控制LED亮灭。通过这个实验,掌握采用Verilog HDL语言编程实现按键控制LED亮灭方法
    发表于 06-11 16:50 31次下载
    FPGA入门系列实验教程之<b class='flag-5'>按键控制</b>LED亮灭的详细资料说明

    HT32F5232学习之四种方法实现按键控制LED灯

    HT32F5232学习之四种方法实现按键控制LED灯
    发表于 11-29 16:51 11次下载
    HT32F5232学习之四种<b class='flag-5'>方法</b><b class='flag-5'>实现</b><b class='flag-5'>按键控制</b>LED灯

    STM32实现按键控制继电器

    学习目标: 通过上次学习的按键控制的知识,实现按键控制继电器。 学习内容: 一、看接入的继电器电路图右上图可知:接入的引脚为PB1/PB3 由继电器特性可以知道,未有信号时,即PB1为低电平时,3
    发表于 04-26 09:35 9次下载
    STM32<b class='flag-5'>实现</b><b class='flag-5'>按键控制</b>继电器

    如何用按键控制不同的LED流转模式?

    实现的任务就是用LCD做一个菜单,用按键控制不同的LED流转模式。
    发表于 07-26 16:53 650次阅读
    如何用<b class='flag-5'>按键控制</b>不同的LED流转模式?