📄 disp.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 + -