📄 lcd7920.c
字号:
#include "Lcd7920.h"
#define LINEWIDTH 18 /* 中文LCD行宽 */
#define LINES 2 /* 中文LCD行数 */
/*--------------------------------------------------------------------
函数功能:LCD初始化
输 入:无
输 出:无
调 用:
修改日期: 2007.12.28
作 者:TOM
备 注:
--------------------------------------------------------------------*/
void LCD_Init(void)
{
Delay_nms(100);
/* 端口初始化 */
LCD_CONTROL_DDR=0xFF;
CLRBIT(LCD_CONTROL_PORT,E);
CLRBIT(LCD_CONTROL_PORT,RW);
Delay_nms(1);
LCD_WriteCmd(0x20);
LCD_WriteCmd(0x20);
LCD_WriteCmd(0x0C);
LCD_WriteCmd(0x06);
LCD_Clear();
}
/*--------------------------------------------------------------------
函数功能:LCD清屏
输 入:无
输 出:无
调 用:
修改日期: 2007.12.28
作 者:TOM
备 注:
--------------------------------------------------------------------*/
void LCD_Clear(void)
{
LCD_WriteCmd(0x01);
Delay_nms(1);
}
/*--------------------------------------------------------------------
函数功能:检查LCD是否处于忙状态
输 入:无
输 出:无
调 用:
修改日期: 2007.12.28
作 者:TOM
备 注:
--------------------------------------------------------------------*/
void LCD_CheckState(void)
{
unsigned char dat;
CLRBIT(LCD_CONTROL_PORT,RS);
//SETBIT(LCD_CONTROL_PORT,RW);
LCD_DATA_DDR=0x00;
do
{
SETBIT(LCD_CONTROL_PORT,E);
NOP();
CLRBIT(LCD_CONTROL_PORT,E);
}
while (LCD_DATA_PIN&0x80);
}
/*--------------------------------------------------------------------
函数功能:往LCD端口写数据
输 入:senddata 要发送到LCD端口的字节
输 出:无
调 用:
修改日期: 2007.12.28
作 者:TOM
备 注:
--------------------------------------------------------------------*/
void LCD_Send(unsigned char senddata)
{
unsigned char i;
for(i=0;i<8;i++)
{
if((senddata)&0x80)
{
SETBIT(LCD_CONTROL_PORT,RW);
}
else
{
CLRBIT(LCD_CONTROL_PORT,RW);
}
SETBIT(LCD_CONTROL_PORT,E);
NOP();
CLRBIT(LCD_CONTROL_PORT,E);
senddata<<=1;
}
}
/*--------------------------------------------------------------------
函数功能:写一个命令到LCD
输 入:scmd 要发送到LCD的命令
输 出:无
调 用:
修改日期: 2007.12.28
作 者:TOM
备 注:
--------------------------------------------------------------------*/
void LCD_WriteCmd(unsigned char scmd)
{
LCD_Send(0xf8);
LCD_Send(scmd&0xf0);
LCD_Send(scmd<<4);
Delay_nus(20);
}
/*--------------------------------------------------------------------
函数功能:写一个数据到LCD
输 入:scmd 要发送到LCD的数据
输 出:无
调 用:
修改日期: 2007.12.28
作 者:TOM
备 注:
--------------------------------------------------------------------*/
void LCD_WriteData(unsigned char DData)
{
LCD_Send(0xfa);
LCD_Send(DData&0xf0);
LCD_Send(DData<<4);
Delay_nus(20);
}
/*--------------------------------------------------------------------
函数功能:设置光标位置,先Y坐标后X坐标
输 入:Y LCD的行位置
X LCD的列位置
输 出:无
调 用:
修改日期: 2007.12.28
作 者:TOM
备 注:
--------------------------------------------------------------------*/
void LCD_Set_xy(unsigned char Y, unsigned char X)
{
unsigned char i=0x00;
switch(Y & 0x0f) /* 确定行号 */
{
case 0x00:
i=0x80;
break;
case 0x01:
i=0x90;
break;
case 0x02:
i=0x88;
break;
case 0x03:
i=0x98;
break;
default :
break;
}
i = (X & 0x0f)|i; /* 确定列号 */
LCD_WriteCmd(i);
}
/*--------------------------------------------------------------------
函数功能:按指定位置写一个字符到LCD
输 入:Y LCD的行位置
X LCD的列位置
c1 要写入的字符
输 出:无
调 用:
修改日期: 2007.12.28
作 者:TOM
备 注:
--------------------------------------------------------------------*/
void LCD_WriteChar(unsigned char X,unsigned char Y,unsigned char c1)
{
LCD_WriteCmd(0x34);
LCD_WriteCmd(0x30);
LCD_Set_xy(X,Y);
LCD_WriteData(c1);
Delay_nms(1);
}
/*--------------------------------------------------------------------
函数功能:指定光标位置,写字符串到LCD显示
输 入:Y LCD的行位置
X LCD的列位置
pstr1 要写入的字符串指针
输 出:无
调 用:
修改日期: 2007.12.28
作 者:TOM
备 注:
--------------------------------------------------------------------*/
void LCD_WriteStr(unsigned char X,unsigned char Y,unsigned char *pstr1)
{
unsigned char j;
unsigned char *pstr = pstr1;
LCD_WriteCmd(0x34);
LCD_WriteCmd(0x30);
LCD_Set_xy(Y,X);
j=Y * LINEWIDTH + X;
while (*pstr && j< (LINEWIDTH * LINES))
{
if (j%LINEWIDTH==0) /* 判断是否换行 */
{
LCD_Set_xy(j/LINEWIDTH,0); /* 如换行, 则光标移动到行首 */
}
/* 避免最后一格写半个汉字, 把汉字写到下一行 */
if (((j+1)%2==0) && *pstr>127 && *(pstr-1)<128)
{
LCD_WriteData(' ');
j++;
}
else
{
LCD_WriteData(*pstr++);
j++;
}
}
Delay_nms(1); //2006.11.19
}
/*--------------------------------------------------------------------
函数功能:从显示屏的初始位置写入字符串,自动换行
输 入:pstr1 要写入的字符串指针
输 出:无
调 用:
修改日期: 2007.12.28
作 者:TOM
备 注:
--------------------------------------------------------------------*/
void LCD_WriteStrAuto(unsigned char *pstr1)
{
unsigned char i;
unsigned char j;
unsigned char *pstr = pstr1;
LCD_WriteCmd(0x34);
LCD_WriteCmd(0x30);
for(i=0;i<36;i++) /* 清空屏幕 */
{
if (i%18==0) /* 判断是否换行 */
{
LCD_Set_xy(i/18,0); /* 如换行, 则光标移动到行首 */
}
LCD_WriteData(' ');
}
j=0;
while (*pstr && j<36)
{
if (j%18==0) /* 判断是否换行 */
{
LCD_Set_xy(j/18,0); /* 如换行, 则光标移动到行首 */
}
/* 避免最后一格写半个汉字, 把汉字写到下一行 */
if (((j+1)%2==0) && *pstr>127 && *(pstr-1)<128)
{
LCD_WriteData(' ');
j++;
}
else
{
LCD_WriteData(*pstr++);
j++;
}
}
Delay_nms(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -