⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 disp.c

📁 基于单片机的电子计算器的硬件原理图和程序
💻 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 + -