FYD12864-0402B液晶显示模块C语言程序

FYD12864-0402B液晶显示模块C语言程序,第1张

/此程序适用于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等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10212179.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存