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

📄 hw_disp.c

📁 实现PID算法的C语言程序
💻 C
字号:
/*
****************************************************


****************************************************
*/

#include <reg52.H>

#include "Typedef.H"
#include "UserDef.H"

#include "font.h"


/* 端口定义 */
#define DISPDATAPORT	P0		//数据端口
sbit Pin_CS1 = P2^1;			//片选
sbit Pin_CS2 = P2^0;			//片选
sbit Pin_RS = P2^2;				//指令、数据选择(0=指令;1=数据)
sbit Pin_RW = P2^3;				//读写选择(0=写,1=读)
sbit Pin_E = P2^4;				//锁存(下降沿有效)
sbit Pin_RST = P2^5;			//锁存(下降沿有效)


/*  私有全局变量 */
static INT8U CurRow = 0;
static INT8U CurCol = 0;
static INT8U CurFont = 0;



/***************************************

	LCD忙等待

****************************************/
static void Busy(void)
{
	INT8U bf;

	Pin_E = 0;
	DISPDATAPORT = 0xFF;	//使端口为输入状态
	Pin_RW = 1;				//读
	Pin_RS = 0;				//指令

	while (1)
	{
		Pin_E = 1;
		bf = DISPDATAPORT;
		Pin_E = 0;
		if ((bf & 0x80) == 0)
			break;
	}
}

/***************************************

	LCD数据写

****************************************/
static void LCD_Data(INT8U Data)
{
	Busy();
	
	Pin_E = 0;
	Pin_RW = 0;		//写
	Pin_RS = 1;		//数据

	Pin_E = 1;

	DISPDATAPORT = Data;

	Pin_E = 0;
}

/***************************************

	LCD命令写

****************************************/
static void LCD_Cmd(INT8U cmd)
{
	Busy();
	
	Pin_E = 0;
	Pin_RW = 0;		//写
	Pin_RS = 0;		//指令

	Pin_E = 1;

	DISPDATAPORT = cmd;

	Pin_E = 0;
}

/***************************************

	

****************************************/
static void LCD_Disp_Pattern(INT8U img,INT8U len)
{
	INT8U col;

	col = CurCol;
	if (col<64)
		Pin_CS1 = 1;
	else
	{
		col -= 64;
		Pin_CS2 = 1;
	}

	LCD_Cmd(0xB8|CurRow);
	LCD_Cmd(0x40|col);

	while (len != 0)
	{
		LCD_Data(img);
		len --;
		col ++;
		CurCol ++;
		if (col>=64)
		{
			Pin_CS1 = 0;
			Pin_CS2 = 1;
			LCD_Cmd(0xB8|CurRow);
			LCD_Cmd(0x40|0);
			col -= 64;
		}
	}
	Pin_CS1 = 0;
	Pin_CS2 = 0;
}

void DispXYSet(INT8U row,INT8U col)
{
	CurRow = row;
	CurCol = col;
}

void DispFont(INT8U font)
{
	CurFont = font;
}


/***************************************

	

****************************************/
void LCD_Disp_Pic(INT8U * img,INT8U len)
{
	INT8U col;

	col =CurCol;

	if (col<64)
		Pin_CS1 = 1;
	else
	{
		col -= 64;
		Pin_CS2 = 1;
	}
	LCD_Cmd(0xB8|CurRow);
	LCD_Cmd(0x40|col);

	do
	{
		LCD_Data(*img);
		len --;
		col ++;
		CurCol ++;
		img ++;
		if (col>=64)
		{
			Pin_CS1 = 0;
			Pin_CS2 = 1;
			LCD_Cmd(0xB8|CurRow);
			LCD_Cmd(0x40|0);
			col -= 64;
		}
	} while (len != 0);
	Pin_CS1 = 0;
	Pin_CS2 = 0;
}


/***************************************

	获取整数的长度	

****************************************/
static INT8U GetIntLen(INT32U val)
{
	INT8U len;

	len = 0;
	while (val != 0)
	{
		val /= 10;
		len ++;
	}

	if (len == 0)
		len = 1;

	return len;
}




/***************************************

	显示一个字符
	入口参数:字符,显示位置,是否闪烁

****************************************/
void DispChr(INT8U cv)
{
	INT8U *pF;
	INT8U len,n,row,col;

	row = CurRow;
	col = CurCol;
	len = FontAttr[CurFont][0] * FontAttr[CurFont][1];
	pF = (INT8U *)FontAdr[CurFont];
	pF += cv*len;

	n = 0;
	while (1)
	{
		LCD_Disp_Pic(pF+n*FontAttr[CurFont][0],FontAttr[CurFont][0]);
		n ++;
		if (n>= FontAttr[CurFont][1])
			break;
		CurRow ++;
		CurCol = col;
	}
	CurRow = row;
}

/***************************************

	显示一个整数
	入口参数:整数数值,起始显示位置,长度

****************************************/
void DispIntU(INT32U val,INT8U len)
{
	INT32U n = 1;
	INT8U i;
	
   	for (i=1;i<len;i++)
		n *= 10;

	for (i=0;i<len;i++)
	{
		DispChr(val/n +'0');
		val %= n;
		n /= 10;
	}
}


void DispIntS(INT32S val,INT8U len)
{
	INT32U n = 1;
	INT8U i;
	
	if (val < 0)
	{
		val = 0 - val;
		DispChr('-');
	}
	else
	{
		DispChr('+');
	}

   	for (i=1;i<len;i++)
		n *= 10;

	for (i=0;i<len;i++)
	{
		DispChr(val/n +'0');
		val %= n;
		n /= 10;
	}
}

/***************************************

	显示一个字符
	入口参数:字符,显示位置,是否闪烁

****************************************/
void DispHZ(INT8U cv)
{
	INT8U *pF;
	INT8U n,row,col;

	row = CurRow;
	col = CurCol;

	pF = (INT8U *)FontHZ14x14;
	pF += cv*(14*2);

	n = 0;
	while (1)
	{
		LCD_Disp_Pic(pF+n*14,14);
		n++;
		if (n>= 2)
			break;
		CurRow ++;
		CurCol = col;
	}
	CurRow = row;
}

/***************************************

	显示一个浮点数
	注:无超显示范围判断
		使用全部的显示区域

****************************************/
void DispFloat(float val,INT8U Len)
{
	INT8U IntLen,n;
	INT32U iv,ivf;

	/* 符号位处理 */
	if (val < 0)
		{
		DispChr('-');
		val = -val;
		Len --;
		}
		
	/* 整数位数计算 */
	IntLen = GetIntLen((INT32U)val);	

	/* 整数部分 */
	iv = (INT32U)val;
	/* 显示整数部分 */
	DispIntU(iv,IntLen);
	/* 显示小数点 */
	DispChr('.');

	/*  */
	val -= iv;
	for (n=0;n<(Len-IntLen);n++)
		{
		val *= 10;
		}
	ivf = (INT32U)val;
	ivf += 5;
	ivf /= 10;
	

	/* 显示小数部分 */
	DispIntU((INT32U)ivf,Len-IntLen-1);
}

/***************************************

	显示清屏

****************************************/
void DispCls(void)
{
	DispXYSet(0,0);
	LCD_Disp_Pattern(0,128);
	DispXYSet(1,0);
	LCD_Disp_Pattern(0,128);
	DispXYSet(2,0);
	LCD_Disp_Pattern(0,128);
	DispXYSet(3,0);
	LCD_Disp_Pattern(0,128);
	DispXYSet(4,0);
	LCD_Disp_Pattern(0,128);
	DispXYSet(5,0);
	LCD_Disp_Pattern(0,128);
	DispXYSet(6,0);
	LCD_Disp_Pattern(0,128);
	DispXYSet(7,0);
	LCD_Disp_Pattern(0,128);
}



/***************************************

	屏初始化

****************************************/
void DispInit(void)
{
	INT16U i;
	Pin_CS1 = 0;
	Pin_CS2 = 0;

	for (i=0;i<5000;i++)
		Pin_RST = 0;
	for (i=0;i<5000;i++)
		Pin_RST=1;			//使RST无效后延时一段时间(若不,则后续指令无效,原12864无需亦可???延时取255还不够!!!)

	Pin_E=0;
	Pin_RS=1;	
	Pin_RW=1;

	Pin_CS1 = 1;

	LCD_Cmd(0x3F);	  		//LCD_ON
	LCD_Cmd(0xC0|0);		 	//LCD_STARTLINE
	LCD_Cmd(0xB8|0);			//LCD_ROW
	LCD_Cmd(0x40|0);	  		//LCD_COL

	Pin_CS1 = 0;

	CurCol = 0;
	CurRow = 0;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -