- 打卡等级:以坛为家II
- 打卡总天数:499
- 最近打卡:2025-05-07 08:08:50
荣誉版主
- 积分
- 3500
|
发表于 2024-4-14 17:25:05
|
显示全部楼层
本帖最后由 浦江一水 于 2024-4-14 17:47 编辑
显示函数详解
//********************************************************************************
// 名称: LED8D.H LED_8位数码管驱动头文件
// 基于: STC32G12K128 V9.62 实验箱
// 实验: C251编译环境搭建/STC32G工程创建/STC-USB-Link1D仿真器调试/GPIO基本输出控制...
// 数码管动态扫描显示...
// 硬件: P6--8段数据 P7--8位驱动
// 编程: 浦晓明(浦江一水) 2023-12-13
//********************************************************************************
#ifndef __LED8D_H
#define __LED8D_H
#include "STC32G_SYS.H" //参考STC库函数, 局部修改...自备用.
#include "STC32G_GPIO.H" //参考STC库函数, 局部修改...自备用.
#include "STC32G_TIMER.H" //参考STC库函数, 局部修改...自备用.
extern bit SecOK; //秒到标志
//***** 端口功能初始化函数说明 *********************************************
void LED8D_Init(void); //初始化
void LED8D_Str(u8 x,u8 * str); //定位x显示字符串
#endif
//********************************************************************************
// 名称: LED8D.C LED_8位数码管
// 基于: STC32G12K128 V9.62 实验箱
// 实验: C251编译环境搭建/STC32G工程创建/STC-USB-Link1D仿真器调试/GPIO基本输出控制...
// 数码管动态扫描显示...
// 硬件: P6--8段数据 P7--8位驱动
// 编程: 浦晓明(浦江一水) 2023-12-10
//********************************************************************************
#include "LED8D.H"
/************* 用户定义宏 ***********************/
#define T0_Reload (65536UL -(MAIN_Fosc / 1000)) //Timer 0 中断频率, 1000次/秒
/************* 本地常量声明 *******************/
u8 code LedC[]={ "0123456789ABCDEF -HJKLNoPUtGqryhnuc=_S" }; //可显示字符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, }; //n..._ 段码...
u8 code T_COM[]={ 0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,}; //位码
/************* 本地变量声明 **************/
u8 LED8[8]; //显示段码缓冲
u8 DispN; //显示位索引
bit SecOK; //秒到标志
unsigned int msecond; //毫秒
/************* 本地函数声明 **************/
//***** LED8位数码管初始化函数 ******************************
void LED8D_Init(void)
{
SetGPIO_MODE(6,0xFF,3); //设P6口全部为开漏输出模式 //等效写法: SetGPIO_MODE(GPIO_P6,Pin_All,GPIO_OUT_OD);
SetGPIO_MODE(7,0xFF,0); //设P7口全部为准双向口模式 //等效写法: SetGPIO_MODE(GPIO_P7,Pin_All,GPIO_PullUp);
//P6=0x80; P7=0x7F;
TimerInit(0,0,1,(u16)T0_Reload); //定时器0模式:16位自动重载模式,12T...
TimerNVIC(0,0,1); //定时器0中断(优先级0)使能
DispN=0; msecond=0; EA=1; //开中断..
}
//*** 定位x显示字符串 ****************************************
void LED8D_Str(u8 x,u8 * str)
{ unsigned char ch,y,i;
if(x>=8)return; //超界..返回..
for(;x<8;x++) //从指定位置x到7
{ y=0;
for(i=0;i<38;i++) //根据字符查找对应段码
{ if(*str==LedC) //找到匹配
{ ch=LedD; //取出段码
y=1; break; //找到标志y
} else ch=0x00; //若无对应段码则用0空替代.
}
if(y==1) //有可显示字符...
{ if(*(str+1)=='.') //如果遇小数点处理...
{ ch |= 0x80; //段码最高位置1...(加小数点)
str++; //字符串指针移动
}
LED8[x]=ch; //定位写入显示
}
str++; //字符串指针移动
if(*str=='\0')break; //字符串结束
}
}
//************************* 显示扫描函数 *******************
void DisplayScan(void) //由定时器0每1ms调用一次 8位数码管8ms动态扫描显示一遍.
{
P7 = ~T_COM[DispN]; //移位驱动
P6 = ~LED8[DispN]; //段码送出
if(++DispN >= 8)DispN = 0; //8位结束回0
}
//========================================================================
// 函数: Timer0_ISR_Handler
// 描述: Timer0中断函数.
//========================================================================
void Timer0_ISR_Handler (void) interrupt TMR0_VECTOR //进中断时已经清除标志
{
msecond++; //毫秒计数...
if(msecond>=1000){ SecOK=1; msecond=0; }
DisplayScan(); //1ms扫描显示一位
}
//**** RunLED END *********************************************
|
|