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

📄 disp.c

📁 单片机的多级通讯程序 包含有keil源程序 和proteus的仿真程序
💻 C
字号:
/*
****************************************************

		显示

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

#include <reg52.H>
#include "Typedef.H"
#include "UserDef.H"
#include "Disp.h"
#include "Font.H"


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


/*  全局变量 */
static INT8U CurRow = 0;		//当前行
static INT8U CurCol = 0;		//当前列
static INT8U CurFont = 0; 		//当前英文字体				

/***************************************
	LCD忙等待
****************************************/
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数据写
****************************************/
void LCD_Data(INT8U Data)
	{
	Busy();
	
	Pin_E = 0;
	Pin_RW = 0;		//写
	Pin_RS = 1;		//数据

	Pin_E = 1;

	DISPDATAPORT = Data;

	Pin_E = 0;
	}

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

	LCD命令写

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

	Pin_E = 1;

	DISPDATAPORT = cmd;

	Pin_E = 0;
	}

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

	显示图案	

****************************************/
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 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 DispInt(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;
		}
	}


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

	显示一个字符
	入口参数:字符(只支持ASCII码字符)

****************************************/
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;
	}

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

	显示一个字符串
	入口参数:字符串指针(只支持ASCII码字符)

****************************************/
void DispStr(char *str)
	{
	while (*str != 0)
		{
		DispChr(*str);
		str++;
		}
	}
/***************************************

	显示一个汉字
	入口参数:汉字字符编号(见font.h)

****************************************/
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;
	/* 显示整数部分 */
	DispInt(iv,IntLen);
	/* 显示小数点 */
	DispChr('.');

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

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

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

	显示清屏

****************************************/
void DispCls(void)
	{
	char i;

	for (i=0;i<8;i++)
		{
		DispXYSet(i,0);
		LCD_Disp_Pattern(0x00,128);
		}
	}



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

	屏初始化

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

	for (i=0;i<50;i++)
		Pin_RST = 0;
	for (i=0;i<50;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;


	Pin_CS2 = 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_CS2 = 0;

	CurCol = 0;
	CurRow = 0;
	}

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

	设置当前的显示坐标
	入口参数:行

****************************************/
void DispXYSet(INT8U Row,INT8U Col)
	{
	CurRow = Row;
	CurCol = Col;
	}

/***************************************
	设置当前的显示字体(只支持ASCII码字符)
	入口参数:字体编号(见font.h)	
****************************************/
void DispFontSet(INT8U Font)
	{
	CurFont = Font;
	}

⌨️ 快捷键说明

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