1.数码管静态显示 2.数码管动态显示 3.独立按键控制数码管

1.独立按键

K1端口:P3_1

K2端口:P3_0

K3端口 :  P3_2

K4端口:P3_3

2.三八译码器

在这里为什么要介绍三八译码器呢,是因为三八译码器要和8个数码管相连,控制8个数码管的亮灭。Y7\Y6\Y5\Y4\Y3\Y2\Y1\Y0分别与LED8\LED7\LED6\LED5\LED4\LED3\LED2\LED1\LED0相连。同时这里的LED端口是共阴极端口。

假如我们想让LED8亮:那么就应该是0111 1111。低电平亮。

假如我们想让LED7亮:那么就应该是1011 1111。低电平亮。

假如我们想让LED6亮:那么就应该是1101 1111。低电平亮。

假如我们想让LED5亮:那么就应该是1110 1111。低电平亮。

假如我们想让LED4亮:那么就应该是1111 0111。低电平亮。

假如我们想让LED3亮:那么就应该是1111 1011。低电平亮。

假如我们想让LED2亮:那么就应该是1111 1101。低电平亮。

假如我们想让LED1亮:那么就应该是1111 1110。低电平亮。

2.1三八译码器硬件原理图

2.2三八译码器逻辑真值表

举例说明:LED8亮:则Y7/Y6/Y5/Y4/Y3/Y2/Y1/Y0=0111 111.对应C/B/AD端口就是111.

000=0 对应Y0端口  LED1亮

001=2^0=1 对应Y1端口  LED2亮

010=2^1=2 对应Y2端口  LED3亮

011=3 对应Y3端口  LED4亮

100=2^2=4 对应Y4端口  LED5亮

101=5 对应Y5端口  LED6亮

110=2^2+2^1=7 对应Y6端口  LED7亮

111=2^2+2^1+2^0=7  对应Y7端口  LED8亮

3.74HC245双向缓冲器

作用:74HC245芯片,它常用于电路中增加控制器的驱动能力。

单片机等微控制器的引脚拉电流能力一般在20mA左右,想要直接点亮数码管、显示屏等大功率显示器件则明显不够,这时,我们用一颗74 HC245芯片来增加单片机引脚的驱动能力。

芯片引脚功能:

2-9引脚也就是A0至A7,是芯片的输入或输出

18至第11引脚就是B0-B7,是芯片的输出或输入。

1引脚DIR为方向控制,当该引脚为高电平时,信号由a端为输入,b端输出;电平为低时,信号由b端输入,a端输出。

19引脚OE是芯片使能引脚,也就是当引脚电平为低时,芯片才有输出,否则则为高阻状态。

10、20引脚是芯片的电源引脚。

作用:74HC245控制数码管LED上面显示的数子0-8.数据从A0至A7流入,B0-B7流出,流到数码管上的dp-g-f-e-d-c-b-a端口,在数码管的这端是共阳极数码管,如果我们想要LED8上显示数字1,则b-c端口为1,则dp-g-f-e-d-c-b-a对应数据为0000 0110,对应B7-B0数据为0000 0110。则A7-A0数据为0000 0110。因此我们只需要控制A7-A0口流入的数据就可以对数码管进行段选,进行数字显示控制。

通过上述我们可以得出三八译码器控制LED7-LED0那个数码管亮,进行位选,74HC245控制数码管上显示数字是什么,进行段选。

4.静态数码管显示

#include <REGX52.H>

unsigned char tubetable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//代表数码管上显示的数字0,1,2,3,4,5,6,7
void Tube(unsigned char locate,Number)
{
	switch(locate)
	{
		case 1:P2_4=1;P2_3=1;P2_2=1;break;//LED7亮
		case 2:P2_4=1;P2_3=1;P2_2=0;break;//LED6亮
		case 3:P2_4=1;P2_3=0;P2_2=1;break;//LED5亮
		case 4:P2_4=1;P2_3=0;P2_2=0;break;//LED4亮
		case 5:P2_4=0;P2_3=1;P2_2=1;break;//LED3亮
		case 6:P2_4=0;P2_3=1;P2_2=0;break;//LED2亮
		case 7:P2_4=0;P2_3=0;P2_2=1;break;//LED1亮
	    case 8:P2_4=0;P2_3=0;P2_2=0;break;//LED0亮		
	}
	P0=tubetable[Number];
}
void Delay(unsigned char xms)		//@12.000MHz
{
	while(xms)
	{
	unsigned char i, j;

	i = 195;
	j = 138;
	do
	{
		while (--j);
	} while (--i);
	xms--;
}
}

void main()
{
	Tube(1,5);//从左到右第一个位置LDE7位置显示5
	Delay(10);
	Tube(2,2);//从左到右第二个位置LDE7位置显示2
	Delay(10);
	Tube(3,1);//从左到右第三个位置LDE7位置显示1
	Delay(10);
	Delay(10);
	while(1)
	{
	}
}

5.动态数码管

#include <REGX52.H>//单片机直接扫描数码管
void Delay(unsigned char xms)		//@12.000MHz
{
	while(xms)
	{
	unsigned char i, j;

	i = 195;
	j = 138;
	do
	{
		while (--j);
	} while (--i);
	xms--;
}
}


unsigned char tubetable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};段选0,1,2,3,4,5,6,7,0
void Tube(unsigned char locate,Number)
{
	switch(locate)
	{
		case 1:P2_4=1;P2_3=1;P2_2=1;break;//LED0
		case 2:P2_4=1;P2_3=1;P2_2=0;break;//LED1
		case 3:P2_4=1;P2_3=0;P2_2=1;break;//LED2
		case 4:P2_4=1;P2_3=0;P2_2=0;break;//LED3
		case 5:P2_4=0;P2_3=1;P2_2=1;break;//LED4
		case 6:P2_4=0;P2_3=1;P2_2=0;break;//LED5
		case 7:P2_4=0;P2_3=0;P2_2=1;break;//LED6
	  case 8:P2_4=0;P2_3=0;P2_2=0;break;//LED7	
	}
	P0=tubetable[Number];//P0端口控制数码管上的数字,P0-P7连接74HC245上的A0-A7数据输入
	Delay(20);
	P0=0x00;//数据清0,数码管灭
}
void main()
{
	while(1)
	{
			Tube(1,5);
	        Delay(200);
    	    Tube(2,2);
	        Delay(200);
	        Tube(3,1);
	        Delay(200);
	}
}
//数码管消影:位选 段选(清零)位选 段选 位选 段选
//显示数据篡位

6.独立按键控制数码管

6.1头文件

6.2Delay.h和Delay.c函数

#ifndef  __DELAY_H__
#define  __DELAY_H__

void Delay(unsigned char xms);

#endif
void Delay(unsigned char xms)		//@12.000MHz
{
	unsigned char i, j;
	while(xms)
	{
	i = 195;
	j = 138;
	do
	{
		while (--j);
	} while (--i);
	xms--;
}
}

6.3Tube.h和Tube.c函数

#ifndef  __TUBE_H__
#define  __TUBE_H__

void Tube(unsigned char locate,Number);

#endif
#include <REGX52.H>  //包含P0端口  任何自定义的变量或者函数在调用前必须要有定义或者声明
#include "Delay.h"  //数码管里面用到了delay函数因此要加头文件

unsigned char tubetable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void Tube(unsigned char locate,Number)
{
	switch(locate)
	{
		case 1:P2_4=1;P2_3=1;P2_2=1;break;//LED0
		case 2:P2_4=1;P2_3=1;P2_2=0;break;//LED1
		case 3:P2_4=1;P2_3=0;P2_2=1;break;//LED2
		case 4:P2_4=1;P2_3=0;P2_2=0;break;//LED3
		case 5:P2_4=0;P2_3=1;P2_2=1;break;//LED4
		case 6:P2_4=0;P2_3=1;P2_2=0;break;//LED5
		case 7:P2_4=0;P2_3=0;P2_2=1;break;//LED6
	  case 8:P2_4=0;P2_3=0;P2_2=0;break;//LED7	
	}
	P0=tubetable[Number];
	Delay(20);
	P0=0x00;
}

6.4main.c函数

#include <REGX52.H>
#include "Delay.h"
#include "Key.h"
#include "Tube.h"

void main()
{
	unsigned char KeyNum;
	while(1)
	{
		KeyNum=Key();
		Tube(1,KeyNum);
		Delay(200);
	}
}

6.5Key.h和Key.c

#ifndef __KEY_H__
#define __KEY_H__

unsigned char Key();


#endif
#include <REGX52.H>
#include "Delay.h"

//获取独立按键键码
//无参数
//按下按键的键码范围1-4,无按键按下返回值为0
unsigned char Key()
{
	unsigned char KeyNumber=0;
	if(P3_1==0){Delay(2);while(P3_1==0);Delay(2);KeyNumber=1;}
	if(P3_0==0){Delay(2);while(P3_0==0);Delay(2);KeyNumber=2;}
	if(P3_2==0){Delay(2);while(P3_2==0);Delay(2);KeyNumber=3;}
	if(P3_3==0){Delay(2);while(P3_3==0);Delay(2);KeyNumber=4;}
	
	return KeyNumber;
}

  • 15
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值