240128液晶屏,搞了一个星期了,都没能显示字符,求救了,哪位大神愿意不吝赐教啊,万分感谢
以下是源程序: |
#include "LCD_240128.h"
//========================================================================
// 函数: void LCD_DataWrite(unsigned int Data)
// 描述: 写一个字节的显示数据至 LCD 中的显示缓冲 RAM 当中
// 参数: Data 写入的数据
// 返回: 无
// 备注: 无
// 版本:
//========================================================================
void LCD_DataWrite(unsigned char Data)
{
LCD_CD_SetLow();
LCD_CE_SetLow();
LCD_WR_SetLow();
// __delay_us(5);
LATC = Data;
__delay_us(5);
LCD_WR_SetHigh();
LCD_CE_SetHigh();
// LCD_CD_SetHigh();
}
//========================================================================
// 函数: void LCD_CmdWrite(unsigned int Command)
// 描述: 写一个字节的数据至 LCD 中的控制寄存器当中
// 参数: Command 写入的命令,低八位有效(byte)
// 返回: 无
// 备注: 无
// 版本:
//========================================================================
void LCD_CmdWrite(unsigned char Command)
{
LCD_CD_SetHigh();
LCD_CE_SetLow();
LCD_WR_SetLow();
// __delay_us(5);
LATC = Command;
__delay_us(5);
LCD_WR_SetHigh();
LCD_CE_SetHigh();
// LCD_CD_SetLow();
}
/******************************************************************************
*名称: WriteDC()
*功能: 液晶写1数据1命令程序,dat为要写入的数据,cmd为要写入的命令
******************************************************************************/
void WriteDC(unsigned char Data,unsigned char Command) //写一个数据和一个指令
{
LCD_DataWrite(Data);
LCD_CmdWrite(Command);
}
/******************************************************************************
*名称: WriteDDC()
*功能: 液晶写2数据1命令程序,data为要写入的数据,cmd为要写入的命令
******************************************************************************/
void WriteDDC(unsigned char Data1, unsigned char Data2, unsigned char Command) //写两个数据和一个指令
{
LCD_DataWrite(Data1);
LCD_DataWrite(Data2);
LCD_CmdWrite(Command);
}
/******************************************************************************
*名称: LCD_Init()
*功能: 液晶初始化程序
* 初始地址设置好后,在不同的地址段相同WriteData()输出不同
******************************************************************************/
void LCD_Init(void) //液晶初始化
{
unsigned char Data1,Data2,Command;
LCD_WR_SetHigh();
LCD_CE_SetHigh();
// LCD_RST_SetLow();
// __delay_us(5);
LCD_RST_SetHigh();
/*********************设置文本显示*****************************/
Data1 = 0x00;
Data2 = 0x10; //图形显示占用32*128=0xfff,故文本从0x1000开始
Command = 0x40; //设置文本显示区首地址
WriteDDC(Data1,Data2,Command);
Data1 = 0x20; //可以整屏显示
Data2 = 0x00;
Command = 0x41; //设置文本显示区宽度
WriteDDC(Data1,Data2,Command);
Data1 = 0x00;
Data2 = 0x00;
Command = 0x42; //设置图形显示区首地址
WriteDDC(Data1,Data2,Command);
Data1 = 0x20;
Data2 = 0x00;
Command = 0x43; //设置图形显示区宽度
WriteDDC(Data1,Data2,Command);
Command =0xa2; //设置光标形状
LCD_CmdWrite(Command);
Command = 0x80; //显示方式设置
//启用外部字符发生器,显示方式是文本与图形与
LCD_CmdWrite(Command);
Command = 0x9e; //启用光标闪烁,光标不显示,文本显示与图形显示
LCD_CmdWrite(Command);
}
unsigned char Photo_code[] =
{
/*---- 图片文件来自:【xxxx.jpg】 ----*/
/*---- 图片宽度:96 图片高度:93 ----*/
/*---- 本数据文件建立日期: ; 建立时间: ----*/
/*---- 本数据文件由PICtoCODE【图片数据生成器】V1.0自动生成! ----*/
};
#define CG_length 352
unsigned char CG_code[] =
{
};
/******************************************************************************
*名称: Write_Str()
*功能: 液晶写字符程序,显示ASCII字符,row为行(0~15),rol为列(0~29)
* 显示ASCII字符为8*8点阵(屏为240*128点阵)
******************************************************************************/
void Write_Str(unsigned char row,unsigned char rol,unsigned char str)
{
unsigned int addres;
unsigned char Data1,Data2;
addres=row*32+rol+0x1000;
Data2=addres>>8;
Data1=addres;
WriteDDC(Data1,Data2,0x24);
LCD_CmdWrite(0xb0);
LCD_DataWrite(str);
LCD_CmdWrite(0xb2);
}
/******************************************************************************
*名称: Write_Photo()
*功能: 液晶画图程序,row为图片开始行(0~127),rol为图片开始列(0~29),
* width为图片长(单位Bit),deep 为图片宽(单位bit)
******************************************************************************/
void Write_Photo(unsigned char row,unsigned char rol,unsigned char width,unsigned char deep)
{
unsigned int address,Photolength,i;
unsigned char j,Data1,Data2,Command;
Photolength=width*deep;
address = row*32+rol;
Data1 = address; //取地址低八位
Data2 = address>>8; //取地址高八位
Command = 0x24;
WriteDDC(Data1,Data2,Command);
LCD_CmdWrite(0xb0);//自动写模式
for(i=0;i<Photolength;i++)
{
LCD_DataWrite(Photo_code);
j++;
if(j==width)
{
LCD_CmdWrite(0xb2); //退出自动写模式
address=address+32;
Data1 = address; //取地址低八位
Data2 = address>>8; //取地址高八位
Command = 0x24;
WriteDDC(Data1,Data2,Command);
j=0;
LCD_CmdWrite(0xb0); //进入自动写模式
}
}
LCD_CmdWrite(0xb2);
}
/******************************************************************************
*名称: Write_Chinese()
*功能: 液晶写汉字程序,row为汉字开始行,rol为汉字开始列,Chinese为汉字字符串在
* CGRAM中的初地址 ,length为汉字字符串的长度,(一个16*16点阵的汉字长度为4)
******************************************************************************/
void SetCGRAM(void)
{
unsigned char Data1,Data2,Command;
unsigned int i;
Data1 = 0x03;
Data2 = 0x00; //设置偏移地址寄存器
Command = 0x22;
WriteDDC(Data1,Data2,Command);
Data1 = 0x00;
Data2 = 0x1c;
Command = 0x24; //设置地址指针
WriteDDC(Data1,Data2,Command);
Command = 0xb0; //进入自动写模式
LCD_CmdWrite(Command);
for (i = 0;i < CG_length; ++i)
{
LCD_DataWrite(CG_code);
}
Command = 0xb2; //退出自动写模式
LCD_CmdWrite(Command);
}
/******************************************************************************
*名称: Write_Chinese()
*功能: 液晶写汉字程序,row为汉字开始行(0~15),rol为汉字开始列(0~29),
* Chinese为汉字字符串在CGRAM中的初地址 ,
* length为汉字字符串的长度,(一个16*16点阵的汉字长度为4)
******************************************************************************/
void Write_Chinese(unsigned char row,unsigned char rol,unsigned char Chinese,unsigned char length) // 0x80 0x82 0x84 86
{ // 0x81 0x83 0x85 87
unsigned char Data1,Data2,Command;
unsigned char i;
unsigned int address;
/****************先写汉字上半部分*********************************/
address = row * 32 + rol+0x1000;
Data1 = address; //取地址低八位
Data2 = address>>8; //取地址高八位
Command = 0x24; //设置地址指针,字符显示首位置
WriteDDC(Data1,Data2,Command);
Command = 0xb0; //进去自动写模式
LCD_CmdWrite(Command);
for(i=0;i<length;i++)
{
LCD_DataWrite(Chinese+i);
i++;
}
Command = 0xb2; //退出自动写模式
LCD_CmdWrite(Command);
/****************再写汉字下半部分*********************************/
address = address+32;
Data1 = address; //取地址低八位
Data2 = address>>8; //取地址高八位
Command = 0x24; //设置地址指针,字符显示首位置
WriteDDC(Data1,Data2,Command);
Command = 0xb0; //进去自动写模式
LCD_CmdWrite(Command);
for(i=1;i<length;i++)
{
LCD_DataWrite(Chinese+i);
i++;
}
Command = 0xb2; //退出自动写模式
LCD_CmdWrite(Command);
}
|