cyk8 发表于 2004-10-18 21:19:41

建议建立一个各种液晶的C程序 (及ysoni上传的液晶C资料)

建议建立一个各种液晶的C程序库,并且比较标准可读的,供大家参考











以下由阿莫加入:



点击此处下载液晶程序.rar





谢谢 ysoni. 上传的资料。清单如下:



12232液晶显示程序在sed1520.rar

122x32液晶显示程序,显示图形及汉字.rar

122x32液晶显示程序显示图形及汉字.rar

12864液晶驱动.rar

128x64液晶显示例程.rar

1601液晶程序.html

1601液晶程序.mht

1602LCM液晶显示屏的驱动函数和实例.rar

1602液晶的程序移植到了ATMEGA8上.txt

1602液晶显示的实验例子.txt

16x2lcm液晶_c51.rar

16x2字符液晶屏驱动演示程序总线方式.htm

51控制1602液晶的原理图和程序.rar

AT89C51与字符型液晶模块16x2联接的C语言程序.rar

HD61202控制器的128X64的液晶驱动包12864.rar

KS0070(44780) 16x2 字符液晶屏驱动演示程序.htm

LCD320.rar

lcd44780.rar

LCM046笔段式液晶.zip

LYM1602C4.rar

sed1520液晶控制器.pdf

单片机是怎样在液晶上显示字符.pdf

点阵图形液晶驱动程序,采用模拟时序接法和编程.c

液晶驱动程序LCD20040411.rar

液晶显示1602与遥控程序演示.rar

一个C语言实现菜单的例子.rar

armok 发表于 2004-10-18 21:20:54

好提议!



那位高手愿意操刀?

bailei 发表于 2004-10-18 21:24:56

液晶都没碰过,也很想知道具体怎么样写...- -

不过什么都要阿莫和527奉献又不太好意思,毕竟这也要花费时间和精力- -

如果以后我自己搞懂了,很愿意自己来写....

cyk8 发表于 2004-10-18 21:25:11

可以先从6963开始,先贴一个,然后大家讨论修改,最后变成标准的,

cyk8 发表于 2004-10-18 21:25:24

可以先从6963开始,先贴一个,然后大家讨论修改,最后变成标准的,

armok 发表于 2004-10-18 21:26:56

我在从m8移值到m16时,发现由于引脚的不同,程序的define要做点修改。如果建成C程序库后,也得考虑这个问题。



不过,由于我目前仅使用一到两种液晶,是否建成C程序库,不是很急的问题。

ysoni 发表于 2004-10-19 09:11:15

这是我收集的一些液晶程序,希望对需要的朋友有用。

点击此处下载液晶程序.rar

armok 发表于 2004-10-19 09:14:02

谢谢 ysoni. 果然是花了不少时间收集的。清单如下:



12232液晶显示程序在sed1520.rar

122x32液晶显示程序,显示图形及汉字.rar

122x32液晶显示程序显示图形及汉字.rar

12864液晶驱动.rar

128x64液晶显示例程.rar

1601液晶程序.html

1601液晶程序.mht

1602LCM液晶显示屏的驱动函数和实例.rar

1602液晶的程序移植到了ATMEGA8上.txt

1602液晶显示的实验例子.txt

16x2lcm液晶_c51.rar

16x2字符液晶屏驱动演示程序总线方式.htm

51控制1602液晶的原理图和程序.rar

AT89C51与字符型液晶模块16x2联接的C语言程序.rar

HD61202控制器的128X64的液晶驱动包12864.rar

KS0070(44780) 16x2 字符液晶屏驱动演示程序.htm

LCD320.rar

lcd44780.rar

LCM046笔段式液晶.zip

LYM1602C4.rar

sed1520液晶控制器.pdf

单片机是怎样在液晶上显示字符.pdf

点阵图形液晶驱动程序,采用模拟时序接法和编程.c

液晶驱动程序LCD20040411.rar

液晶显示1602与遥控程序演示.rar

一个C语言实现菜单的例子.rar

Bigyu 发表于 2004-10-19 14:44:44

感谢ysoni 分享哦!



我想“程序的define要做点修改”,这点通过不同版本的头文件来解决。

例如:Lcd1206_m8.hLcd1206_m16.h

这样,使用不同的MPU就引入不同版本的头文件。

armok 发表于 2004-10-19 15:07:45

对。通过头文件是个好方法。我现在就是这样用的。

bailei 发表于 2004-10-19 19:02:40

感谢一下,找了很久的东西终于找到了- -

armok 发表于 2004-10-19 20:00:34

哈哈,如果 bailei 有什么好资料,又怕以后不知放那里了,可以上传过来给我。我将它整理到网站里。

xcy58 发表于 2004-12-24 09:44:55

非常谢谢 ysoni,好东东应该大家分享,敬礼!

fjzh7707 发表于 2005-4-8 15:25:00

非常感谢,真是雪中送炭

zhouheeng 发表于 2005-4-8 16:41:09

有没有人用过那种只有驱动器,没有控制器的液晶,应该叫液晶模块还是就叫液净.

Clamfly 发表于 2005-4-8 17:10:07

大家有没有考虑可行性啊?毕竟各个厂家的接口和RAM->点阵的布局不同啊,控制命令的格式、参数也不一样。



正如不同内核的显卡没有通用的驱动程序一样。
-----此内容被Clamfly于2005-04-08,17:12:28编辑过

jgl7810 发表于 2005-4-8 21:31:25

辛苦!

chuncheng1203 发表于 2005-5-18 13:06:59

站长真的好爽!

ag2002 发表于 2005-6-8 21:05:00

谢谢咯!

LXH007 发表于 2005-6-14 19:24:03

好东西~!

谢谢~!

wzhscj 发表于 2005-6-14 21:39:16

好东西,支持!!

zh1112ou 发表于 2005-6-15 00:45:36

果然是好东西,谢谢啦!

szgplzm 发表于 2005-6-17 09:29:43

液晶的控制模块有不同的型号,控制方法各不相同。

我遇到的12864就有KS0107,HD16202.能统一就好了。

zhpwhy 发表于 2005-6-17 15:57:20

哈哈,真得不错!

luyunjie 发表于 2005-6-17 16:46:54

厉害。。。

coolzyp 发表于 2005-6-17 20:12:34

正在找这些资料呢,太有用了,实在太感激大家了

kinsey 发表于 2005-6-18 21:53:07

感谢ysoni的分享哦!对我有帮助!

igoal 发表于 2005-6-18 22:10:03

想法是好的但是液晶的控制器太多了,一个人要想都做出来恐怕不太现实,希望大家把自己用过的液晶模块的详细介绍也做到库里而且想一个统一的命名规则(比如按控制器名称)方便大家的发布,和使用。

kkllnlp 发表于 2005-6-22 12:09:28

好东西,强烈支持

windows 发表于 2005-6-22 20:33:31

感谢ysoni!!!!!

wellda 发表于 2005-6-22 23:19:00

俺由能耐了也来写!!

king_0102 发表于 2005-7-25 11:09:13

谢谢啊

liangjj222 发表于 2005-8-1 11:12:29

液晶模块YJ-162A如何在AVR中显示汉字啊?,请教各位大侠!

rockey24 发表于 2005-8-1 20:22:03

感谢分享

kukua 发表于 2005-8-1 20:57:18

学得这样不好,其实很多液晶要实现的功能都差不多(显示字符,显示图片,画线,光标等的),何不先拿一种液晶(3310的lcd)做好一套显示的API。

jackrich 发表于 2005-10-8 14:21:53

好见意!

forestchat 发表于 2005-10-8 16:12:10

我只用过SED1330的,附上

点击此处下载armok0176628.rar

chenbin0011 发表于 2005-10-8 18:10:21

按控制器的不同做个分类,从底层的I/O口开始分别作成不同的文件,一直驱动到顶层的功能函数。的有个引头的开始做大家往上补充完善,像开放软件的做法。

caobin52095 发表于 2005-10-9 14:21:08

非常感谢

flymara 发表于 2005-10-9 17:22:53

THX VERY MUCH.

hovee 发表于 2005-10-31 21:49:23

我来凑个热闹,OCMJ2X8C串口模式

#include <reg52.h>



#define uintunsigned int

#define uchar unsigned char

#define x   0x80//*汉字显示首坐标

#define y   0x80

#define comm0//*为低,输入代码

#define dat   1//*为高,输入数据



sbit rs = P0^0;   //H=data; L=command; //*P0^0--RS(CS) 代码/数据选择(片选)

sbit rw = P0^1;   //H=read; L=write;//*P0^0--R/W(STD)读/写选择(串行输入)               

sbite = P0^2;   //input enable; //*输入使能

sbit psb= P0^3;   //H=并口; L=串口; //*并口/串口选择

sbit rst= P0^4;   //Reset Signal 低电平有效 //*复位



sbit busy=P1^7;   //lcd busy bit



void wr_lcd (uchar dat_comm,uchar content);

void chk_busy (void);

void delay (uint us);



uchar code tab1[]={

"内置二级字库可在"

"任意位置反白显示"

};



uchar code tab3[]={

"金鹏科技有限公司"

"Golden Palm TECH"

};



uchar code tab5[]={

/*--调入了一幅图像:F:\梁\画图\HOCO12832.bmp--*/

/*--宽度x高度=128x32--*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x07,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x18,0x0C,0x00,0x00,0x01,0x00,0x00,0x00,0x00,

0x01,0xFF,0x80,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x13,0x10,0x03,0xFE,0x00,

0x03,0xFF,0xC0,0x00,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x3F,0x30,0x1F,0xFF,0xC0,

0x03,0xFF,0xE0,0x00,0x00,0x00,0x00,0x8C,0x03,0xF0,0x00,0x7F,0xE0,0x7C,0x01,0xE0,

0x03,0xFF,0xF0,0x00,0x00,0x00,0x01,0x36,0x06,0xC0,0x00,0x5F,0xC0,0xFF,0xFC,0x60,

0x01,0xFF,0xF0,0x00,0x00,0x00,0x02,0x1B,0x0F,0x80,0x00,0xFF,0x01,0xFE,0x0F,0x30,

0x00,0xEF,0xF0,0x00,0x00,0x00,0x02,0x6D,0x9F,0x00,0x00,0x3E,0x03,0xFF,0xF1,0x90,

0x00,0xFF,0xF8,0x00,0x00,0x00,0x04,0x36,0xFE,0x00,0x01,0xFF,0x07,0xFF,0xFC,0x90,

0x00,0xEF,0xFF,0xFF,0x80,0x00,0x04,0xDB,0x7E,0x00,0x03,0xFF,0x87,0xFF,0xFC,0xD0,

0x00,0x0F,0xFF,0xFF,0xC0,0x00,0x04,0x6D,0xFC,0x00,0x07,0xFF,0x8F,0xFF,0xFE,0x50,

0x00,0x0F,0xFF,0xFF,0xE0,0x00,0x04,0x36,0xFC,0x10,0x07,0xFF,0x8F,0xFF,0xFE,0x90,

0x00,0x0F,0xFF,0xFF,0xE0,0x00,0x04,0x1B,0xF8,0x10,0x07,0xFF,0xCF,0xFF,0xFE,0x80,

0x00,0x0F,0xFF,0xFF,0xF0,0x00,0x04,0x0F,0xF8,0x10,0x07,0xFF,0xFF,0xFF,0xFA,0x00,

0x00,0x07,0xFF,0xFF,0xF0,0x00,0x04,0x07,0xF0,0x10,0x07,0xFF,0xFF,0xFF,0xFA,0x00,

0x00,0xFF,0xFF,0xFF,0xF8,0x00,0x02,0x03,0xF0,0x20,0x07,0xFF,0xFF,0xFF,0xBA,0x00,

0x00,0xFD,0xFF,0xFF,0xFC,0x00,0x02,0x03,0xF0,0x20,0x03,0xFF,0xFF,0xDF,0xB8,0x00,

0x00,0xC1,0xC0,0x3F,0xFC,0x00,0x01,0x01,0xE0,0x40,0x00,0xFF,0xFF,0xDF,0xB0,0x00,

0x00,0x81,0xC0,0x3F,0xCE,0x00,0x00,0x81,0xE0,0x80,0x00,0x7F,0xFF,0xDF,0xA0,0x00,

0x00,0x81,0x80,0x1D,0xCF,0x00,0x00,0x41,0xE1,0x00,0x00,0x3F,0xFF,0x9B,0x00,0x00,

0x01,0x83,0x80,0x1F,0xC7,0x80,0x00,0x21,0xE2,0x00,0x00,0x1F,0xFD,0xB6,0x00,0x00,

0x01,0xC3,0x00,0x0E,0xE6,0x80,0x00,0x19,0xEC,0x00,0x00,0x07,0xFE,0x20,0x00,0x00,

0x00,0xC3,0x00,0x07,0x67,0x40,0x00,0x07,0xF0,0x00,0x00,0x03,0x3E,0x00,0x00,0x00,

0x00,0x02,0x00,0x03,0xE7,0xA0,0x00,0x00,0x00,0x00,0x00,0x02,0x8E,0x00,0x00,0x00,

0x00,0x06,0x00,0x03,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x03,0x00,0x00,0x00,

0x00,0x06,0x00,0x07,0x03,0x00,0x77,0x46,0x74,0x24,0x80,0x06,0x04,0x00,0x00,0x00,

0x00,0x1C,0x00,0x06,0x00,0x00,0x55,0x45,0x54,0x57,0x80,0x00,0x00,0x00,0x00,0x00,

0x00,0x1C,0x00,0x0E,0x00,0x00,0x45,0x45,0x74,0x57,0x80,0x08,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x1C,0x00,0x00,0x55,0x45,0x44,0x74,0x80,0xF0,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x38,0x00,0x00,0x77,0x76,0x47,0x54,0x80,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00

};





/*------------------初始化-----------------*/

void init_lcd (void)

{

rst=1;

psb=1;//*采用并口形式

wr_lcd (comm,0x30);/*30---基本指令动作*/   

wr_lcd (comm,0x01);/*清屏,地址指针指向00H*/

wr_lcd (comm,0x06);/*光标的移动方向*/

wr_lcd (comm,0x0c);/*开显示,关游标*/

}

/*---------------显示汉字或字符----------------*/

void chn_disp (uchar code *chn)

{

uchar i,j;

wr_lcd (comm,0x30); //*基本指令动作

wr_lcd (comm,0x80); //*设定绘图RAM地址

j=0;

for (i=0;i<16;i++)

wr_lcd (dat,chn);

wr_lcd (comm,0x90); //*设定绘图RAM地址

j=1;

for (i=0;i<16;i++)

wr_lcd (dat,chn);

}

/*----------------显示图形-----------------*/

void img_disp (uchar code *img)

{

uchar i,j;

for(j=0;j<32;j++)

{

    for(i=0;i<8;i++)

    {

      wr_lcd (comm,0x34);

      wr_lcd (comm,y+j);

      wr_lcd (comm,x+i);

      wr_lcd (comm,0x30);

      wr_lcd (dat,img);

      wr_lcd (dat,img);

    }

}

wr_lcd (comm,0x36);

}

/*--------------显示点阵----------------*/

void lat_disp (uchar data1,uchar data2)

{

uchar i,j;

for(j=0;j<16;j++)

{

    for(i=0;i<8;i++)

    {

      wr_lcd (comm,0x34);

      wr_lcd (comm,y+j*2);

      wr_lcd (comm,x+i);

      wr_lcd (comm,0x30);

      wr_lcd (dat,data1);

      wr_lcd (dat,data1);

    }

    for(i=0;i<8;i++)

    {

      wr_lcd (comm,0x34);

      wr_lcd (comm,y+j*2+1);

      wr_lcd (comm,x+i);

      wr_lcd (comm,0x30);

      wr_lcd (dat,data2);

      wr_lcd (dat,data2);

    }

}

wr_lcd (comm,0x36);

}

/*-----------------------------------------------*/

//当data1=0xff,data2=0xff时,在x0,y0处反白显示16xl*yl.

void con_disp (uchar data1,uchar data2,uchar x0,uchar y0,uchar xl,uchar yl)

{

uchar i,j;

for(j=0;j<yl;j++)

{

    for(i=0;i<xl;i++)

    {

      wr_lcd (comm,0x34);

      wr_lcd (comm,y0+j);

      wr_lcd (comm,x0+i);

      wr_lcd (comm,0x30);

      wr_lcd (dat,data1);

      wr_lcd (dat,data2);

    }

}

wr_lcd (comm,0x36);

}

/*--------------清DDRAM------------------*/

void clrram (void)

{

wr_lcd (comm,0x30);

wr_lcd (comm,0x01);

}

/*---------------------------------------*/

void wr_lcd (uchar dat_comm,uchar content)

{

chk_busy ();

if(dat_comm)

   {

    rs=1;   //data

    rw=0;   //write

   }

else

   {

    rs=0;   //command

    rw=0;   //write

   }

P1=content;   //output data or comm

e=1;

;

e=0;

}



void chk_busy (void)

{

P1=0xff;

rs=0;

rw=1;

e =1;

while(busy==1);

e =0;

}

/*---------------------------------------*/

void delay (uint us)   //delay time

{

while(us--);

}

void delay1 (uint ms)

{

uint i,j;

for(i=0;i<ms;i++)

for(j=0;j<15;j++)

delay(1);

}

/*------------------主程序--------------------*/

void main ()

{

SP=0x5f;

init_lcd ();

while (1)

{

    lat_disp (0x00,0x00);

    chn_disp (tab1);

    con_disp (0xff,0xff,0x84,0x90,2,16);

    delay1 (8000);

    clrram();

    lat_disp (0xcc,0xcc);

    delay1 (8000);

    wr_lcd (comm,0x34);

    chn_disp (tab3);

    delay1 (8000);

    clrram();

    lat_disp (0xff,0x00);

    delay1 (8000);

    img_disp (tab5);

    delay1 (8000);

}

}



hovee 发表于 2005-10-31 21:55:25

说明:以上的是并口模式,呵呵,不好意思。将“并口”打成了“串口”,贴上去才发现。

jackrich 发表于 2005-11-1 09:27:31

ding

yuanfei-0 发表于 2005-11-1 14:26:18

好,顶!

Linbrid 发表于 2005-11-15 18:40:30

谢谢

maigoxx 发表于 2005-11-15 19:33:33

谢谢

lrzxc 发表于 2005-11-15 20:23:09

好贴,是不是重新开个版块?

lvlei217 发表于 2005-11-16 13:16:12

ting

hovee 发表于 2005-11-22 11:56:23

/********************************OCMJ2X8c串口程序(keil c51)******************************************/

#include <reg52.h>

#define uintunsigned int

#define uchar unsigned char

#define x   0x80

#define y   0x80

#define comm0

#define dat   1



sbit cs   = P0^0;

sbit std= P0^1;

sbit sclk = P0^2;

sbit psb= P0^3;   //H=并口; L=串口;

sbit rst= P0^4;   //Reset Signal 低电平有效



void wr_lcd (uchar dat_comm,uchar content);

void delay (uint us);



uchar code tab1[]={

"内置二级字库可在"

"任意位置反白显示"

};



uchar code tab3[]={

"金鹏科技有限公司"

"Golden Palm TECH"

};



uchar code tab5[]={

/*--调入了一幅图像:F:\梁\画图\HOCO12832.bmp--*/

/*--宽度x高度=128x32--*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x07,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x18,0x0C,0x00,0x00,0x01,0x00,0x00,0x00,0x00,

0x01,0xFF,0x80,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x13,0x10,0x03,0xFE,0x00,

0x03,0xFF,0xC0,0x00,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x3F,0x30,0x1F,0xFF,0xC0,

0x03,0xFF,0xE0,0x00,0x00,0x00,0x00,0x8C,0x03,0xF0,0x00,0x7F,0xE0,0x7C,0x01,0xE0,

0x03,0xFF,0xF0,0x00,0x00,0x00,0x01,0x36,0x06,0xC0,0x00,0x5F,0xC0,0xFF,0xFC,0x60,

0x01,0xFF,0xF0,0x00,0x00,0x00,0x02,0x1B,0x0F,0x80,0x00,0xFF,0x01,0xFE,0x0F,0x30,

0x00,0xEF,0xF0,0x00,0x00,0x00,0x02,0x6D,0x9F,0x00,0x00,0x3E,0x03,0xFF,0xF1,0x90,

0x00,0xFF,0xF8,0x00,0x00,0x00,0x04,0x36,0xFE,0x00,0x01,0xFF,0x07,0xFF,0xFC,0x90,

0x00,0xEF,0xFF,0xFF,0x80,0x00,0x04,0xDB,0x7E,0x00,0x03,0xFF,0x87,0xFF,0xFC,0xD0,

0x00,0x0F,0xFF,0xFF,0xC0,0x00,0x04,0x6D,0xFC,0x00,0x07,0xFF,0x8F,0xFF,0xFE,0x50,

0x00,0x0F,0xFF,0xFF,0xE0,0x00,0x04,0x36,0xFC,0x10,0x07,0xFF,0x8F,0xFF,0xFE,0x90,

0x00,0x0F,0xFF,0xFF,0xE0,0x00,0x04,0x1B,0xF8,0x10,0x07,0xFF,0xCF,0xFF,0xFE,0x80,

0x00,0x0F,0xFF,0xFF,0xF0,0x00,0x04,0x0F,0xF8,0x10,0x07,0xFF,0xFF,0xFF,0xFA,0x00,

0x00,0x07,0xFF,0xFF,0xF0,0x00,0x04,0x07,0xF0,0x10,0x07,0xFF,0xFF,0xFF,0xFA,0x00,

0x00,0xFF,0xFF,0xFF,0xF8,0x00,0x02,0x03,0xF0,0x20,0x07,0xFF,0xFF,0xFF,0xBA,0x00,

0x00,0xFD,0xFF,0xFF,0xFC,0x00,0x02,0x03,0xF0,0x20,0x03,0xFF,0xFF,0xDF,0xB8,0x00,

0x00,0xC1,0xC0,0x3F,0xFC,0x00,0x01,0x01,0xE0,0x40,0x00,0xFF,0xFF,0xDF,0xB0,0x00,

0x00,0x81,0xC0,0x3F,0xCE,0x00,0x00,0x81,0xE0,0x80,0x00,0x7F,0xFF,0xDF,0xA0,0x00,

0x00,0x81,0x80,0x1D,0xCF,0x00,0x00,0x41,0xE1,0x00,0x00,0x3F,0xFF,0x9B,0x00,0x00,

0x01,0x83,0x80,0x1F,0xC7,0x80,0x00,0x21,0xE2,0x00,0x00,0x1F,0xFD,0xB6,0x00,0x00,

0x01,0xC3,0x00,0x0E,0xE6,0x80,0x00,0x19,0xEC,0x00,0x00,0x07,0xFE,0x20,0x00,0x00,

0x00,0xC3,0x00,0x07,0x67,0x40,0x00,0x07,0xF0,0x00,0x00,0x03,0x3E,0x00,0x00,0x00,

0x00,0x02,0x00,0x03,0xE7,0xA0,0x00,0x00,0x00,0x00,0x00,0x02,0x8E,0x00,0x00,0x00,

0x00,0x06,0x00,0x03,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x03,0x00,0x00,0x00,

0x00,0x06,0x00,0x07,0x03,0x00,0x77,0x46,0x74,0x24,0x80,0x06,0x04,0x00,0x00,0x00,

0x00,0x1C,0x00,0x06,0x00,0x00,0x55,0x45,0x54,0x57,0x80,0x00,0x00,0x00,0x00,0x00,

0x00,0x1C,0x00,0x0E,0x00,0x00,0x45,0x45,0x74,0x57,0x80,0x08,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x1C,0x00,0x00,0x55,0x45,0x44,0x74,0x80,0xF0,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x38,0x00,0x00,0x77,0x76,0x47,0x54,0x80,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00

};





/*------------------初始化-----------------*/

void init_lcd (void)

{

rst=1;

psb=0;

wr_lcd (comm,0x30);/*30---基本指令动作*/   

wr_lcd (comm,0x01);/*清屏,地址指针指向00H*/

delay (80);

wr_lcd (comm,0x06);/*光标的移动方向*/

wr_lcd (comm,0x0c);/*开显示,关游标*/

}

/*---------------显示汉字或字符----------------*/

void chn_disp (uchar code *chn)

{

uchar i,j;

wr_lcd (comm,0x30);

wr_lcd (comm,0x80);

j=0;

for (i=0;i<16;i++)

wr_lcd (dat,chn);

wr_lcd (comm,0x90);

j=1;

for (i=0;i<16;i++)

wr_lcd (dat,chn);

}

/*----------------显示图形-----------------*/

void img_disp (uchar code *img)

{

uchar i,j;

for(j=0;j<32;j++)

{

    for(i=0;i<8;i++)

    {

      wr_lcd (comm,0x34);

      wr_lcd (comm,y+j);

      wr_lcd (comm,x+i);

      wr_lcd (comm,0x30);

      wr_lcd (dat,img);

      wr_lcd (dat,img);

    }

}

wr_lcd (comm,0x36);

}

/*--------------显示点阵----------------*/

void lat_disp (uchar data1,uchar data2)

{

uchar i,j;

for(j=0;j<16;j++)

{

    for(i=0;i<8;i++)

    {

      wr_lcd (comm,0x34);

      wr_lcd (comm,y+j*2);

      wr_lcd (comm,x+i);

      wr_lcd (comm,0x30);

      wr_lcd (dat,data1);

      wr_lcd (dat,data1);

    }

    for(i=0;i<8;i++)

    {

      wr_lcd (comm,0x34);

      wr_lcd (comm,y+j*2+1);

      wr_lcd (comm,x+i);

      wr_lcd (comm,0x30);

      wr_lcd (dat,data2);

      wr_lcd (dat,data2);

    }

}

wr_lcd (comm,0x36);

}

/*-----------------------------------------------*/

//当data1=0xff,data2=0xff时,在x0,y0处反白显示16xl*yl.

void con_disp (uchar data1,uchar data2,uchar x0,uchar y0,uchar xl,uchar yl)

{

uchar i,j;

for(j=0;j<yl;j++)

{

    for(i=0;i<xl;i++)

    {

      wr_lcd (comm,0x34);

      wr_lcd (comm,y0+j);

      wr_lcd (comm,x0+i);

      wr_lcd (comm,0x30);

      wr_lcd (dat,data1);

      wr_lcd (dat,data2);

    }

}

wr_lcd (comm,0x36);

}

/*--------------清DDRAM------------------*/

void clrram (void)

{

wr_lcd (comm,0x30);

wr_lcd (comm,0x01);

delay (120);

}

/*---------------------------------------*/

void wr_lcd (uchar dat_comm,uchar content)

{

uchar a,i,j;

delay (40);

a=content;

cs=1;

sclk=0;

std=1;

for(i=0;i<5;i++)

{

    sclk=1;

    sclk=0;

}

std=0;

sclk=1;

sclk=0;

if(dat_comm)

    std=1;   //data

else

    std=0;   //command

sclk=1;

sclk=0;

std=0;

sclk=1;

sclk=0;

for(j=0;j<2;j++)

{

    for(i=0;i<4;i++)

    {

      a=a<<1;

      std=CY;

      sclk=1;

      sclk=0;

    }

    std=0;

    for(i=0;i<4;i++)

    {

      sclk=1;

      sclk=0;

    }

}

}

/*---------------------------------------*/

void delay (uint us)   //delay time

{

while(us--);

}

void delay1 (uint ms)

{

uint i,j;

for(i=0;i<ms;i++)

for(j=0;j<15;j++)

delay(1);

}

/*------------------主程序--------------------*/

void main ()

{

SP=0x5f;

init_lcd ();

while (1)

{

    lat_disp (0x00,0x00);

    chn_disp (tab1);

    con_disp (0xff,0xff,0x84,0x90,2,16);

    delay1 (8000);

    clrram();

    lat_disp (0xcc,0xcc);

    delay1 (8000);

    wr_lcd (comm,0x34);

    chn_disp (tab3);

    delay1 (8000);

    clrram();

    lat_disp (0xff,0x00);

    delay1 (8000);

    img_disp (tab5);

    delay1 (8000);

}

}

zcl843 发表于 2005-11-22 12:58:53

有谁,做过MGLS12864-LED04的液晶,或者资料啊

lucky_000 发表于 2005-11-28 09:43:11

好,收藏先,谢谢ysoni

borifs2000 发表于 2005-12-12 14:15:31

厉害啊各位,我还是初学者,现在学ing

igoal 发表于 2005-12-13 09:54:10

我也传一个RA8802的使用中文手册含例子程序的点击此处打开armok0191626.pdf

lfkml 发表于 2006-1-5 17:24:43

有哪位大虾做过LM6800(topway)的液晶驱动程序啊?控制器是S6B0108.

jimo 发表于 2006-1-5 17:54:17

大家不怕等的话, 我愿意操刀. 虽然刚刚接触单片机, 但是做了多年的软件, 比较擅长抽象的东西. 我刚刚学了3310的驱动后就在想, 也已经在开始设计一个"万能"的液晶驱动.我的设想是, 先设计出一套和硬件无关的接口, 然后大家评议这套接口, 接口好了后, 我来工作呢, 主要是完成这些接口. 真正涉及到硬件的部分呢, 就由大家一块来完成.这样以后我们需要使用液晶(不一定是液晶, 其它的显示也可以)时, 就方便了, 显示的调试工作也方便了. 需要更换显示设备也可以不用修改程序, 只需要重新编译一把.

    还有其它的硬件设备比如键盘, 从一个键到n个键都可以驱动的驱动程序......甚至可以说是一个可以裁剪的"操作系统"^_^

jimo 发表于 2006-1-5 18:08:39

有一个明显的问题是: 驱动越通用, 消耗单片机的资源越多. 所以考虑为不同应用场合的类型设计不同的驱动. 比如m8上不考虑320*240*16的液晶驱动, 不考虑支持虚拟屏幕.不考虑20按键以上的IO扫描方式驱动的键盘.

    而对m128和arm这类的"蜈蚣虫", 根据屏幕在用户交互的重要程度的不同提供不同的驱动.

    同时要考虑根据MCU对设备的驱动能力的不同提供不同的驱动.比如m8驱动3310, 如果SPI已经被其它的设备使用, 那么只能使用模拟的SPI(如使用D口), 这时应该使用不同的驱动.

    但是, 不管如何, 这些驱动的接口却是一样的, 不会让程序感觉到液晶屏的不同.

xingfeng 发表于 2006-1-23 20:23:52

非常感谢!

xiao82 发表于 2006-3-17 16:19:28

期待中

yanrz 发表于 2006-3-22 11:46:25

正在学用AVR和液晶显示器,非常感谢!!!!!

fjcrf 发表于 2006-3-27 14:57:32

我做过6963,51的程序,如果大家碰到难题可以和我联系,也许我可以解答。



QQ:359543401

fentery 发表于 2006-3-27 18:04:49

这个提议太好了,菜鸟们有福了

alisha 发表于 2006-3-28 19:53:43

期待jimo完成这个项目,先说一声,辛苦了,好哥们!

jimo 发表于 2006-3-29 08:38:15

现在正在进行中.

确实让大家久等了, 完成后一定第一时间奉献给大家. 我手头的液晶数目有限, 到时候还需要大家一块帮我扩展和测试呀!

xdl_cabin 发表于 2006-3-29 09:03:46

我用到的液晶上面已经提供了,呵呵,以后用到别的话,一定和大家共享。

zhl19831028 发表于 2006-4-4 17:10:26

真是太感谢大家了

对我来说简直就是雪中送炭啊

但是有没有哪位大侠帮我解决一下啊

我现在在用ICCAVR做多功能电子钟老师给的夜晶显示器是TC1602B型的

我不知道怎么对他编程让他来显示时间啊

十万火急啊!,大家一定要帮帮我啊,不然就没法毕业了!!!!

wuyingjie 发表于 2006-4-5 22:47:21

我有个项目,需要用到128*64液晶。我初步想用两个单片机实现。现在我的时间不够用,可以的话,我想将LCD和键盘部分交给感兴趣的朋友做。有经验并有时间的请联系。email:enge_w@163.com;QQ:602838876;

zj3098 发表于 2006-4-6 13:21:56

看看这种串并口彩色液晶屏,内置矢量字库;采用标准指令集和单片很好连接的





在看看指令

Space   LF20 0A   标准字库传送

#       23            置汉字方式

$       24            置西文字符方式

% n   25 n          自动判别显示数据的属性

&26   m,n         设定特种字库‘

27 No               显示特种字库的第No个字模

n x y color 0<=n<8

N x y color 29<n<38初始化曲线

8 m n38 m n      光标颜色

A color x1 y1 x2 y2

41 color x1 y1 x2 y2 画实心矩形

B color

42 color             用指定的颜色清屏



C color

43 color            设置前景颜色



D      44         光标下移一行



E b0 b1 b2,...,bn

45 b0 b1 b2,...,bn    绘制曲线

F color x1 y1 x2 y2

46 color x1 y1 x2 y2画线



G x y 47 x y         光标移到(x,y)位置



H x y 48 x y         光标定位到指定像素位置

L       4C         光标左移一字符位

M n    4D n          设置放大倍数

P n    50 n          调用预置的第n页图象

R n    52 n          光标右移n字符位

S n    53 n          延时

U      55            光标上移一行

V n m d56 n m d    将预置画面写入用户FLASH

W n    57 n          光标显示控制

X n    58 n          选择覆盖或重叠方式显示

Y color x y R

59 color x y R       画圆



1 B 15 0             叠加显示功能

1 B 16 A B         滚屏显示功能

Z color x1 y1 x2 y2

5A color x1 y1 x2 y2 画空心矩形



将16进制通过串口发到液晶屏就可以了



在看看我做出来的效果

http://cache.amobbs.com/bbs_upload782111/files_5/armok01113126.JPG

看看屏

http://cache.amobbs.com/bbs_upload782111/files_5/armok01113127.JPG



地址:上海市漕溪路250弄银海大楼A-312

公司:上海市哲力工业自动化科技公司

邮编:200235

电话:021 64848308

邮箱:zj3098@hotmail.com




-----此内容被zj3098于2006-04-06,13:23:46编辑过

CODIER 发表于 2006-4-18 14:30:17

very good

AVR-MEGA128 发表于 2006-4-20 11:33:14

楼上的你的LCD不错啊

ljmdiy 发表于 2006-4-20 18:32:47

哪位大虾有128*34 液晶显示 的串口程序啊?急用~!~!~!

fylab 发表于 2006-4-20 19:23:51

建议买本周立功的书,或开发版,上面有专门的液晶驱动.以及标准化了的库,液晶驱动都做成了标准库了,更改液晶,仅需要更改底层的一个驱动文件即可,其它的一点也不要再动了.相当好用.

    好不好用自己看吧.

skyhowl 发表于 2006-4-21 08:30:34

能明确一下是周立功的那本书吗?

alisha 发表于 2006-4-21 11:50:26

我也要买那本书!

yang7020 发表于 2006-6-3 12:15:45

谢谢啊

jxzylg 发表于 2006-7-3 18:34:36

uchar                tb={0xD7,0x50,0xb5,0xf1,0x72,0xe3,0xe7,0x51,0xf7,0xf3};//字符库



void wrcm(uchar cmd)//给ht1621写命令

{

        cs=1;                        delay5();

        cs=0;                        delay5();

        dat=1;                        wr=0;delay5();wr=1;delay5();

        dat=0;                        wr=0;delay5();wr=1;delay5();

        dat=0;                        wr=0;delay5();wr=1;delay5();

        dat=cmd&128;        wr=0;delay5();wr=1;delay5();

        dat=cmd&64;                wr=0;delay5();wr=1;delay5();

        dat=cmd&32;                wr=0;delay5();wr=1;delay5();

        dat=cmd&16;                wr=0;delay5();wr=1;delay5();

        dat=cmd&0x8;        wr=0;delay5();wr=1;delay5();

        dat=cmd&0x4;        wr=0;delay5();wr=1;delay5();

        dat=cmd&0x2;        wr=0;delay5();wr=1;delay5();

        dat=cmd&0x1;        wr=0;delay5();wr=1;delay5();

        dat=0;                        wr=0;delay5();wr=1;delay5();

        dat=1;                        delay5();

        cs=1;                        delay5();

        P1=0xFF;

}



void lcd_display(uchar addr,uchar d)//写数据,0,2,4,6作为地址addr。

{

        //先输出数据的首地址,然后连续输出数据。

        cs=1;                                delay5();

        cs=0;                                delay5();

        wr=0;delay5();dat=1;                        delay5();wr=1;delay5();

        wr=0;delay5();dat=0;                        delay5();wr=1;delay5();

        wr=0;delay5();dat=1;                        delay5();wr=1;delay5();

        wr=0;delay5();dat=0;                        delay5();wr=1;delay5();

        wr=0;delay5();dat=addr&16;        delay5();wr=1;delay5();

        wr=0;delay5();dat=addr&8;        delay5();wr=1;delay5();

        wr=0;delay5();dat=addr&4;        delay5();wr=1;delay5();

        wr=0;delay5();dat=addr&2;        delay5();wr=1;delay5();

        wr=0;delay5();dat=addr&1;        delay5();wr=1;delay5();

        wr=0;delay5();dat=d&1;                delay5();wr=1;delay5();

        wr=0;delay5();dat=d&2;                delay5();wr=1;delay5();

        wr=0;delay5();dat=d&4;                delay5();wr=1;delay5();

        wr=0;delay5();dat=d&8;                delay5();wr=1;delay5();

        wr=0;delay5();dat=d&16;                delay5();wr=1;delay5();

        wr=0;delay5();dat=d&32;                delay5();wr=1;delay5();

        wr=0;delay5();dat=d&64;                delay5();wr=1;delay5();

        wr=0;delay5();dat=d&128;        delay5();wr=1;delay5();

        dat=1;                        delay5();

        cs=1;                                delay5();

        P1=0xFF;

}



有这2个函数就可以使用ht1621了。

lfh1986 发表于 2006-7-22 10:38:42

好东西啊,我最近正好用的到!

langziwen 发表于 2006-7-22 18:21:19

高手们:

   能不能给出有电路图的例呀!!!!!!!!!1

SW7005 发表于 2006-7-23 22:15:16

顶!

franklwq 发表于 2006-7-24 22:18:49

顶!

xujuncz 发表于 2006-7-27 21:04:23

/******************************************************************************

*T6963程序

******************************************************************************/

#include <at89x52.h>

#include <stdio.h>

#include "T6963.h"



#define T6963_COMM_ADDR                                XBYTE

#define T6963_DATA_ADDR                                XBYTE

#define LineChar                                        30

#define ColumnChar                                         16



#define SCREEN_SIZE                                        0x0f00

#define DISPMEM_SIZE                                0x8000

/******************************************************************************

*command list

******************************************************************************/

#define SET_CURSOR_POINT                        0x21

#define SET_CGRAM_OFFSET_ADDR                0x22

#define SET_DISP_ADDR                                0x24



#define SET_TEXT_HOME_ADDR                        0x40

#define SET_TEXT_AREA                                0x41

#define SET_GRAPHIC_HOME_ADDR                0x42

#define SET_GRAPHIC_AREA                        0x43



#define SET_MODE_OR                                        0x80

#define SET_MODE_EXOR                                0x81

#define SET_MODE_AND                                0x83

#define SET_MODE_TEXT_ATTRIBUTE                0x84

#define SET_MODE_INTERNAL_CGROM                0x87

#define SET_MODE_EXTERNAL_CGRAM                0x8f



#define DISP_OFF                                        0x90

#define CURSORON_BLINKOFF                        0x92

#define CURSORON_BLINKON                        0x93

#define TEXTON_GRAPHICOFF                        0x94

#define TEXTOFF_GRAPHICON                        0x98

#define TEXTON_GRAPHICON                        0x9c



#define CURSOR_1LINE                                0xa0

#define CURSOR_2LINE                                0xa1

#define CURSOR_3LINE                                0xa2

#define CURSOR_4LINE                0xa3

#define CURSOR_5LINE                                0xa4

#define CURSOR_6LINE                0xa5

#define CURSOR_7LINE                0xa6

#define CURSOR_8LINE                0xa7



#define SET_DATA_AUTO_WRITE                        0xb0

#define SET_DATA_AUTO_READ                        0xb1

#define AUTO_RESET                                        0xb2



#define DATAWRITE_ADPINC                        0xc0

#define DATAREAD_ADPINC                                0xc1

#define DATAWRITE_ADPDEC                        0xc2

#define DATAREAD_ADPDEC                                0xc3

#define DATAWRITE_ADPNON                        0xc4

#define DATAREAD_ADPNON                                0xc5



#define SCREEN_PEAK                                        0xe0



#define SCREEN_COPY                                        0xe8



#define BIT0_RESET                                        0xf0

#define BIT0_SET                                        0xf8

#define BIT1_RESET                                        0xf1

#define BIT1_SET                                        0xf9

#define BIT2_RESET                                        0xf2

#define BIT2_SET                                        0xfa

#define BIT3_RESET                                        0xf3

#define BIT3_SET                                        0xfb

#define BIT4_RESET                                        0xf4

#define BIT4_SET                                        0xfc

#define BIT5_RESET                                        0xf5

#define BIT5_SET                                        0xfd

#define BIT6_RESET                                        0xf6

#define BIT6_SET                                        0xfe

#define BIT7_RESET                                        0xf7

#define BIT7_SET                                        0xff

/******************************************************************************

*project:                lcddemo

*function name:

*describle:

*input:

*output:

*note:

******************************************************************************/

void delay(UWORD time)

{

        UWORD i;

        for(i = 0; i < time; i++);

}

/******************************************************************************

*project:                lcddemo

*function name:        T6963_SendCommand

*describle:                Read State Register

*input:                        NULL

*output:                state

*note:

******************************************************************************/

UBYTE T6963_ReadState(void)

{

        P0 = 0xff;

        return(T6963_COMM_ADDR);

}

/******************************************************************************

*project:                lcddemo

*function name:        DataEnCheck

*describle:                Check Data Enable

*input:                        NULL

*output:                BOOL

*note:                        if return TRUE,Data Enable,else Data Disable

******************************************************************************/

BOOL StateCheck(void)

{

        UBYTE stat;

        stat = T6963_ReadState();

        if((stat & BIT0) && (stat & BIT1))

        {

                return TRUE;

        }

        else

        {

                return FALSE;

        }

}

/******************************************************************************

*project:                lcddemo

*function name:        T6963_WriteData

*describle:                T6963_WriteData to T6963

*input:

*output:

*note:

******************************************************************************/

void T6963_WriteData(UBYTE wtdata)

{

        while(!StateCheck());

        (T6963_DATA_ADDR) = wtdata;

}

/******************************************************************************

*project:                lcddemo

*function name:        T6963_ReadData

*describle:

*input:

*output:

*note:

******************************************************************************/

UBYTE T6963_ReadData()

{

        while(!StateCheck());

        return(T6963_DATA_ADDR);

}

/******************************************************************************

*project:                lcddemo

*function name:        T6963_SendCommand

*describle:

*input:

*output:

*note:

******************************************************************************/

void T6963_SendCommand(UBYTE command)

{

        while(!StateCheck());

        (T6963_COMM_ADDR) = command;

}

/******************************************************************************

*project:                lcddemo

*function name:        WriteCommand0

*describle:                Send Command with no para

*input:

*output:

*note:

******************************************************************************/

void WriteCommand0(UBYTE command)

{

        T6963_SendCommand(command);

}

/******************************************************************************

*project:                lcddemo

*function name:        WriteCommand1

*describle:                Send Command with one para

*input:

*output:

*note:

******************************************************************************/

void WriteCommand1(UBYTE wtdata,UBYTE command)

{

        T6963_WriteData(wtdata);



        T6963_SendCommand(command);

}

/******************************************************************************

*project:                lcddemo

*function name:        WriteCommand2

*describle:                Send Command with two para

*input:

*output:

*note:

******************************************************************************/

void WriteCommand2(UBYTE firstData,UBYTE secondData,UBYTE command)

{

        T6963_WriteData(firstData);



        T6963_WriteData(secondData);



        T6963_SendCommand(command);

}

/******************************************************************************

*project:                lcddemo

*function name:

*describle:

*input:

*output:

*note:

******************************************************************************/

void SetCursorAddr(UBYTE x,UBYTE y)

{

        WriteCommand2(x,y,SET_CURSOR_POINT);

}

/******************************************************************************

*project:                lcddemo

*function name:

*describle:

*input:

*output:

*note:

******************************************************************************/

void SetCGRamOffsetAddr(UBYTE addr)

{

        WriteCommand2(addr,0x00,SET_CGRAM_OFFSET_ADDR);

}

/******************************************************************************

*project:                lcddemo

*function name: SetDisplayAddr

*describle:                设置显示地址

*input:

*output:

*note:

******************************************************************************/

void SetDisplayAddr(UWORD addr)

{

        WriteCommand2((UBYTE)(addr & 0xff),(UBYTE)((addr >> 8) & 0xff),SET_DISP_ADDR);

}

/******************************************************************************

*project:                lcddemo

*function name:        SetTextHomeAddr

*describle:                设置字符区域地址

*input:

*output:

*note:

******************************************************************************/

void SetTextHomeAddr(UWORD addr)

{

        WriteCommand2((UBYTE)(addr & 0xff),(UBYTE)((addr >> 8) & 0xff),SET_TEXT_HOME_ADDR);

}

/******************************************************************************

*project:                lcddemo

*function name:

*describle:

*input:

*output:

*note:

******************************************************************************/

void SetTextArea(UBYTE columns)

{

        WriteCommand2(columns,0x00,SET_TEXT_AREA);

}

/******************************************************************************

*project:                lcddemo

*function name:

*describle:

*input:

*output:

*note:

******************************************************************************/

void SetGraphicHomeAddr(UWORD addr)

{

        WriteCommand2((addr & 0xff),((addr >> 8) & 0xff),SET_GRAPHIC_HOME_ADDR);

}

/******************************************************************************

*project:                lcddemo

*function name:

*describle:

*input:

*output:

*note:

******************************************************************************/

void SetGraphicArea(UBYTE columns)

{

        WriteCommand2(columns,0x00,SET_GRAPHIC_AREA);

}

/******************************************************************************

*project:                lcddemo

*function name:

*describle:

*input:

*output:

*note:

******************************************************************************/

void SetMode(UBYTE mode)

{

        WriteCommand0(mode);

}

/******************************************************************************

*project:                lcddemo

*function name:

*describle:

*input:

*output:

*note:

******************************************************************************/

void Displayoff()

{

        WriteCommand0(DISP_OFF);

}

/******************************************************************************

*project:                lcddemo

*function name:

*describle:

*input:

*output:

*note:

******************************************************************************/

void SetDispMode(UBYTE dispmode)

{

        WriteCommand0(dispmode);

}

/******************************************************************************

*project:                lcddemo

*function name:

*describle:

*input:

*output:

*note:

******************************************************************************/

void SetCursorPattern(UBYTE cursorpattern)

{

        WriteCommand0(cursorpattern);

}

/******************************************************************************

*project:                lcddemo

*function name:

*describle:

*input:

*output:

*note:

******************************************************************************/

void AutoWriteData()

{

        WriteCommand0(SET_DATA_AUTO_WRITE);

}

/******************************************************************************

*project:                lcddemo

*function name:

*describle:

*input:

*output:

*note:

******************************************************************************/

void AutoReadData()

{

        WriteCommand0(SET_DATA_AUTO_READ);

}

/******************************************************************************

*project:                lcddemo

*function name:

*describle:

*input:

*output:

*note:

******************************************************************************/

void AutoReset()

{

        WriteCommand0(AUTO_RESET);

}

/******************************************************************************

*project:                lcddemo

*function name:

*describle:

*input:

*output:

*note:

******************************************************************************/

void WriteData(UBYTE wtdata,UBYTE mode)

{

        WriteCommand1(wtdata,mode);

}

/******************************************************************************

*project:                lcddemo

*function name:

*describle:

*input:

*output:

*note:

******************************************************************************/

UBYTE ReadData(UWORD addr,UBYTE mode)

{

        SetDisplayAddr(addr);

        WriteCommand0(mode);

        return(T6963_ReadData());

}

/******************************************************************************

*project:                lcddemo

*function name:

*describle:

*input:

*output:

*note:

******************************************************************************/

void Screen_Peek(void)

{

}

/******************************************************************************

*project:                lcddemo

*function name:

*describle:

*input:

*output:

*note:

******************************************************************************/

void Screen_Copy(void)

{

}

/******************************************************************************

*project:                lcddemo

*function name:

*describle:

*input:

*output:

*note:

******************************************************************************/

void ClearScreen(UWORD addr)

{

        UWORD i;

        SetDisplayAddr(addr);

        AutoWriteData();

        for(i = 0; i < SCREEN_SIZE; i++)

        {

                T6963_WriteData(0x00);

        }

        AutoReset();

}

/******************************************************************************

*project:                lcddemo

*function name:

*describle:

*input:

*output:

*note:

******************************************************************************/

void FullScreen(UWORD addr)

{

        UWORD i;



        SetDisplayAddr(addr);

        AutoWriteData();

        for(i = 0; i < SCREEN_SIZE; i++)

        {

                T6963_WriteData(0xff);

        }

        AutoReset();

}

/******************************************************************************

*project:                lcddemo

*function name:

*describle:

*input:

*output:

*note:

******************************************************************************/

void ClearDispMem(void)

{

        UWORD i;

        SetDisplayAddr(0x0000);

        AutoWriteData();

        for(i = 0; i < DISPMEM_SIZE; i++)

        {

                T6963_WriteData(0x00);

        }       

        AutoReset();

}

/******************************************************************************

*project:                lcddemo

*function name:

*describle:

*input:

*output:

*note:

******************************************************************************/

void T6963_Init(void)

{

        FS = 0;

        delay(10000);



        SetGraphicHomeAddr(0x0000);

        SetGraphicArea(30);

        SetCursorAddr(0,0);

        SetCursorPattern(CURSOR_8LINE);

        SetMode(SET_MODE_OR);

        SetDispMode(TEXTOFF_GRAPHICON | CURSORON_BLINKON);



        ClearDispMem();

}

feiying 发表于 2006-9-4 09:21:19

哪位大侠有RT12864j_3的资料,还有和AVR Mega8相连的C语言原程序阿!

小弟的邮箱:feiying_2005@sohu.com

小弟新手阿,请大侠们多多关照阿!!!

sym941 发表于 2006-9-4 15:32:52

想问一下,SED1335和SID13305是不是可以替换,找不到SID13305的资料,哪位用过,帮个忙,我的邮箱是sym941@sina.com,先谢谢了。

feiyue 发表于 2006-9-4 16:14:48

好东西

weilx 发表于 2006-9-18 22:53:25

哪位兄弟能提供12832液晶显示程序啊

雪地裸体跪求!!!!!!!!!!!!!!







我的 邮箱是:

weilx97@126.com


-----此内容被weilx于2006-09-18,22:54:58编辑过

ahead 发表于 2006-10-12 16:12:00

收藏,期待更多更好的

HGDZ 发表于 2006-10-20 14:52:02

哪位兄弟能提供AVR Mega168 驱动 PCF8576(I2C)ICC的程序啊!

gyw16 发表于 2007-1-18 16:14:30

各位高手我刚开始接触128*64点阵液晶显示器,发现很多类型的,不知道是不是所有的都是兼容的。

sdydding 发表于 2007-3-1 09:14:26

开源网站 哈哈 谢谢

shishi 发表于 2007-3-22 23:44:00

好,有LMG9400的吗

fanxu007 发表于 2007-3-27 10:59:50

好东西,多谢多谢

fanxu007 发表于 2007-3-27 11:02:56

好东西,多谢多谢

fanxu007 发表于 2007-3-27 11:05:15

好东西,多谢多谢

jason4263 发表于 2007-3-30 02:03:43

实在是好帖,感谢各位前辈

shishi 发表于 2007-3-30 22:07:18

好东西

fbchenyong 发表于 2007-4-3 09:25:24

我想用JN5121驱动3510i和6610的LCD,前几天刚成功驱动了3310的LCD,由于水平所限以上俩个LCD的驱动一直都难以搞定。有朋友愿意帮忙写个驱动吗,没有JN5121开发板的我可以提供开发板资料和进行测试。谢谢!

QQ:13619286

Email:fbchenyong@163.com

wuji2005 发表于 2007-5-16 19:33:53

站长真的是个好人啊!!!!!!!!!!!!!!!!!!!!1

chengyingavr 发表于 2007-5-17 01:33:54

这个C库做了怎么样了?如果真的有人做,我也提供一些代码和思路(因为前一段时间做过一个类似的控制板)



一下是我的一些建议

1.低层:一般有几种时序,Intel 8080的,Moto6800的,串行的等,可以针对每种底层接口定义一个Interface模块(我的项目中有Intel_Interface.c,Moto_Interface.c和Serial_Interface.c),对应的.h文件中定义接口,我的程序是这样的(Moto_Interface):

uint8 Moto_Operate(uint8 RS,uint8 RW,uint8 data,uint8 busyflag)

{

        uint8 ret;

//uint8 str;



        if((RS || !RW) && busyflag)

        {

                while(Moto_ReadStatus() & busyflag);

        }



        if(RW)

        {

                MOTO_DATA_SET_INPUT;

                MOTO_RW_SET;

        }

        else

        {

                MOTO_DATA_SET_OUTPUT;

                MOTO_RW_CLR;

        }



//sprintf((char*)str,"0x%02X\t",data);

//Shell_WriteStr(str);

        if(RS)

                MOTO_RS_SET;

        else

                MOTO_RS_CLR;

        DelayNS(100);



#if MOTO_PORT_MODE == MOTO_PORT_MODE_8BIT

        MOTO_DATA_OUT(data);

        DelayNS(100);

        MOTO_E_SET;

        DelayNS(500);

        ret = MOTO_DATA_IN();

        MOTO_E_CLR;

        DelayNS(20);

#else

        // High 4 bits

        MOTO_DATA_OUT(data >> 4);

        MOTO_E_SET;

        DelayNS(500);

        ret = MOTO_DATA_IN() << 4;

        MOTO_E_CLR;

        DelayNS(20);



        // Low 4 bits

        MOTO_DATA_OUT(data & 0x0F);

        MOTO_E_SET;

        DelayNS(500);

        ret |= MOTO_DATA_IN();

        MOTO_E_CLR;

        DelayNS(20);

#endif



//sprintf((char*)str,"0x%02X",ret);

//Shell_WriteLine(str);

        return ret;

}



void Moto_Init()

{

        // PORT Init

        MOTO_PORT_SET_GPIO;

        MOTO_CTRL_SET_OUTPUT;

        MOTO_DATA_SET_INPUT;

        MOTO_E_CLR;

}

Moto_Interface.h文件中定义各个接口和4位8位等一些设置,这样模块的移植将非常方便,并且使用不同接口的话,更改也非常简单(下面是Moto的接口,如果要改其他接口就只改着4个定义(xxxx_cfg.h文件中),对应的.c文件不用修改):

// LCM 1602 Interface Definations

#define LCMC_WriteCommand(c)                                        Moto_WriteCommand(c,LCMC_STAT_BSY)

#define LCMC_ReadStatus()                                                Moto_ReadStatus()

#define LCMC_WriteData(d)                                                Moto_WriteData(d,LCMC_STAT_BSY)

#define LCMC_ReadData()                                                        Moto_ReadData(LCMC_STAT_BSY)



1602的命令可以都用宏来定义了:

#define LCMC_ClearDisplay()                                                LCMC_WriteCommand(LCMC_CMD_CLEARDISPLAY)

#define LCMC_ReturnHome()                                                LCMC_WriteCommand(LCMC_CMD_RETURNHOME)

#define LCMC_EntryModeSet(c)                                        LCMC_WriteCommand(LCMC_CMD_ENTRYMODESET | ((c) & LCMC_CMD_ENTRYMODESET_MSK))

#define LCMC_DisplayControl(c)                                        LCMC_WriteCommand(LCMC_CMD_DISPLAYCONTROL | ((c) & LCMC_CMD_DISPLAYCONTROL_MSK))

#define LCMC_Shift(c)                                                        LCMC_WriteCommand(LCMC_CMD_SHIFT | ((c) & LCMC_CMD_SHIFT_MSK))

#define LCMC_FunctionSet(c)                                                LCMC_WriteCommand(LCMC_CMD_FUNCTIONSET | ((c) & LCMC_CMD_FUNCTIONSET_MSK))

#define LCMC_SetCGRAMAddr(a)                                        LCMC_WriteCommand(LCMC_CMD_SETCGRAMADDR | ((a) & LCMC_CMD_CGRAMADDR_MSK))

#define LCMC_SetDDRAMAddr(a)                                        LCMC_WriteCommand(LCMC_CMD_SETDDRAMADDR | ((a) & LCMC_CMD_DDRAMADDR_MSK))





2.再上面一层:芯片层,不同的芯片的控制方式不同(这里不是指底层接口不同),所以一般常用的芯片建立一个模块(我的项目中有ks0108.c,ks0108.h,ks0108_cfg.h和st7920.c,st7920.h,st7920_cfg.h),当然底层接口用我上面说的方法来解决.xxx_cfg.h文件中都是配制,一般只需要改这个文件就可.我的1602模块的配制(底层除外,在上面):

#define LCMC_PORT_MODE                                                LCMC_PORT_MODE_8BIT



#define LCMC_LineNum                                                2

#define LCMC_LineWidth                                                16



#define LCMC_LINEADDR                                                {0x00,0x40}



#define LCMC_CGRAM_LEN                                               



这样的好处就是如果改成1601或者1604的话,只需要改这几个定义就OK.



3.再上一层:各种液晶模块层(由于各个厂家的液晶模块做发并一完全一样,所以可以定义这层,当然做法一样的模块可以共用代码),这一层输出一些标准的函数.比如:

uint8 LCMD_Init(void);

uint8 LCMD_WriteStr8_16(uint8 char_pos_x,uint8 char_pos_y,char *str);

uint8 LCMD_WriteStr5_8(uint8 char_pos_x,uint8 char_pos_y,char *str);

uint8 LCMD_WriteDot(uint8 dot_pos_x,uint8 dot_pos_y,uint8 on);

uint8 LCMD_SetArithMode(uint8 mode);

uint8 LCMD_ClearScreen(void);



4.应用层,调用统一接口,当然最好用一些宏定义.比如:

#define LCM_Init               LCMD_Init

#define LCM_ClearScreen      LCMD_ClearScreen

等,这样如果更换液晶模块,可以做到改动最小,当然是同类型的模块





以上只我的一些不太成熟的建议,当然我的项目都是这么做的,这种做法很适合懒人,基本就是一劳永逸.

资料都收集了差不多了,有人动手做吗?如果有的话我一定提供支持



最后加上我的项目的目录结构:

prj\               项目目录

    menu\            菜单系统

    lcm\             液晶模块

      Interface\   底层接口模块

      Char_Matrix\ 一些点阵字符,各种大小

      LCMC\      字符型模块,不针对芯片,因为我用过的一些芯片控制方式一样(都类似1602)

      LCMD\      点阵模块,第3层接口统一,所以只有一个LCMD.h,LCMD.c和LCMD_cfg.h

            KS0108\

            ST7920\
-----此内容被chengyingavr于2007-05-17,01:47:13编辑过

Forever 发表于 2007-5-17 09:36:32

要顶一下!

zyjzqxy 发表于 2007-5-21 15:29:35

好东西啊..顶顶..

china 发表于 2007-6-7 16:49:34

急求atmega16L控制tc1602b的c程序!!!

各位大虾帮忙!

急需!!!!

我的邮箱oucchina@163.com
页: [1] 2 3 4 5
查看完整版本: 建议建立一个各种液晶的C程序 (及ysoni上传的液晶C资料)