/****************************************
*文 件 名:lcd.c
*功能说明:LCD显示,采用TG12864E-02 LCD显示模块(带中文字库),液晶显示C文件。
*接线说明:起始地址0x8000,并行传输数据PSB选择高(H)
*版 本 号:L.00.00
*修改时间:2007-08-10
****************************************/
#include<aduc842.h>
#include<absacc.h>
#define ComWe XBYTE[0x8000] //写命令
#define DatWe XBYTE[0x8001] //写数据
#define ComRd XBYTE[0x8002] //读状态
#define DatRd XBYTE[0x8003] //读数据
/*参数定义*/
sbit BF=ACC^7; //忙碌标志位
unsigned char ClearNum=7; //数据清除位数
unsigned char code gImage_word2[1024]; //图片数组
/*函数定义*/
void Lcd_clear(); //清除显示
void Delay(unsigned int t); //延时函数
void Read_bf(void); //读忙碌
void Write_com(unsigned char d); //写命令
void Write_data(unsigned char d); //写数据
unsigned char Read_data(); //读数据
void Lcd_system(void); //LCD初始化
void Disp_picture(unsigned char *p); //显示一幅图片
void Disp_word(unsigned char pos,unsigned char *p); //显示一个汉字
void Disp_words(unsigned char posx,unsigned char *p,unsigned char n); //显示一串汉字
void Disp_char(unsigned char pos,unsigned char dat); //显示一个字符
void Disp_chars(unsigned char pos,unsigned char *p,unsigned char n); //显示一串字符
void Disp_number(unsigned char pos,unsigned long dat); //显示一个数字
void Disp_word_test(void); //显示一个汉字测试函数
void Disp_words_test(void); //显示一串汉字测试函数
void Disp_char_test(void); //显示一个字符测试函数
void Disp_chars_test(void); //显示一串字符测试函数
void Disp_number_test(void); //显示一个数字测试函数
/****************************************
*函数名称:main()
*函数功能:主函数
*输入参数:无
*还 回 值:无
*说 明:无
****************************************/
void main()
{
TMOD=0x11;
Lcd_system(); //LCD初始化
Disp_word_test(); //显示一个汉字测试
Disp_char_test(); //显示一个字符测试
Disp_words_test(); //显示一串汉字测试
Disp_chars_test(); //显示一串字符测试
Disp_number_test(); //显示一个数字测试
Disp_picture(gImage_word2); //显示一幅图片测试
while(1);
}
/****************************************
*函数名称:Lcd_clear()
*函数功能:清除显示
*输入参数:无
*还 回 值:无
*说 明:无
****************************************/
void Lcd_clear()
{
Write_com(0x01);
Write_com(0x34);
Write_com(0x30);
}
/****************************************
*函数名称:Delay(unsigned int t)
*函数功能:延时
*输入参数:t,时间参数
*还 回 值:无
*说 明:晶振采用24.0MHz时,延时(t*0.1)ms
****************************************/
void Delay(unsigned int t)
{
do
{
TH0 = 0xFF;
TL0 = 0x38;
TR0 = 1;
while ( !TF0 );
TF0 = 0;
TR0 = 0;
} while (--t);
}
/****************************************
*函数名称:Read_bf(void)
*函数功能:测忙碌
*输入参数:无
*还 回 值:无
*说 明:BF为表示内部忙碌中,BF为0方可写指令
****************************************/
void Read_bf(void)
{
BF = 1;
do
{
ACC=ComRd;
}
while(BF);
}
/****************************************
*函数名称:Write_com(unsigned char d)
*函数功能:写命令字
*输入参数:d,命令代码
*还 回 值:无
*说 明:无
****************************************/
void Write_com(unsigned char d)
{
Read_bf();
ComWe = d;
}
/****************************************
*函数名称:Write_data(unsigned char d)
*函数功能:写数据
*输入参数:d,需要写入的数据
*还 回 值:无
*说 明:无
****************************************/
void Write_data(unsigned char d)
{
Read_bf();
DatWe = d;
}
/****************************************
*函数名称:char Read_data(void)
*函数功能:读数据
*输入参数:无
*还 回 值:d,读出数据
*说 明:无
****************************************/
unsigned char Read_data(void)
{
unsigned char d = 0;
Read_bf();
d = DatRd;
return(d);
}
/****************************************
*函数名称:Lcd_system()
*函数功能:LCD初始化
*输入参数:无
*还 回 值:无
*说 明:无
****************************************/
void Lcd_system(void)
{
Write_com(0x34); //扩充指令操作
Write_com(0x30); //基本指令操作
Write_com(0x01); //清除显示
Write_com(0x06); //指定在资料写入或读取时,光标的移动方向
Write_com(0x0c); //开显示,关光标,不闪烁
}
/****************************************
*函数名称:Disp_picture(unsigned char *p)
*函数功能:显示图形
*输入参数:P,图片数组地址指针
*还 回 值:无
*说 明:无
****************************************/
void Disp_picture(unsigned char *p)
{
unsigned int j=0;
unsigned char x;
unsigned char y;
unsigned char z;
unsigned char lcd_x=0x80;
unsigned char lcd_y=0x80;
Lcd_clear(); //如果上一次显示的是图形可以不清屏
for(x=0;x<2;x++)
{
lcd_y=0x80;
for(y=0;y<32;y++)
{
Write_com(0x34);
Write_com(lcd_y);
Write_com(lcd_x);
Write_com(0x30);
for(z=0;z<16;z++)
{
Write_data(p[j]);
j++;
}
lcd_y++;
}
lcd_x=0x88;
}
Write_com(0x36);
Write_com(0x30);
}
/****************************************
*函数名称:Disp_word(unsigned char pos,unsigned int dat)
*函数功能:显示一个汉字
*输入参数:pos,显示位置(第一行:0-7,第二行:8-15,第三行:16-23,第四行:24-31)
* dat,汉字码
*还 回 值:无
*说 明:无
****************************************/
void Disp_word(unsigned char pos,unsigned char *p)
{
unsigned char row;
row=(pos/8)%2;
row=row<<4;
pos=pos%8+8*(pos/16);
Write_com(0x80|row|pos);
Write_data(p[0]);
Write_data(p[1]);
}
/****************************************
*函数名称:Disp_words(unsigned char posx,unsigned char *p,unsigned char n)
*函数功能:显示一串汉字
*输入参数:pos,显示位置(第一行:0-7,第二行:8-15,第三行:16-23,第四行:24-31)
* p,汉字码的地址指针,
* n,显示字的个数,
*还 回 值:无
*说 明:无
****************************************/
void Disp_words(unsigned char pos,unsigned char *p,unsigned char n)
{
unsigned char i=0;
unsigned char row;
unsigned char pos0;
for(i=0;i<n;i++)
{
row=(pos/8)%2;
row=row<<4;
pos0=pos%8+8*(pos/16);
Write_com(0x80|row|pos0);
Write_data(p[0]);
Write_data(p[1]);
pos++;
p=p+2;
}
}
/****************************************
*函数名称:Disp_char(unsigned char pos,unsigned char dat)
*函数功能:显示一个字母或数字
*输入参数:pos,显示位置(第一行:0-15,第二行:16-31,第一行:32-47,第二行:48-63)
* dat,数字码
*还 回 值:无
*说 明:无
****************************************/
void Disp_char(unsigned char pos,unsigned char dat)
{
unsigned char row;
unsigned char pos0;
row=(pos/16)%2;
row=row<<4;
pos0=(pos%16)/2+8*(pos/32);
Write_com(0x80|row|pos0);
if((pos+1)/2!=(pos/2))
{
Read_data();
}
Write_data(dat);
}
/****************************************
*函数名称:Disp_chars(unsigned char pos,unsigned char *p,unsigned char n)
*函数功能:显示一串字母或数字
*输入参数:pos,显示位置(第一行:0-15,第二行:16-31,第一行:32-47,第二行:48-63),
* dat,数字码
* n,显示数字或字母的个数
*还 回 值:无
*说 明:无
****************************************/
void Disp_chars(unsigned char pos,unsigned char *p,unsigned char n)
{
unsigned char i=0;
unsigned char pos0;
unsigned char row;
for(i=0;i<n;i++)
{
row=(pos/16)%2;
row=row<<4;
pos0=(pos%16)/2+8*(pos/32);
Write_com(0x80|row|pos0);
if((pos+1)/2!=(pos/2))
{
Read_data();
}
Write_data(*p);
pos++;
p++;
}
}
/****************************************
*函数名称:Disp_number(unsigned char pos,unsigned long dat)
*函数功能:显示一个数(0--4294967295)
*输入参数:pos,显示位置
* dat,显示数据
*还 回 值:无
*说 明:如果显示数据比前一次数据位数少,清楚前一次多余的数据再显示
**********************************