📄 disp.c
字号:
/*
****************************************************
显示
****************************************************
*/
#include <reg52.H>
#include "Typedef.H"
#include "UserDef.H"
#include "Disp.h"
/* 端口定义 */
#define DISPSCANPORT P3
#define DISPDATAPORT P2
/* 全局变量 */
static INT8U DispBuffer[MAXDISPLEN]; //显示内容缓冲区
static INT8U DispPro[MAXDISPLEN]; //显示属性缓冲区
//显示属性定义
#define PRO_POINT (1<<0) //小数点
#define PRO_BLINK (1<<1) //闪烁
/* 7段数码管显示字模 */
static INT8U code SegCode[] = {
0x3F, //0
0x06, //1
0x5B, //2
0x4F, //3
0x66, //4
0x6D, //5
0x7D, //6
0x07, //7
0x7F, //8
0x6F, //9
0x77, //10 A
0x7C, //11 b
0x39, //12 C
0x5E, //13 d
0x79, //14 E
0x71, //15 F
0x00, //16 ' '
0x40, //17 '-'
0x50, //18 'r'
0x80, //19 '.'
};
/***************************************
显示扫描刷新程序
****************************************/
void DispRef(void)
{
static INT8U CurI = 0; //当前扫描数码管位号
static INT8U BlinkCnt = 0; //闪烁显示计数器
static BOOLEAN BlinkStatus = 0; //当前闪烁状态
INT8U dc;
/* 计算当前位的显示内容 */
dc = SegCode[DispBuffer[CurI]];
if ((DispPro[CurI] & PRO_POINT) != 0) //是否附加小数点
dc |= SegCode[DC_POINT];
/* 计算显示闪烁状态 */
BlinkCnt ++;
BlinkCnt %= T_BLINK;
if (BlinkCnt == 0)
BlinkStatus = !BlinkStatus;
/* 若当前闪烁状态=0且当前显示位允许闪烁 */
if ((BlinkStatus == 0) && ((DispPro[CurI] & PRO_BLINK) != 0))
dc = 0;
/* 扫描输出当前位 */
DISPDATAPORT = 0xFF;
DISPSCANPORT = (1<<CurI);
DISPDATAPORT = ~dc;
CurI ++;
CurI %= MAXDISPLEN;
}
/***************************************
获取整数的长度
****************************************/
static INT8U GetIntLen(INT32U val)
{
INT8U len;
len = 0;
while (val != 0)
{
val /= 10;
len ++;
}
if (len == 0)
len = 1;
return len;
}
/***************************************
将显示缓冲区的内容由左对齐变为右对齐
入口参数: 被操作的数的长度
****************************************/
static void Right(INT8U len)
{
INT8U sorc,targ;
targ = MAXDISPLEN-1;
sorc = len - 1;
while (len != 0)
{
DispBuffer[targ] = DispBuffer[sorc];
DispPro[targ] = DispPro[sorc];
sorc --;
targ --;
len --;
}
while (targ != 0xFF)
{
DispBuffer[targ] = DC_EMPTY;
DispPro[targ] = 0;
targ --;
}
}
/***************************************
显示一个整数
入口参数:整数数值,起始显示位置,长度
****************************************/
void DispInt(INT32U val,INT8U position,INT8U len)
{
INT8U n,end;
end = position + len - 1;
for (n=0;n<len;n++)
{
DispBuffer[end] = val % 10;
DispPro[end] = 0;
val /= 10;
end --;
}
}
/***************************************
显示一个整数(左对齐)
****************************************/
void DispIntLeft(INT32U val)
{
INT8U n;
n = GetIntLen(val);
DispInt(val,0,n);
}
/***************************************
显示一个整数(右对齐)
****************************************/
void DispIntRight(INT32U val)
{
INT8U n;
n = GetIntLen(val);
DispInt(val,MAXDISPLEN-n,n);
}
/***************************************
显示一个字符
入口参数:字符,显示位置,是否闪烁
****************************************/
void DispChr(INT8U cv,INT8U position,BOOLEAN blink)
{
DispBuffer[position] = cv;
if (blink == TRUE)
DispPro[position] = PRO_BLINK;
else
DispPro[position] = 0;
}
/***************************************
显示一个浮点数
注:无超显示范围判断
使用全部的显示区域
****************************************/
void DispFloat(float val)
{
INT8U IntLen,n,DispOrg;
DispCls();
/* 符号位处理 */
if (val < 0)
{
DispBuffer[0] = DC_SUB;
IntLen = 1;
val = -val;
DispOrg = 1;
}
else
{
IntLen = 0;
DispOrg = 0;
}
/* 整数位数计算 */
IntLen += GetIntLen((INT32U)val);
/* 浮点数定长度归一化 */
for (n=IntLen;n<MAXDISPLEN;n++)
{
val *= 10;
}
/* 四舍五入 */
val += 0.5;
/* 显示有效位数 */
DispInt((INT32U)val, DispOrg , MAXDISPLEN-DispOrg);
DispPro[IntLen - 1] = PRO_POINT;
/* 计算实际有效位数,去掉小数部分尾数的所有0 */
n = MAXDISPLEN - 1;
while (n >= IntLen)
{
if (DispBuffer[n] != 0)
{
break;
}
n --;
}
/* 右对齐 */
Right(n+1);
}
/***************************************
显示清屏
****************************************/
void DispCls(void)
{
INT8U n;
for (n=0;n<MAXDISPLEN;n++)
{
DispBuffer[n] = DC_EMPTY;
DispPro[n] = 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -