📄 lcd_grf.c
字号:
/***********************************************************************************************
** 文件名称:_LCD_C
** 功能说明:ST7920驱动LCD显示软件包
** 使用说明:软件包用到LPC213x的二个引脚,默认为P1.24,P1.25,如需修改,请修改头文件中的宏定义数据即可
(接触一天,时间不足,理解不深,代码有待优化,鉴谅)
***********************************************************************************************/
//#include "config.h"
#include <REG52.H> /* special function register declarations */
#include "LCD.h"
uint8 h=0,l=0;
/***********************************************************************************************
** 函数名称:LCD_Init()
** 函数功能:LCD初始化
** 入口参数:无
** 出口参数:无
***********************************************************************************************/
void LCD_Init(void)
{
//PIN_INITI;
PSB = 0;
RST = 0;
LCD_Dly(50);
RST=1;
LCD_Dly(50); //启动等待,等LCM讲入工作状态
LCD_Write(0,0x30); //8 位介面,基本指令集
LCD_Write(0,0x0c); //显示打开,光标关,反白关
LCD_Write(0,0x01); //清屏,将DDRAM的地址计数器归零
}
void LCD_InitG()
{
//PIN_INITI;
PSB = 0;
RST = 0;
LCD_Dly(2);
RST=1;
LCD_Dly(2); //启动等待,等LCM讲入工作状态
LCD_Write(0,0x36); //8 位介面,基本指令集
// LCD_Write(0,0x0c); //显示打开,光标关,反白关
//LCD_Write(0,0x01); //清屏,将DDRAM的地址计数器归零
}
/***********************************************************************************************
** 函数名称:LCD_WStr()
** 函数功能:显示字符串
** 入口参数:addr 显示的地址
** ptr 要显示的字符串的首地址
** 出口参数:无
***********************************************************************************************/
void LCD_WStr(uint8 addr,char *ptr)
{
LCD_Write(WIR,addr);
//LCD_Dly(1);
while(*ptr!=0)
{
LCD_Write(WDATA,*ptr++);
// LCD_Dly(1);
}
}
/***********************************************************************************************
** 函数名称:LCD_Write()
** 函数功能:LCD写指令或数据
** 入口参数:control_flow: 数据控制流,0 为写指令 1 为写数据
ddata: 数据
** 出口参数:无
***********************************************************************************************/
void LCD_Write(unsigned char control_flow, unsigned char ddata)
{
unsigned char start_data,Hdata,Ldata;
if(control_flow==0) start_data=0xf8; //写指令
else start_data=0xfa; //写数据
CS=1;
Hdata=ddata&0xf0; //取高四位
Ldata=(ddata<<4)&0xf0; //取低四位
LCD_SendByte(start_data); //发送起始信号
LCD_Dly(2); //延时是必须的
LCD_SendByte(Hdata); //发送高四位
LCD_Dly(2); //延时是必须的
LCD_SendByte(Ldata); //发送低四位
LCD_Dly(2); //延时是必须的
CS=0;
}
/***********************************************************************************************
** 函数名称:LCD_SendByte()
** 函数功能:发送一个字节
** 入口参数:bbyte 字节数据
** 出口参数:无
***********************************************************************************************/
void LCD_SendByte(unsigned char bbyte)
{
unsigned char i;
for(i=0;i<8;i++)
{
if( (bbyte&0x80)!=0 ) SID_1;
else
{
SID_0 ; //SID=bbyte&0x80;取出最高位
}
SCKL_1; //SCLK=1;
i=i;
SCKL_0; //SCLK=0;
bbyte<<=1; //左移
}
}
/***********************************************************************************************
** 函数名称:LCD_Dly()
** 函数功能://延时
** 入口参数:dly 延时参数,值越大,延时时间越长
** 出口参数:无
***********************************************************************************************/
void LCD_Dly(unsigned int dly)
{
unsigned int i,j;
for(i=dly;i>0;i--)
for(j=5;j>0;j--);
}
/***********************************************************************************************
** 函数名称:LCD_Test()
** 函数功能:图形方式下屏幕全黑
** 入口参数:无
** 出口参数:无
***********************************************************************************************/
/*void LCD_Test(void)
{
unsigned char i,j;
for(i=0;i<32;i++)
{
LCD_Write(0,0x80+i);
LCD_Write(0,0x80);
for(j=0;j<16;j++)
LCD_Write(1,0xff);
}
for(i=0;i<32;i++)
{
LCD_Write(0,0x80+i);
LCD_Write(0,0x88);
for(j=0;j<16;j++)
LCD_Write(1,0xff);
}
}
/***********************************************************************************************
** 函数名称:LCD_GPCLS()
** 函数功能:图形方式下清屏
** 入口参数:无
** 出口参数:无
***********************************************************************************************/
void LCD_GPCLS(void)
{
unsigned char i,j;
LCD_Write(0,0x36);
for(i=0;i<32;i++)
{
LCD_Write(0,0x80+i);
LCD_Write(0,0x80);
for(j=0;j<16;j++)
LCD_Write(1,0x00);
}
for(i=0;i<32;i++)
{
LCD_Write(0,0x80+i);
LCD_Write(0,0x88);
for(j=0;j<16;j++)
LCD_Write(1,0x00);
}
}
/***********************************************************************************************
** 函数名称:Draw_point()
** 函数功能:图形方式下画点函数
** 入口参数:x:横坐标(0-127)
y:纵坐标(0-63)
** 出口参数:无
***********************************************************************************************/
void Draw_point(uint8 x,uint8 y)
{
uint8 i,j,z,k,L,H;
uint16 temp=0x8000;
i=x/16;
j=x%16;
z=y/32;
k=y%32;
temp>>=j;
L=(uint8)temp;
H=(uint8)(temp>>8);
LCD_Write(0,0x80+k);
LCD_Write(0,0x80+z*8+i);
LCD_Write(1,H);
LCD_Write(1,L);
}
/***********************************************************************************************
** 函数名称:Draw_x()
** 函数功能:图形方式下画横坐标线函数
** 入口参数:y:纵坐标(0-63)
** 出口参数:无
** 特别说明:要先画纵坐标轴,再画横坐标轴
***********************************************************************************************/
void Draw_x(uint8 y)
{
uint8 z,k,m;
z=y/32;
k=y%32;
for(m=0;m<8;m++)
{
LCD_Write(0,0x80+k);
LCD_Write(0,0x80+z*8+m);
LCD_Write(1,0xff);
LCD_Write(1,0xff);
}
}
/***********************************************************************************************
** 函数名称:Draw_y()
** 函数功能:图形方式下画横坐标线函数
** 入口参数:x:横坐标(0-127)
** 出口参数:无
** 特别说明:要先画纵坐标轴,再画横坐标轴
***********************************************************************************************/
void Draw_y(uint8 x)
{
uint8 i,m;
i=x/16;
for(m=0;m<32;m++)
{
LCD_Write(0,0x80+m);
LCD_Write(0,0x80+i);
// LCD_Write(1,0x00);
LCD_Write(1,0x80);
}
for(m=0;m<32;m++)
{
LCD_Write(0,0x80+m);
LCD_Write(0,0x88+i);
// LCD_Write(1,0x00);
LCD_Write(1,0x80);
}
}
/***********************************************************************************************
** 函数名称:Draw_letter()
** 函数功能:图形方式下写数字字母函数
** 入口参数:x:横坐标(0-127)
y:纵坐标(0-63)
databuf1:需要写的第一个字
databuf2:需要写的第二个字
** 出口参数:无
***********************************************************************************************/
void Draw_letter(uint8 x,uint8 y,uint8 *databuf1,uint8 *databuf2)
{
uint8 m,i,z,k;
i=x/16;
z=y/32;
k=y%32;
for(m=0;m<8;m++)
{
LCD_Write(0,0x80+k+m);
LCD_Write(0,0x80+z*8+i);
LCD_Write(1,databuf1[m]);
LCD_Write(1,databuf2[m]);
}
}
/*先不要用该函数*/
void Draw_pointxy(uint8 x,uint8 y)
{
uint8 i,j,z,k,L,H;
uint16 temp=0x8000;
i=x/16;
j=x%16;
z=y/32;
k=y%32;
// l=h=0x00;
temp>>=j;
L=(uint8)temp;
H=(uint8)(temp>>8);
L|=l;
H|=h;
LCD_Write(0,0x80+k);
LCD_Write(0,0x80+z*8+i);
LCD_Write(1,H);
LCD_Write(1,L);
l=L;
h=H;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -