📄 lcd.c
字号:
/******************************************************************************************************
**文 件 名: lcd.c
**创 建 人: 梁浩荡
**最后修改日期: 2008年5月27日
**描 述: HG1223209C-YF62L-VA LCD的uc/osII底层驱动
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define IN_LCD
#include "config.h"
#define LCD_WRITE_COMMAND_MODE 1
#define LCD_WRITE_DATA_MODE 0
#define LCD_CS_PIN (1<<7)
#define LCD_RESET_PIN (1<<6)
#define LCD_SCLK_PIN (1<<5)
#define LCD_SID_PIN (1<<4)
INT8U Bitmap_INT8U[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
void InitializeLCD_FUN(void);
void LCD_Send_Command_Or_Data_FUN(INT8U WriteMode_INT8U,INT8U SendData_INT8U);
void LCD_Display_a_Sentence_FUN(INT8U StartAddress_INT8U,char * PointToSentence_INT8U,INT8U CleanDDRAM_INT8U);
void LCD_Display_a_Byte_FUN(INT8U StartAddress_INT8U,INT8U Word_INT8U);
void LCD_Display_a_Number_FUN(INT8U StartAddress_INT8U,INT8U Number_INT8U);
/****************************************************************************
* 名称:DelayNuS()
* 功能:长软件延时
* 入口参数:dly 延时参数,值为1时,延时为1us
* 出口参数:无
**------------------------------------------------------------------------------------------------------
** 作 者: 梁浩荡
** 日 期: 2008年5月27日
**------------------------------------------------------------------------------------------------------
****************************************************************************/
void DelayNuS(INT32U dly)
{
for(; dly>0; dly--) ;
}
/*********************************************************************************************************
** 函数名称: InitializeLCD_FUN
** 功能描述: 初始化LCD
** 输 入:无
**
** 输 出:无
** 全局变量: LCD_WRITE_COMMAND_MODE
** 调用模块: LCD_Send_Command_Or_Data_FUN,LCD_Display_a_Sentence_FUN
**------------------------------------------------------------------------------------------------------
** 作 者: 梁浩荡
** 日 期: 2008年5月27日
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void InitializeLCD_FUN(void)
{
//char s[40]={"这一刻我们都是四川人我们都是中国人"};
char s[40] = {"向汶川大地震遇"};
char s1[40] = {"难同胞致哀!!"};
OSTimeDly(OS_TICKS_PER_SEC/10);
LCD_Send_Command_Or_Data_FUN(LCD_WRITE_COMMAND_MODE,0x30); /*功能设置:一次送8位数据,基本指令集*/
DelayNuS(2);
LCD_Send_Command_Or_Data_FUN(LCD_WRITE_COMMAND_MODE,0x18); /*点设定:显示字符/光标从左到右移位,DDRAM地址加1*/
DelayNuS(2);
LCD_Send_Command_Or_Data_FUN(LCD_WRITE_COMMAND_MODE,0x0C); /*显示设定:开显示,显示光标,当前显示位反白闪动*/
DelayNuS(2);
LCD_Send_Command_Or_Data_FUN(LCD_WRITE_COMMAND_MODE,0x01); /*清DDRAM*/
DelayNuS(2);
LCD_Send_Command_Or_Data_FUN(LCD_WRITE_COMMAND_MODE,0x02); /*DDRAM地址归位*/
DelayNuS(2);
LCD_Send_Command_Or_Data_FUN(LCD_WRITE_COMMAND_MODE,0x80); /*把显示地址设为0X80,即为第一行的首位*/
DelayNuS(2);
LCD_Display_a_Sentence_FUN(0x80,s,1);
LCD_Display_a_Sentence_FUN(0x90,s1,0);
}
/*********************************************************************************************************
** 函数名称: LCD_Display_a_Sentence_FUN
** 功能描述: LCD显示一个句子
** 输 入: StartAddress_INT8U:显示首地址 * PointToSentence_INT8U:
** 数据指针 CleanDDRAM_INT8U:清DDRAM标志
** 输 出:无
** 全局变量: LCD_WRITE_COMMAND_MODE,
** 调用模块: LCD_Send_Command_Or_Data_FUN
**------------------------------------------------------------------------------------------------------
** 作 者: 梁浩荡
** 日 期: 2008年5月27日
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void LCD_Display_a_Sentence_FUN(INT8U StartAddress_INT8U, char *PointToSentence_INT8U,INT8U CleanDDRAM_INT8U)
{
if((StartAddress_INT8U>=0x80&&StartAddress_INT8U<0x8F)||(StartAddress_INT8U>=0x90&&StartAddress_INT8U<0x9F))
{
if(CleanDDRAM_INT8U==1)
{
LCD_Send_Command_Or_Data_FUN(LCD_WRITE_COMMAND_MODE,0x01); /*清DDRAM*/
}
LCD_Send_Command_Or_Data_FUN(LCD_WRITE_COMMAND_MODE,StartAddress_INT8U);
while((*PointToSentence_INT8U!='\0')&&(StartAddress_INT8U<0x9F))
{
LCD_Send_Command_Or_Data_FUN(LCD_WRITE_DATA_MODE,*PointToSentence_INT8U++);
StartAddress_INT8U++;
if(StartAddress_INT8U==0x8F)
{
StartAddress_INT8U=0x90;
LCD_Send_Command_Or_Data_FUN(LCD_WRITE_COMMAND_MODE,StartAddress_INT8U);
}
}
}
}
/*********************************************************************************************************
** 函数名称: LCD_Display_a_Byte_FUN
** 功能描述: LCD显示一个字符
** 输 入: StartAddress_INT8U:显示首地址 Word_INT8U:显示字符
**
** 输 出:无
** 全局变量: LCD_WRITE_COMMAND_MODE,LCD_WRITE_DATA_MODE
** 调用模块: LCD_Send_Command_Or_Data_FUN
**------------------------------------------------------------------------------------------------------
** 作 者: 梁浩荡
** 日 期: 2008年5月27日
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void LCD_Display_a_Byte_FUN(INT8U StartAddress_INT8U,INT8U Word_INT8U)
{
if((StartAddress_INT8U>=0x80&&StartAddress_INT8U<0x8F)||(StartAddress_INT8U>=0x90&&StartAddress_INT8U<0x9F))
{
//LCD_Send_Command_Or_Data_FUN(LCD_WRITE_COMMAND_MODE,0x01); /*清DDRAM*/
LCD_Send_Command_Or_Data_FUN(LCD_WRITE_COMMAND_MODE,StartAddress_INT8U);
LCD_Send_Command_Or_Data_FUN(LCD_WRITE_DATA_MODE,Word_INT8U);
}
}
/*********************************************************************************************************
** 函数名称: LCD_Display_a_Number_FUN
** 功能描述: LCD显示一个字符
** 输 入: StartAddress_INT8U:显示首地址 Number_INT8U:显示数字
**
** 输 出:无
** 全局变量: LCD_WRITE_COMMAND_MODE,LCD_WRITE_DATA_MODE
** 调用模块: LCD_Send_Command_Or_Data_FUN,LCD_Display_a_Byte_FUN
**------------------------------------------------------------------------------------------------------
** 作 者: 梁浩荡
** 日 期: 2008年5月27日
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void LCD_Display_a_Number_FUN(INT8U StartAddress_INT8U,INT8U Number_INT8U)
{
if(Number_INT8U>99)
{
LCD_Display_a_Byte_FUN(StartAddress_INT8U,Number_INT8U/100+0x30);
LCD_Send_Command_Or_Data_FUN(LCD_WRITE_DATA_MODE,Number_INT8U%100/10+0x30);
LCD_Send_Command_Or_Data_FUN(LCD_WRITE_DATA_MODE,Number_INT8U%10+0x30);
}else if(Number_INT8U<100&&Number_INT8U>9)
{
LCD_Display_a_Byte_FUN(StartAddress_INT8U,Number_INT8U%100/10+0x30);
LCD_Send_Command_Or_Data_FUN(LCD_WRITE_DATA_MODE,Number_INT8U%10+0x30);
}else
{
LCD_Display_a_Byte_FUN(StartAddress_INT8U,Number_INT8U%10+0x30);
}
}
/*********************************************************************************************************
** 函数名称: LCD_Send_Command_Or_Data_FUN
** 功能描述: LCD显示一个字符
** 输 入: WriteMode_INT8U:写模式 SendData_INT8U:发送数据
**
** 输 出:无
** 全局变量: Bitmap_INT8U
** 调用模块:
**------------------------------------------------------------------------------------------------------
** 作 者: 梁浩荡
** 日 期: 2008年5月27日
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void LCD_Send_Command_Or_Data_FUN(INT8U WriteMode_INT8U,INT8U SendData_INT8U)
{
INT8U i,sendbyte;
IO0DIR |= LCD_CS_PIN | LCD_SCLK_PIN | LCD_SID_PIN;
IO0SET = LCD_CS_PIN;
IO0CLR = LCD_SCLK_PIN;
if(WriteMode_INT8U==1)
{
sendbyte=0xF8; //11111 rw=0=w rs=0=instructionbuffer 0
}else{
sendbyte=0xFA; //11111 rw=0=w rs=1=databuffer 0
}
for(i=0;i<8;i++)
{
if( (sendbyte&Bitmap_INT8U[7-i])!=0 ) IO0SET = LCD_SID_PIN;
else IO0CLR = LCD_SID_PIN;
DelayNuS(100);
IO0SET = LCD_SCLK_PIN;
DelayNuS(100);
IO0CLR = LCD_SCLK_PIN;
}
sendbyte=0xF0&SendData_INT8U; //HSB 0000
for(i=0;i<8;i++)
{
if( (sendbyte&Bitmap_INT8U[7-i])!=0 ) IO0SET = LCD_SID_PIN;
else IO0CLR = LCD_SID_PIN;
DelayNuS(100);
IO0SET = LCD_SCLK_PIN;
DelayNuS(100);
IO0CLR = LCD_SCLK_PIN;
}
sendbyte=0x0F&SendData_INT8U; //0000 LSB
sendbyte<<=4; //LSB 0000
for(i=0;i<8;i++)
{
if( (sendbyte&Bitmap_INT8U[7-i])!=0 ) IO0SET = LCD_SID_PIN;
else IO0CLR = LCD_SID_PIN;
DelayNuS(100);
IO0SET = LCD_SCLK_PIN;
DelayNuS(100);
IO0CLR = LCD_SCLK_PIN;
}
IO0CLR = LCD_CS_PIN;
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -