实验要求:
控制静态数码管滚动显示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的数字滚动。方案一每显示一个数字都需要去编写一段代码,如要滚动显示的数字较多,代码编写量巨大,浪费时间。而方案二的程序代码量、复杂程序相对于方案一要简单很多,可变化性也更强。