实验目的:理解并掌握共阳数码管的显示原理;
理解并掌握数码管静态显示和动态显示的原理;
实验模块: 核心板+独立按键模块+数码管模块
实验内容:(1)数码管静态显示,8 位数码管显示同一个数字;
(2)数码管动态显示,8 位数码管显示不同的数字;
模块连接图:
电路原理图:
数码管内部结构图:
功能描述: 控制数码管8位动态扫描显示01234567
硬件连接: 用8位杜邦线将J8与J12连接,2位杜邦线分别将J11_0与J15_DS1、J11_1与J15_DS2连接。
#include "reg51.h" //包含头文件
sbit LE1=P2^0; //位选573锁存器使能
sbit LE2=P2^1; //段选573锁存器使能
sbit LE2=P2^1; //段选573锁存器使能
#define uchar unsigned char
#define uint unsigned int
uchar wei;
uchar i;
uchar i;
uchar code dis[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
// 0 1 2 3 4 5 6 7
0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};//0~F的段码
// 8 9 A B C D E F
// 0 1 2 3 4 5 6 7
0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};//0~F的段码
// 8 9 A B C D E F
//**************************************************************************************************
//延时函数
//**************************************************************************************************
delay(uint time) //int型数据为16位,所以最大值为65535
{
uint i,j; //定义变量i,j,用于循环语句
for(i=0;i<time;i++) //for循环,循环50*time次
for(j=0;j<50;j++); //for循环,循环50次
}
//**************************************************************************************************
//动态扫描函数
//**************************************************************************************************
scan()
{
P1=~wei; //由于共阴,低电平来选通某1位,所以需取反
LE1=1; //锁存位
LE1=0; //断开锁存,位选573的Q7~Q0仍保持
wei<<=1; //左移一位
P1=dis[i]; //0~7的编码
LE2=1; //锁存段码
LE2=0; //断开锁存,段选573的Q7~Q0仍保持
i++; //i加1
delay(10); //延时保持一下,延时过大会闪动,延时过小会有暗影
if(i==8){i=0;wei=0x01;} //共8位,扫描到第8位时,重新扫描
}
//**************************************************************************************************
//主函数
//**************************************************************************************************
void main() //主函数
{
wei=0x01; //初始化位为0x01,即为最高位
i=0; //初始化段码为0
while(1) //进入while死循环
{
scan(); //数码管扫描函数
}
}
LE2=1; //锁存段码
LE2=0; //断开锁存,段选573的Q7~Q0仍保持
i++; //i加1
delay(10); //延时保持一下,延时过大会闪动,延时过小会有暗影
if(i==8){i=0;wei=0x01;} //共8位,扫描到第8位时,重新扫描
}
//**************************************************************************************************
//主函数
//**************************************************************************************************
void main() //主函数
{
wei=0x01; //初始化位为0x01,即为最高位
i=0; //初始化段码为0
while(1) //进入while死循环
{
scan(); //数码管扫描函数
}
}