📄 lcd.c
字号:
/* FILE :LCDdriver.c */
/* DATE :Tue, Mar 17, 2009 */
/* DESCRIPTION :main program file. */
/* CPU GROUP :11 */
/* */
/* This file is generated by Renesas Project Generator (Ver.4.8). */
/* */
/***********************************************************************/
#include "sfr_r811.h"
#include "LCD.h"
#include "I2C.h"
/***********************************************************************/
/* NAME :DelayNs */
/* Parameters :i */
/* Returns :无 */
/* Description :延时函数,用于总线延时 */
/* */
/***********************************************************************/
void DelayNs(unsigned char i)
{
for(;i>0;i--);
}
/***********************************************************************/
/* NAME :WriteCom */
/* Parameters :cmd */
/* Returns :无 */
/* Description :写控制命令函数 */
/* */
/***********************************************************************/
void WriteCom(unsigned char cmd) /* 写控制命令函数 */
{ unsigned char snd[1];
unsigned char i;
I2C_Gets(0x3f,0x0000,0,snd,1);
snd[0] = (snd[0]&0xfb)|0x04;
I2C_Puts(0x3f,0x0000,0,snd,1);
RS_d = 1; /* 将控制口的方向都设置为输出 */
RW_d = 1;
EN_d = 1;
i = cmd & 0x0f; /* 先写入低四比特 */
pd1 = pd1 | 0x0f; /* 设置数据端口为输出 */
Clr_RW(); /* 清零RW */
p1 = (p1&0xf0)|i; /* 将数据输出 */
DelayNs(26); /* 延时 */
Set_RW(); /* 将RW信号拉高 */
DelayNs(45);
Clr_RW();
i = cmd >> 4; /* 然后将高四比特发出 */
p1 = (p1&0xf0)|i;
DelayNs(26);
Set_RW();
DelayNs(45);
Clr_RW();
Clr_RS(); /* 以下是将数据发送至液晶屏的具体时序 */
Clr_RW();
DelayNs(20);
Set_EN();
DelayNs(140);
Clr_EN();
DelayNs(100);
}
/***********************************************************************/
/* NAME :WriteDat */
/* Parameters :DAT */
/* Returns :无 */
/* Description :向液晶屏内写一字节数据 */
/* */
/***********************************************************************/
void WriteDat(unsigned char DAT) /* 向液晶屏内写一字节数据 */
{
unsigned char i;
RS_d = 1; /* 将控制口设置为输出方式 */
RW_d = 1;
EN_d = 1;
i = DAT & 0x0f; /* 先写入低四比特 */
pd1 = pd1 | 0x0f; /* 设置数据端口为输出 */
Clr_RW(); /* 清零RW */
p1 = (p1&0xf0)|i; /* 将数据输出 */
DelayNs(26); /* 延时 */
Set_RW(); /* 将RW信号拉高 */
DelayNs(45);
Clr_RW();
i = DAT >> 4; /* 然后将高四比特发出 */
p1 = (p1&0xf0)|i;
DelayNs(26);
Set_RW();
DelayNs(45);
Clr_RW();
Set_RS(); /* 一下是将数据发送至液晶屏的具体时序 */
Clr_RW();
DelayNs(10);
Set_EN();
DelayNs(140);
Clr_EN();
DelayNs(50);
}
/***********************************************************************/
/* NAME :Lcd_Init */
/* Parameters :无 */
/* Returns :无 */
/* Description :液晶屏初始化 */
/* */
/***********************************************************************/
void Lcd_Init(void) /* 液晶屏初始化 */
{
unsigned char cmd;
unsigned char snd[1];
Reset_d = 1;
Reset = 1;
I2C_Gets(0x3f,0x0000,0,snd,1);
snd[0] = (snd[0]&0x9B)|0x24;
I2C_Puts(0x3f,0x0000,0,snd,1);
cmd = 0x30; /* 功能设置,基本指令 */
WriteCom(cmd); /* 写指令 */
DelayNs(75);
cmd = 0x0C; /* 显示状态 ON 游标OFF 反白OFF */
WriteCom(cmd); /* 写指令 */
DelayNs(75);
cmd = 0x01; /* 清除显示 */
WriteCom(cmd); /* 写指令 */
DelayNs(1000);
cmd = 0x06; /* 地址归位 */
WriteCom(cmd); /* 写指令 */
DelayNs(75);
cmd = 0x02; /* 设置DDRAM地址 */
WriteCom(cmd); /* 写指令 */
DelayNs(75);
}
/***********************************************************************/
/* NAME :Char_Set_XY */
/* Parameters :x,y,*p */
/* Returns :无 */
/* Description :向液晶屏特定的位置写数据 */
/* */
/***********************************************************************/
void Char_Set_XY(unsigned char x,unsigned char y,unsigned char *p)
{
if(y == 0) /* 如果是第一行则发送第一行地址。以下类似 */
{
WriteCom(0x80+x);
DelayNs(75);
}
if(y == 1)
{
WriteCom(0x90+x);
DelayNs(75);
}
if(y == 2)
{
WriteCom(0x88+x);
DelayNs(75);
}
if(y == 3)
{
WriteCom(0x98+x);
DelayNs(75);
}
while(*p != 0)
{
WriteDat(*p++); /* 给相应地址写数据 */
DelayNs(75);
}
}
/***********************************************************************/
/* end of file */
/* */
/***********************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -