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;
}