按键控制不同窗口

原理图

 程序代码

main.c

/*
按键控制不同窗口显示
显示功能:窗口1: P1 00-99
		  窗口2: P2 00-99
		  窗口3: P3 00-99
		  窗口4: P4 00-99
按键功能:KEY1:窗口切换
		  KEY2;数据加1
		  KEY3: 数据减1
		  KEY4:数据清零
*/
#include <reg51.h>
#include "delay.h"
#include "display.h"
#include "key.h"
#include <intrins.h>

void Key_Service();
void Dis_Service();
unsigned int NumCnt;
bit Startflag=0;
bit UpDownflag=0;
unsigned char temp=0xfe;
unsigned int  wnd;
unsigned char parm1=0;
unsigned char parm2=0;
unsigned char parm3=0;
unsigned char parm4=0;

void main()
{
	unsigned int i;
	for(i=0;i<2000;i++)
	{
		Display();
	}
	while(1)
	{
		Dis_Service();
		Key_Service();
		Display();		
	}
}

void Key_Service()
{
	switch(key_Scan())//判断是哪个按键按下,记标志
	{
		case 1 :wnd++;if(4==wnd)wnd=0; break;//窗口切换
		case 2 :
		{
			switch(wnd)
			{
				case 0:parm1++;if(parm1>99)parm1=0;break;
				case 1:parm2++;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 :
		{
			switch(wnd)
			{
				case 0:parm1--;if(parm1>99)parm1=99;break;
				case 1:parm2--;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 :
		{
			switch(wnd)
			{
				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;
	}
}

void Dis_Service()//
{
	switch(wnd)
	{
		case 0:
		{
			LEDBuf[0]=20;
			LEDBuf[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;
	}
}


display.c

#include "display.h"
#include "delay.h"
#include <reg51.h>

unsigned char code table[]={
	0xc0,//0
	0xf9,//1
	0xa4,//2
	0xb0,//3
	0x99,//4
	0x92,//5
	0x82,//6
	0xf8,//7
	0x80,//8
	0x90,//9
	0x88,//A
	0x83,//B
	0xc6,//C
	0xa1,//D
	0x86,//E
	0x8e, //F
	0x8c, //P
	0xc1,//U
	0x91,//Y
	0x7c,//L
	0x00,//全亮
	0xff //熄灭
};

unsigned char code leddata[]={
	0x3F,  //"0"
    0x06,  //"1"
    0x5B,  //"2"
    0x4F,  //"3"
    0x66,  //"4"
    0x6D,  //"5"
    0x7D,  //"6"
    0x07,  //"7"
    0x7F,  //"8"
    0x6F,  //"9"
    0x77,  //"A"
    0x7C,  //"B"
    0x39,  //"C"
    0x5E,  //"D"
    0x79,  //"E"
    0x71,  //"F"
    0x76,  //"H"
    0x38,  //"L"
    0x37,  //"n"
    0x3E,  //"u"
    0x73,  //"P"
    0x5C,  //"o"
    0x40,  //"-"
    0x00  //熄灭
	};
	
unsigned char LEDBuf[]={22,22,22,22};//数据缓存区
unsigned char code PLACE_CODE[]={0XFE,0XFD,0XFB,0XF7};//位选信号
void Display()
{//段码 位选 延时 消隐
	static unsigned char i=0;//unsigned char i
	switch(i)
	{
		case 0:
		{
			GPIO_DIG=leddata[LEDBuf[0]];
			GPIO_PLACE=PLACE_CODE[0];
			Delay_ms(1);
			GPIO_DIG=0x00;
			i++;
		    break;
		}
		case 1:
		{
			GPIO_DIG=leddata[LEDBuf[1]];
			GPIO_PLACE=PLACE_CODE[1];
			Delay_ms(1);
			GPIO_DIG=0x00;
			i++;
		    break;
		}			
		case 2:
		{
			GPIO_DIG=leddata[LEDBuf[2]];
			GPIO_PLACE=PLACE_CODE[2];
			Delay_ms(1);
			GPIO_DIG=0x00;
			i++;
		    break;
		}
		case 3:
		{
			GPIO_DIG=leddata[LEDBuf[3]];
			GPIO_PLACE=PLACE_CODE[3];
			Delay_ms(1);
			GPIO_DIG=0x00;
			i=0;
		    break;
		}
		default:break;	
	}
}

display.h

#ifndef _display_h
#define _display_h

#include <reg51.h>
#include "delay.h"

#define GPIO_DIG    P0//段码
#define GPIO_PLACE  P2//位选
#define N           4 //数码管个数

extern unsigned char LEDBuf[];
unsigned char code leddata[];
unsigned char code table[];

extern void Display();

#endif

现象

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值