- 打卡等级:以坛为家II
- 打卡总天数:494
- 最近打卡:2025-05-02 09:16:59
荣誉版主
- 积分
- 3480
|
发表于 2025-1-15 16:10:39
|
显示全部楼层
擎天柱+驱动四位数码管显示实验
这块“先悦”实验板配有四位数码管,其电路如图:
这是共阳极数码管,与STC32G12K128实验箱所配置的数码管电路一样,是由单片机IO直接驱动,没有经过595之类集成块驱动的。
四位数码管或八位数码管,其编程原理应该是相似的:
本实验电路由P0口驱动各数码笔划段,P1.3--P1.0四个IO分别驱动各位。
电路简单,可用动态扫描方式显示之。
而今实验用擎天柱核心板来驱动则四位数码管: 模拟时钟显示,显示笔段清晰均匀,效果还是不错的。
在此贴一下主程序代码和数码管驱动的核心代码,供初学单片机的坛友参考。
//********************************************************************************
// 名称: 擎天柱+先悦板+实验4位数码管动态扫描显示 Main.C
// 基于: 先悦SINYUE 单片机开发学习板 LED_4位共阳极数码管驱动
// 实验: AI8051U 取代 STC89C52 实现4位LED数码管字符串显示.
// 硬件: P0-8段数据 P10-P13-4位选 ( 24MHz主频 )
// 编程: 浦晓明(浦江一水) 2024-12-12
//********************************************************************************
#include "AI8051U.H"
#include "AI8051U_SYS.H"
#include "LED4D.H"
/************* 全局变量声明 **************/
char S[16]; //显示字符串缓存
unsigned char hour; //时
unsigned char min; //分
unsigned char sec; //秒
//=====================================================================
// 函数: void delay_ms(unsigned int ms)
// 描述: 毫秒级延时函数。
// 参数: ms,要延时的ms数,自动适应主时钟.
//=====================================================================
void delay_ms(unsigned int ms)
{ unsigned int i;
do{ i = MAIN_Fosc / 10000;
while(--i);
} while(--ms);
}
/********************** 模拟RTC演示函数 ***********************/
void RTC(void)
{
if(++sec >= 60)
{ sec = 0;
if(++min >= 60)
{ min = 0;
if(++hour >= 24) hour = 0;
}
}
sprintf(S,"%02d.%02d",min,sec); //组织字符串
LED4D_Str(0,S); //送显示段码缓存
}
/******************** 主函数 **************************/
void main(void)
{
SYS_Init(); //系统初始化
LED4D_Init(); //8数码管和定时器0初始化
LED4D_Str(0,"AI80"); //字符串常量直接显示
delay_ms(2000); //延时一下
LED4D_Str(0,"I805"); //字符串常量直接显示
delay_ms(2000); //延时一下
LED4D_Str(0,"8051"); //字符串常量直接显示
delay_ms(2000); //延时一下
LED4D_Str(0,"051U"); //字符串常量直接显示
delay_ms(2000); //延时一下
min = 59;
sec = 58;
RTC();
//循环...字符串显示...
while(1)
{
if(SecOK) //1s到
{ SecOK = 0;
RTC();
}
}
}
/***** END *****************************************/
//数码管驱动源代码:
//********************************************************************************
// 名称: LED4D.C
// 基于: 先悦SINYUE 单片机开发学习板 LED_4位共阳极数码管驱动
// 实验: AI8051U 取代 STC89C52 实现4位LED数码管字符串显示.
// 硬件: P0-8段数据 P10-P13-4位选
// 编程: 浦晓明(浦江一水) 2024-12-12
//********************************************************************************
#include "LED4D.H"
/************* 用户定义宏 *******************/
#define T1MS (65536UL -(MAIN_Fosc / 1000)) //Timer 0 1ms 中断频率, 1000次/秒
/************* 本地常量声明 **************/
u8 code LEDC[]={ "0123456789ABCDEF -HJKLNoPUtGqryhnuc=_SI" }; //可显示字符38 //段码...
u8 code LEDD[]={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71, //0..9,A..F
0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x6E,0x7C, //...h
0x54,0x1C,0x58,0x48,0x08,0x6D,0x30, }; //n...
u8 code T_COM[]={ 0xF7,0xFB,0xFD,0xFE, }; //位码
/************* 本地变量声明 **************/
u8 LED4[4]; //显示段码缓冲
u8 DispN; //显示位索引
bit SecOK; //秒到标志
unsigned int msec; //毫秒
/************* 本地函数声明 **************/
//***** LED4位数码管初始化函数 *************
void LED4D_Init(void)
{ //定时器0初始化
AUXR |= 0x80;
TMOD &= ~0x0F;
TL0 = T1MS;
TH0 = T1MS >> 8;
TR0 = 1;
ET0 = 1;
EA=1; //开中断..
DispN=0; msec=0; SecOK=0;
}
//*** 定位x显示字符串 **********************
void LED4D_Str(u8 x,u8 * str)
{ unsigned char ch,y,i;
if(x>=4)return; //超界..返回..
for(;x<4;x++) //从指定位置x到4
{ y=0;
for(i=0;i<39;i++) //根据字符查找对应段码
{ if(*str==LEDC) //找到匹配
{ ch=LEDD; //取出段码
y=1; break; //找到标志y
} else ch=0x00; //若无对应段码则用0空替代.
}
if(y==1)
{ if(*(str+1)=='.') //如果遇小数点处理...
{ ch |= 0x80; //段码最高位置1...(加小数点)
str++;
}
LED4[x]=ch; //定位写入显示
}
str++;
if(*str=='\0')break; //字符串结束
}
}
//********************** 显示扫描函数 ************************
void DisplayScan(void)
{
P0 = ~LED4[DispN]; //段码送出
P1 = T_COM[DispN]; //移位驱动
if(++DispN >= 4)DispN = 0; //4位结束回0
}
//=====================================================
// 函数: Timer0_ISR_Handler
// 描述: Timer0中断函数.
//=====================================================
void Timer0_ISR_Handler (void) interrupt TMR0_VECTOR //进中断时已清除标志
{
msec++; //毫秒计数...
if(msec>=1000){ SecOK=1; msec = 0; }
DisplayScan(); //1ms扫描显示一位
}
//**** LED84.C END *******************************************************
工程文件包,供有兴趣的单片机爱好者坛友参考指正。
02_4位数码管显示.rar
(29.01 KB, 下载次数: 20)
|
|