1 项目要求
(1)数码管开机初始显示----,正常运行时显示2013;
(2)数码管显示任意四位十进制数;
2 仿真测试
3 参考程序
3.1 主函数
#include "DisplaySmg.h"
void main()
{
//任务1 正常运行时显示2023
unsigned int i; //0~65535
for(i=0;i<5000;i++) //数码管开机显示
{
DisplaySmg(); //for循环i控制显示时间
}
while(1)
{
LedBuf[0]=2; //重新设置LedBuf[](extern),即数据缓存区
LedBuf[1]=0;
LedBuf[2]=2;
LedBuf[3]=3;
DisplaySmg(); //调用数码管显示函数
}
// //任务2 数码管显示任意四位十进制数
// unsigned int i; //0~65535
// unsigned int NUM = 1983; //0~65535
// for(i=0;i<5000;i++) //数码管开机显示
// {
// DisplaySmg(); //for循环i控制显示时间
// }
// while(1)
// {
// LedBuf[0] = NUM/1000; //取千位
// LedBuf[1] = NUM/100%10; //取百位
// LedBuf[2] = NUM/10%10; //取十位
// LedBuf[3] = NUM%10; //取个位
// DisplaySmg(); //调用数码管显示函数
// }
}
3.2 数码管显示函数(H文件和C文件成对出现)
#ifndef __DisplaySmg_H__
#define __DisplaySmg_H__
#include
#include "DelayXms.h"
#define GPIO_SEG P0 //段选端
#define GPIO_SEL P2 //位选端
#define SMG_NUM 4 //数码管的个数
extern unsigned char LedBuf[];
void DisplaySmg();
#endif
#include "DisplaySmg.h"
unsigned char code LedData[]={ //共阴型数码管的段码表,字符,序号
0x3F, //"0",0
0x06, //"1",1
0x5B, //"2",2
0x4F, //"3",3
0x66, //"4",4
0x6D, //"5",5
0x7D, //"6",6
0x07, //"7",7
0x7F, //"8",8
0x6F, //"9",9
0x77, //"A",10
0x7C, //"B",11
0x39, //"C",12
0x5E, //"D",13
0x79, //"E",14
0x71, //"F",15
0x76, //"H",16
0x38, //"L",17
0x37, //"n",18
0x3E, //"u",19
0x73, //"P",20
0x5C, //"o",21
0x40, //"-",22
0x00, //熄灭 23
};
unsigned char code LedAddr[]={0xfe,0xfd,0xfb,0xf7}; //数码管位选
unsigned char LedBuf[]={22,22,22,22}; //显示缓存区
void DisplaySmg()
{
unsigned char i; //等价于 "static unsigned char i = 0;"
GPIO_SEG = LedData[LedBuf[i]]; //第一步 送段码
GPIO_SEL = LedAddr[i]; //第二步 送位选
DelayXms(1); //第三步 延时1ms
GPIO_SEG = 0x00; //第四步 消影(共阴形)
i++;
if(i==SMG_NUM) //SMG_NUM为数码管的个数
i=0;
}
3.3 延时函数
#ifndef __DelayXms_H__
#define __DelayXms_H__
#include
void DelayXms(unsigned char xms);
#endif
#include "DelayXms.h"
void DelayXms(unsigned char xms) //@11.0592MHz
{
unsigned char i, j;
while(xms--)
{
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
4 参考来源
(1)单片机应用 数码管动态显示编程之基于底层显示模块的应用层功能程序_哔哩哔哩_bilibili;