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

📄 lcd.c

📁 液晶显示驱动ST7920 使用8位并口驱动的
💻 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 + -