实验要求:
控制静态数码管滚动显示0-3,显示1s后熄灭约0.5s显示下一数字。
实验思路:
1、数码管接P0端口,宏定义P0端口为SMG_A_DP_PORT
#define SMG_A_DP_PORT P0 //宏定义P0端口
2、重定义系统数据类型unsigned char为U8,unsigned int为U16
typedef unsigned char U8; typedef unsigned int U16;
3、定义一个全局数组变量gsmg_code,用于定义数字“0-3”段码表
//共阳极数码段码表
U8 gsmg_code[5]={
0xC0, // 0
0xF9, // 1
0xA4, // 2
0xB0, // 3
0xFF, // 熄灭
}4、定义一个延时函数delay_1ms,用于显示\熄灭延时
完整代码:
/*****************************程序信息*********************************
* 实验名称:控制静态数码管显示0-3
* 文件名称:main.c
* 版 本:V1.00
* 日 期:2021-12-18
* 编 著:gefon
* 说 明:使用普中A7开发版,控制静态数码管显示0-3,显示约0.5s后,熄灭
0.5s显示下一数字
*******************************声明区*********************************/
#include "reg52.h"
#define SMG_A_DP_PORT P0 //宏定义P0端口
//重定义系统数据类型
typedef unsigned char U8;
typedef unsigned int U16;
//共阳极数码段码表
U8 gsmg_code[5]={
0xC0, // 0
0xF9, // 1
0xA4, // 2
0xB0, // 3
0xFF, // 熄灭
};
/*******************************子程序*********************************
* 函 数 名 :delay_10us
* 函数功能 :延时函数,当传入变量ten_us=1时,约延时10us
* 输 入 :ten_us
* 输 出 :无
***********************************************************************/
void delay_1ms(U16 ten_us)
{
U8 y;
while(ten_us--) //延时约1ms
{
for(y=0;y<100;y++); //运算一次约10us
}
}
/*******************************主程序*********************************
* 函 数 名 :main
* 函数功能 :主函数
* 输 入 :无
* 输 出 :无
***********************************************************************/
void main()
{
U8 i=0;
while(1)
{
/********************实现方案一********************/
SMG_A_DP_PORT=gsmg_code[0]; //显示数字0
delay_1ms(1000); //延时约1000ms
SMG_A_DP_PORT=gsmg_code[4]; //熄灭
delay_1ms(500); //延时约500ms
SMG_A_DP_PORT=gsmg_code[1]; //显示数字1
delay_1ms(1000);
SMG_A_DP_PORT=gsmg_code[4]; //熄灭
delay_1ms(500);
SMG_A_DP_PORT=gsmg_code[2]; //显示数字2
delay_1ms(1000);
SMG_A_DP_PORT=gsmg_code[4]; //熄灭
delay_1ms(500);
SMG_A_DP_PORT=gsmg_code[3]; //显示数字3
delay_1ms(1000);
SMG_A_DP_PORT=gsmg_code[4]; //熄灭
delay_1ms(500);
/********************实现方案一********************/
/********************实现方案二********************/
for(i=0;i<5;i++)
{
SMG_A_DP_PORT=gsmg_code[i]; //将变量i值赋给gsmg_code,以滚动显示0-3
delay_1ms(1000); //延时约1000ms
SMG_A_DP_PORT=0xFF; //熄灭
delay_1ms(500); //延时约500ms
}
/********************实现方案二********************/
}
}实验分析:
实现方案二相对于方案一,使用for循环,gsmg_code变量的数组元素通过调用变量i的值来实现0-3的数字滚动。方案一每显示一个数字都需要去编写一段代码,如要滚动显示的数字较多,代码编写量巨大,浪费时间。而方案二的程序代码量、复杂程序相对于方案一要简单很多,可变化性也更强。