/此程序适用于FYD12864-0402B/
#include <REG932H>
#define uchar unsigned char
#define uint unsigned int
//uchar data CMD;
//uchar data DATA;
uchar idata busy,Line,Col;
sbit RS= P2^0;
sbit RW= P2^1;
sbit E= P1^7;
sbit LCD_LIGHT= P2^7;
sbit LCD_RST= P2^6;
code char STR1[]= "成都飞宇达";
code char STR2[]= "欢迎您";
code char STR3[]= "谢谢";
code char STR4[]= "SCCDCYB";
void Read_Busy();
void Delay100us(volatile uint n);
void Clear_LCD();
void Write_Single_CMD(uchar cmd);
void Write_Single_Data(uchar a);
void Init_LCD();
void Display(uchar ptr,uchar ddram) ;
void Init_IO(void);
void Reset_St7920(void);
void DispSetCursor(uchar LineNum,uchar ColumnNum);
void main(void)
{
uchar i,j;
Init_IO();
Reset_St7920();
// LCD_LIGHT=1;
Clear_LCD();
Init_LCD();
Write_Single_CMD(0X01);
Display(STR1,0X80);
Display(STR2,0X90);
Display(STR3,0X88);
Display(STR4,0X98);
Delay100us(200);
Write_Single_CMD(0x80);
j=0;
for (i=0;i<32;i++)
{
Write_Single_Data(0xb4);
Write_Single_Data(0xde+j);
// Write_Single_CMD(0x01); //将光标移到0x9C
j++;
}
// Write_Single_CMD(0x01); //将光标移到0x9C
Write_Single_CMD(0x01); //光标移到0x9C
Write_Single_CMD(0x34); //将光标移到0x9C
Write_Single_CMD(0x36); //将光标移到0x9C
for (i=0;i<32;i++)
{
Write_Single_CMD(0x80+i);
Write_Single_CMD(0x80);
// Write_Single_CMD(0x01); //将光标移到0x9C
for (j=0;j<8;j++)
{
Write_Single_Data(0x00);
Write_Single_Data(0x00);
}
}
for (i=0;i<32;i++)
{
Write_Single_CMD(0x80+i);
Write_Single_CMD(0x88);
// Write_Single_CMD(0x01); //将光标移到0x9C
for (j=0;j<8;j++)
{
Write_Single_Data(0x00);
Write_Single_Data(0x00);
}
}
for (i=0;i<32;i++)
{
Write_Single_CMD(0x80+i);
Write_Single_CMD(0x80);
// Write_Single_CMD(0x01); //将光标移到0x9C
for (j=0;j<8;j++)
{
Write_Single_Data(0xFF);
Write_Single_Data(0xFF);
}
}
for (i=0;i<32;i++)
{
Write_Single_CMD(0x80+i);
Write_Single_CMD(0x88);
// Write_Single_CMD(0x01); //将光标移到0x9C
for (j=0;j<8;j++)
{
Write_Single_Data(0xFF);
Write_Single_Data(0xFF);
}
}
// DispSetCursor(1,3);
// for (i=0;i<64;i++)
// {
// for (j=0;j<16;j++)
// {
// Write_Single_Data(0x3f);
// Write_Single_Data(0xff);
// }
// }
while(1)
{
}
}
void Init_IO(void)
{
P0M1=0X00;
P0M2=0X00; //P0=I/O
P1M1=0X00; //P14:输入(DR)
P1M2=0X00; //P1=P16为推挽,其它为I/O
P2M1=0X00; //P26、P27:输入(AM、CD)
P2M2=0X00; //P2=I/O
P3M1=0X00;
P3M2=0X00; //P3=I
}
void Read_Busy(void) //读忙 *** 作
{
P0=0x0ff;
RS=0;
RW=1;
do{
E=1;
busy=P0;
E=0;
}while(busy>0x7f);
}
void Reset_St7920(void)
{
LCD_RST=0;
Delay100us(100);
LCD_RST=1;
Delay100us(200);
}
void Delay100us(volatile uint n)
{
uchar i;
while(n--)
for(i=0;i<40;i++)
;
}
void Write_Single_CMD(uchar cmd) //写单字节命令字
{
Read_Busy();
RS=0;
RW=0;
E=1;
P0=cmd;
E=0;
P0=0xff;
}
void Write_Single_Data(uchar a) //写单字节数据
{
Read_Busy();
RS=1;
RW=0;
E=1;
P0=a;
E=0;
P0=0xff;
}
void Init_LCD(void) //初始化LCD模块
{
Write_Single_CMD(0x30); //功能设置--8BIT控制界面,基本指令集
Delay100us(10);
Write_Single_CMD(0x30); //功能设置--8BIT控制界面,基本指令集
Delay100us(5);
Write_Single_CMD(0X0C);
Delay100us(5);
Write_Single_CMD(0x01); //清除屏幕显示,将DDRAM的地址计数器清零
Delay100us(2);
Write_Single_CMD(0x06); //DDRAM的地址计数器(AC)加1
Delay100us(1);
}
void DispSetCursor(uchar LineNum,uchar ColumnNum)
{
uchar i=0x00;
switch(LineNum&0x0f) //确定行号
{
case 0x00: i=0x80; break;
case 0x01: i=0xa0; break;
case 0x02: i=0x88; break;
case 0x03: i=0xa8; break;
default : break;
}
i = (ColumnNum&0x0f)|i; //确定列号
Write_Single_CMD(i);
}
void Clear_LCD(void)
{
Read_Busy();
RS=0;
RW=0;
P0=0x01;
E=1;
E=0;
}
/
void ExpandFucntionEnable(void)
Function:
/
void ExpandFunctionEnable(void)
{
Write_Single_CMD(0x34);
}
/
void ExpandFunctionDisable(void)
Function:
/
void ExpandFunctionDisable(void)
{
Write_Single_CMD(0x30);
}
/
void ClearScreen(void)
Function:
/
void ClearScreen(void)
{
Write_Single_CMD(0x01);
Delay100us(100);
}
/
void CursorGoHome(void)
Funtion:
Cursor go home,DDRAM's address counter 'AC=0x00'
/
void CursorGoHome(void)
{
Write_Single_CMD(0x02);
}
/
void DisplayOn(void)
Function:
/
void DisplayOn(void)
{
Write_Single_CMD(0x0d); //整体显示开,游标开,游标位置反白禁止
}
/
void DisplayOff(void)
Function:
/
void DisplayOff(void)
{
Write_Single_CMD(0x09);
}
/
void IdleMode(void)
Function:
Expand instruction
/
void IdleMode(void)
{
Write_Single_CMD(0x01);
}
/
void RollInstructionEnable(void)
Function:
Expand instruction
/
void RollInstructionEnable(void)
{
Write_Single_CMD(0x03);
}
/
void RollInstructionDisable(void)
Function:
Expand instruction
/
void RollInstructionDisable(void)
{
Write_Single_CMD(0x02);
}
/
void SetRollAddress(unsigned char WhichLine)
Function:
Expand instruction
/
void SetRollAddress(uchar WhichLine)
{
ExpandFunctionEnable();
RollInstructionEnable();
Write_Single_CMD(WhichLine|0x40);
ExpandFunctionDisable();
}
/
void Sleep(void)
Function:
Expand instruction
/
void Sleep(void)
{
Write_Single_CMD(0x08);
}
/
void Waken(void)
Function:
Expand instruction
/
void Waken(void)
{
Write_Single_CMD(0x0c);
}
/
void NegativeDisplay(uchar WhichLine)
Function:
Expand instruction
WhichLine=1,2,3,4
/
void NegativeDisplay(uchar WhichLine)
{
if(WhichLine>4)return;
if(WhichLine==0)return;
Write_Single_CMD((WhichLine-1)|0x04);
}
void Display(uchar ptr,uchar ddram)
{
uchar i,l,x;
l=0;
if(ddram<0x88)
{ Line=0; } //定位行地址:第一行
else if(ddram<0xA0)
{ Line=2; } //定位行地址:第三行
else if(ddram<0xA8)
{ Line=1; } //定位行地址:第二行
else
{ Line=3; } //定位行地址:第四行
Col=0x0f&ddram; //定位列地址
if(Col>0x07)
{ Col=Col-0x08;}
x=Col2;
Write_Single_CMD(ddram); // 定位显示起始地址
while ((ptr[l])!='\0')
{l++;}
for (i=0;i<l;i++)
{
Write_Single_Data(ptr[i]); //输出单个字符
x++;
if (x ==0x10)
{
x=0;
Line++;
switch (Line)
{
case 0:Write_Single_CMD(0x80);
break;
case 1:Write_Single_CMD(0xA0);
break;
case 2:Write_Single_CMD(0x88);
break;
case 3:Write_Single_CMD(0xA8);
}
if (Line>3)
{
Write_Single_CMD(0x80);
Line=0;
}
}
}
}
{
delay(10);
RS = 0;
RW = 0;
PORTD = cmd;
E = 1;
E = 0;
}
这一段你改改
先检测液晶忙不忙,再写数据或命令
while(lcd_busy()); //此处检测液晶是否处于忙状态
RS = 0;
RW = 0;
EN = 0; //先使EN = 0;
delay(1);
PORTD = com;
delay(1);
lcd_en = 1;
delay(1); //此处适当延迟
lcd_en = 0;
你可以先这样试试,如果不行的话可以找我哈!乐意帮你忙哈~
段1:为这些引脚号起个有实际含义别名,有助于阅读程序,可以理解为#define Name P2^4
段2:检测液晶是否正忙,能否接受指令,等待液晶不忙时退出函数,下面就可以发送指令了
段3:命令是用来控制液晶的,例如清除显示内容,查询液晶状态等等,数据是用来显示的编码,类似于数码管的显示码,具体字符的编码要查手册。准确地说,数据也是通过命令的形式传进液晶的。
段4:通过各种指令进行初始化。液晶“模块”相当于单片机+“屏幕”,类似于启动开机步骤。
包括:设置工作方式,如串行或并行方式
复位,先置复位脚低,再置高
选择指令集,告诉液晶如何把指令翻译正具体 *** 作,具体指令手册上有
数据流,指令通过什么样的信号传输,如8位并行,4位并行,串行
开显示,打开屏幕,之前的 *** 作在屏幕上都是看不到的,都是内部 *** 作
清除显示,清显示缓冲区,就是模块内存放显示内容编码一内存
游标等,控制当标位置,类比于windows的文本编辑,那个闪烁的光标是可以用鼠标、键盘控制的
段5:模块本身内置了常用标准字符的编码,就是字符格式,或称之为字库。平时使用只要输入比如说ascii码至模块,模块会自动转换为具体的点阵编码;此外还可以自定义部分非标准编码,其字符格式(即点阵)需要自己编,比如一个816点阵共128点,哪些点亮哪些点灭由1bit二进制数表示,共16字节,1616点阵就是32字节,按照液晶模块规定的顺序,发送至模块自定义区(有专用指令),之后就可以像使用内置字库一样使用了,而不用每次传输16或32字节。
段6:x y不能理解为坐标。编写者懒得命名了。具体要看怎么调用的,x应该是把一个大区域分成小区域的编号,y是小区域内部的编号
段7:好像是由液晶内部地址排列规则决定的。从地址上看,12864应该是两组6464拼起来的,所以水平地址不同,相当于片选信号不同。
以上就是关于FYD12864-0402B液晶显示模块C语言程序全部的内容,包括:FYD12864-0402B液晶显示模块C语言程序、我的带中文字库的12864无法显示,请各位高手帮帮我看看C程序,我用的是PIC16F877、ly51s单片机开发板做的 12864液晶显示原理和C程序每一句都是什么意思,请高手教教我~感激不尽QQ174649050等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)