综合小实验,完整的代码,对前一段学习的总结。
模块化编程去拼接实现自己想要的功能,一键多义用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
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
•9次下载
评论