建议建立一个各种液晶的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 好提议!
那位高手愿意操刀? 液晶都没碰过,也很想知道具体怎么样写...- -
不过什么都要阿莫和527奉献又不太好意思,毕竟这也要花费时间和精力- -
如果以后我自己搞懂了,很愿意自己来写.... 可以先从6963开始,先贴一个,然后大家讨论修改,最后变成标准的, 可以先从6963开始,先贴一个,然后大家讨论修改,最后变成标准的, 我在从m8移值到m16时,发现由于引脚的不同,程序的define要做点修改。如果建成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 感谢ysoni 分享哦!
我想“程序的define要做点修改”,这点通过不同版本的头文件来解决。
例如:Lcd1206_m8.hLcd1206_m16.h
这样,使用不同的MPU就引入不同版本的头文件。 对。通过头文件是个好方法。我现在就是这样用的。 感谢一下,找了很久的东西终于找到了- - 哈哈,如果 bailei 有什么好资料,又怕以后不知放那里了,可以上传过来给我。我将它整理到网站里。 非常谢谢 ysoni,好东东应该大家分享,敬礼! 非常感谢,真是雪中送炭 有没有人用过那种只有驱动器,没有控制器的液晶,应该叫液晶模块还是就叫液净. 大家有没有考虑可行性啊?毕竟各个厂家的接口和RAM->点阵的布局不同啊,控制命令的格式、参数也不一样。
正如不同内核的显卡没有通用的驱动程序一样。
-----此内容被Clamfly于2005-04-08,17:12:28编辑过 辛苦! 站长真的好爽! 谢谢咯! 好东西~!
谢谢~! 好东西,支持!! 果然是好东西,谢谢啦! 液晶的控制模块有不同的型号,控制方法各不相同。
我遇到的12864就有KS0107,HD16202.能统一就好了。 哈哈,真得不错! 厉害。。。 正在找这些资料呢,太有用了,实在太感激大家了 感谢ysoni的分享哦!对我有帮助! 想法是好的但是液晶的控制器太多了,一个人要想都做出来恐怕不太现实,希望大家把自己用过的液晶模块的详细介绍也做到库里而且想一个统一的命名规则(比如按控制器名称)方便大家的发布,和使用。 好东西,强烈支持 感谢ysoni!!!!! 俺由能耐了也来写!! 谢谢啊 液晶模块YJ-162A如何在AVR中显示汉字啊?,请教各位大侠! 感谢分享 学得这样不好,其实很多液晶要实现的功能都差不多(显示字符,显示图片,画线,光标等的),何不先拿一种液晶(3310的lcd)做好一套显示的API。 好见意! 我只用过SED1330的,附上
点击此处下载armok0176628.rar 按控制器的不同做个分类,从底层的I/O口开始分别作成不同的文件,一直驱动到顶层的功能函数。的有个引头的开始做大家往上补充完善,像开放软件的做法。 非常感谢 THX VERY MUCH. 我来凑个热闹,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);
}
}
说明:以上的是并口模式,呵呵,不好意思。将“并口”打成了“串口”,贴上去才发现。 ding 好,顶! 谢谢 谢谢 好贴,是不是重新开个版块? ting /********************************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);
}
} 有谁,做过MGLS12864-LED04的液晶,或者资料啊 好,收藏先,谢谢ysoni 厉害啊各位,我还是初学者,现在学ing 我也传一个RA8802的使用中文手册含例子程序的点击此处打开armok0191626.pdf 有哪位大虾做过LM6800(topway)的液晶驱动程序啊?控制器是S6B0108. 大家不怕等的话, 我愿意操刀. 虽然刚刚接触单片机, 但是做了多年的软件, 比较擅长抽象的东西. 我刚刚学了3310的驱动后就在想, 也已经在开始设计一个"万能"的液晶驱动.我的设想是, 先设计出一套和硬件无关的接口, 然后大家评议这套接口, 接口好了后, 我来工作呢, 主要是完成这些接口. 真正涉及到硬件的部分呢, 就由大家一块来完成.这样以后我们需要使用液晶(不一定是液晶, 其它的显示也可以)时, 就方便了, 显示的调试工作也方便了. 需要更换显示设备也可以不用修改程序, 只需要重新编译一把.
还有其它的硬件设备比如键盘, 从一个键到n个键都可以驱动的驱动程序......甚至可以说是一个可以裁剪的"操作系统"^_^ 有一个明显的问题是: 驱动越通用, 消耗单片机的资源越多. 所以考虑为不同应用场合的类型设计不同的驱动. 比如m8上不考虑320*240*16的液晶驱动, 不考虑支持虚拟屏幕.不考虑20按键以上的IO扫描方式驱动的键盘.
而对m128和arm这类的"蜈蚣虫", 根据屏幕在用户交互的重要程度的不同提供不同的驱动.
同时要考虑根据MCU对设备的驱动能力的不同提供不同的驱动.比如m8驱动3310, 如果SPI已经被其它的设备使用, 那么只能使用模拟的SPI(如使用D口), 这时应该使用不同的驱动.
但是, 不管如何, 这些驱动的接口却是一样的, 不会让程序感觉到液晶屏的不同. 非常感谢! 期待中 正在学用AVR和液晶显示器,非常感谢!!!!! 我做过6963,51的程序,如果大家碰到难题可以和我联系,也许我可以解答。
QQ:359543401 这个提议太好了,菜鸟们有福了 期待jimo完成这个项目,先说一声,辛苦了,好哥们! 现在正在进行中.
确实让大家久等了, 完成后一定第一时间奉献给大家. 我手头的液晶数目有限, 到时候还需要大家一块帮我扩展和测试呀! 我用到的液晶上面已经提供了,呵呵,以后用到别的话,一定和大家共享。 真是太感谢大家了
对我来说简直就是雪中送炭啊
但是有没有哪位大侠帮我解决一下啊
我现在在用ICCAVR做多功能电子钟老师给的夜晶显示器是TC1602B型的
我不知道怎么对他编程让他来显示时间啊
十万火急啊!,大家一定要帮帮我啊,不然就没法毕业了!!!! 我有个项目,需要用到128*64液晶。我初步想用两个单片机实现。现在我的时间不够用,可以的话,我想将LCD和键盘部分交给感兴趣的朋友做。有经验并有时间的请联系。email:enge_w@163.com;QQ:602838876; 看看这种串并口彩色液晶屏,内置矢量字库;采用标准指令集和单片很好连接的
在看看指令
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编辑过 very good 楼上的你的LCD不错啊 哪位大虾有128*34 液晶显示 的串口程序啊?急用~!~!~! 建议买本周立功的书,或开发版,上面有专门的液晶驱动.以及标准化了的库,液晶驱动都做成了标准库了,更改液晶,仅需要更改底层的一个驱动文件即可,其它的一点也不要再动了.相当好用.
好不好用自己看吧. 能明确一下是周立功的那本书吗? 我也要买那本书! 谢谢啊 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了。 好东西啊,我最近正好用的到! 高手们:
能不能给出有电路图的例呀!!!!!!!!!1 顶! 顶! /******************************************************************************
*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();
} 哪位大侠有RT12864j_3的资料,还有和AVR Mega8相连的C语言原程序阿!
小弟的邮箱:feiying_2005@sohu.com
小弟新手阿,请大侠们多多关照阿!!! 想问一下,SED1335和SID13305是不是可以替换,找不到SID13305的资料,哪位用过,帮个忙,我的邮箱是sym941@sina.com,先谢谢了。 好东西 哪位兄弟能提供12832液晶显示程序啊
雪地裸体跪求!!!!!!!!!!!!!!
我的 邮箱是:
weilx97@126.com
-----此内容被weilx于2006-09-18,22:54:58编辑过 收藏,期待更多更好的 哪位兄弟能提供AVR Mega168 驱动 PCF8576(I2C)ICC的程序啊! 各位高手我刚开始接触128*64点阵液晶显示器,发现很多类型的,不知道是不是所有的都是兼容的。 开源网站 哈哈 谢谢 好,有LMG9400的吗 好东西,多谢多谢 好东西,多谢多谢 好东西,多谢多谢 实在是好帖,感谢各位前辈 好东西 我想用JN5121驱动3510i和6610的LCD,前几天刚成功驱动了3310的LCD,由于水平所限以上俩个LCD的驱动一直都难以搞定。有朋友愿意帮忙写个驱动吗,没有JN5121开发板的我可以提供开发板资料和进行测试。谢谢!
QQ:13619286
Email:fbchenyong@163.com 站长真的是个好人啊!!!!!!!!!!!!!!!!!!!!1 这个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编辑过 要顶一下! 好东西啊..顶顶.. 急求atmega16L控制tc1602b的c程序!!!
各位大虾帮忙!
急需!!!!
我的邮箱oucchina@163.com