原理图
程序代码
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
现象