求STC12C5A60S2单片机的12864液晶串行程序

求STC12C5A60S2单片机的12864液晶串行程序,第1张

不知你的液晶是什么控制器的,这个是st7920的

/

文件名 : 串行12864显示c

描述 : 该程序实现了12864以串行的方式进行通信。

创建人 : 东流,2009年4月10日

版本号 : 20

/

#include <reg52h>

#include <intrinsh>

#define uchar unsigned char

#define uint unsigned int

sbit CS=P2^5; //片选信号

sbit SID=P2^6; //数据信号

sbit SCLK=P2^7; //时钟信号

sbit RST=P2^2; //复位信号

sbit CH = P2^4; //并行、串行选择信号

/

名称 : delay()

功能 : 延时,延时时间为 100us t。这是通过软件延时,有一定误差。

输入 : t

输出 : 无

/

void delay(unsigned int t)

{

unsigned int i,j;

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

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

}

/

名称 : sendbyte()

功能 : 按照液晶的串口通信协议,发送数据

输入 : zdata

输出 : 无

/

void sendbyte(unsigned char zdata)

{

unsigned int i;

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

{

if((zdata << i) & 0x80)

{

SID = 1;

}

else

{

SID = 0;

}

SCLK = 0;

SCLK = 1;

}

}

/

名称 : write_com()

功能 : 写串口指令

输入 : cmdcode

输出 : 无

/

void write_com(unsigned char cmdcode)

{

CS = 1;

sendbyte(0xf8);

sendbyte(cmdcode & 0xf0);

sendbyte((cmdcode << 4) & 0xf0);

delay(2);

}

/

名称 : write_data()

功能 : 写串口指令

输入 : cmdcode

输出 : 无

/

void write_data(unsigned char Dispdata)

{

CS = 1;

sendbyte(0xfa);

sendbyte(Dispdata & 0xf0);

sendbyte((Dispdata << 4) & 0xf0);

delay(2);

}

/

名称 : lcdinit()

功能 : 初始化函数

输入 : cmdcode

输出 : 无

/

void lcdinit()

{

RST = 0;

delay(100);

RST = 1;

delay(20000);

write_com(0x30);

delay(50);

write_com(0x0c);

delay(50);

}

/

名称 : hzkdis()

功能 : 显示字符

输入 : s

输出 : 无

/

void hzkdis(unsigned char code s)

{

while(s > 0)

{

write_data(s);

s++;

delay(50);

}

}

/

名称 : Test()

功能 : 显示子函数

输入 : 无

输出 : 无

/

void Test()

{

write_com(0x03);

delay(50);

write_com(0x81);

hzkdis(" HOT-51");

write_com(0x91);

hzkdis("单片机开发板");

write_com(0x89);

hzkdis(" ");

write_com(0x98);

hzkdis(" 东流电子");

}

/

名称 : Main()

功能 : 主函数

输入 : 无

输出 : 无

/

void Main()

{

CH = 0;

delay(1);

lcdinit();

delay(10);

while(1)

{

Test();

delay(5000);

}

}

>

#include <reg52h>

#include <intrinsh>

#define uint unsigned int

#define uchar unsigned char

#define Nop() _nop_()

/引脚端口定义/

sbit LCD12864_RS_PORT = P1^7; /LCD12864引脚定义/

sbit LCD12864_RW_PORT = P1^6;

sbit LCD12864_E_PORT = P2^3;

#define LCD12864_DA_PORT P0

sbit led_en_port = P2^5; /发光二极管寄存器LE引脚/

sbit sled_en_port = P3^6; /数码管寄存器LE引脚/

uchar hanzi_buff1[]={" 液晶显示 "};

//////////////////以下是LCD12864驱动程序////////////////

void LCD12864_WaitIdle()

//LCD12864 忙 信号检测

{

LCD12864_DA_PORT = 0xff;

LCD12864_RS_PORT = 0;

LCD12864_RW_PORT = 1;

LCD12864_E_PORT = 1;

while((LCD12864_DA_PORT&0x80)==1); /等待BF 不为1/

LCD12864_E_PORT = 0;

}

void LCD12864_COM_Write( uchar com_da)

/ 检测忙信号写入命令字

com_da 为待写入的命令字/

{

LCD12864_WaitIdle();

LCD12864_RS_PORT = 0;

LCD12864_RW_PORT = 0;

LCD12864_DA_PORT = com_da;

LCD12864_E_PORT = 1;

Nop();

Nop();

Nop();

Nop();

Nop();

Nop();

Nop();

Nop();

LCD12864_E_PORT = 0;

}

void LCD12864_NoWaitIdle_COM_Write(uchar com_da)

/ 不检测忙信号写入命令字

com_da 为待写入的命令字/

{

LCD12864_RS_PORT = 0;

LCD12864_RW_PORT = 0;

LCD12864_DA_PORT = com_da;

LCD12864_E_PORT = 1;

Nop();

Nop();

Nop();

Nop();

Nop();

Nop();

Nop();

Nop();

LCD12864_E_PORT = 0;

}

void LCD12864_Data_Write(uchar da)

/ 数据写入

da 为待写入的8位数据/

{

LCD12864_WaitIdle(); /检测忙信号/

LCD12864_RS_PORT = 1;

LCD12864_RW_PORT = 0;

LCD12864_DA_PORT = da;

LCD12864_E_PORT = 1;

Nop();

Nop();

Nop();

Nop();

Nop();

Nop();

Nop();

Nop();

LCD12864_E_PORT = 0;

}

void lcd_delay_ms(uchar x)

{

uchar j;

while(x--){

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

{;}

}

}

void LCD12864_Reset()

/LCD12864初始化/

{

lcd_delay_ms(100); /适当延时待LCD自动复位完成/

LCD12864_NoWaitIdle_COM_Write(0x30); /使用8位并口通讯/

lcd_delay_ms(10);

LCD12864_NoWaitIdle_COM_Write(0x30); /使用8位并口通讯/

lcd_delay_ms(10);

LCD12864_NoWaitIdle_COM_Write(0x0c); /显示开及光标设置/

lcd_delay_ms(10);

LCD12864_NoWaitIdle_COM_Write(0x01); /显示清屏/

lcd_delay_ms(30);

LCD12864_NoWaitIdle_COM_Write(0x06); /DDRAM的地址计数器(AC)加1/

lcd_delay_ms(30);

}

void LCD12864_HANZI_WRITE(uchar xpos,uchar ypos,uchar daH,uchar daL)

//ST7920 汉字字符写入

//参数说明: xpos 待写入的X位置

//ypos 待写入的Y位置

//daH 待写入的汉字的高八位 daL待写入的汉字的低八位

{

uchar xy_pos;

if((xpos>=8)||(ypos>=4) ) return; /X位置超出显示范围退出/

if(ypos==0) xy_pos = 0x80 + xpos;

else if(ypos==1) xy_pos = 0x90 + xpos; /计算转换地址/

else if(ypos==2) xy_pos = 0x88 + xpos;

else if(ypos==3) xy_pos = 0x98 + xpos;

LCD12864_COM_Write(xy_pos); /写地址/

lcd_delay_ms(1);

LCD12864_Data_Write(daH); /写高八位数据/

lcd_delay_ms(1);

LCD12864_Data_Write(daL); /写低八位数据/

lcd_delay_ms(1);

}

//////////////////以上是LCD12864驱动程序////////////////

void main()

{

uchar i;

LCD12864_Reset(); /LCD初始化/

LCD12864_DA_PORT = 0xff; /释放P0端口/

led_en_port = 0;/关闭发光二极管显示/

sled_en_port = 0;/关闭数码管显示/

while(1)

{

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

LCD12864_HANZI_WRITE(i,0,hanzi_buff1[i2],hanzi_buff1[i2+1]);

}

}

带中文字库的128X64是一种具有4位/8 位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块。

其显示分辨率为128×64,内置8192个1616点汉字,和128个168点ASCII字符集,利用该模块灵活的接口方式和简单、方便的 *** 作指令,可构成全中文人机交互图形界面。可以显示8×4行16×16点阵的汉字,也可完成图形显示,低电压低功耗是其又一显著特点。

由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。

扩展资料:

用带中文字库的128X64显示模块时应注意以下几点:

1欲在某一个位置显示中文字符时,应先设定显示字符位置,即先设定显示地址,再写入中文字符编码。

2显示ASCII字符过程与显示中文字符过程相同。不过在显示连续字符时,只须设定一次显示地址,由模块自动对地址加1指向下一个字符位置,否则,显示的字符中将会有一个空ASCII字符位置。

3当字符编码为2字节时,应先写入高位字节,再写入低位字节。

4模块在接收指令前,向处理器必须先确认模块内部处于非忙状态,即读取BF标志时BF需为“0”,方可接受新的指令。

如果在送出一个指令前不检查BF标志,则在前一个指令和这个指令中间必须延迟一段较长的时间,即等待前一个指令确定执行完成。指令执行的时间请参考指令表中的指令执行时间说明。

5“RE”为基本指令集与扩充指令集的选择控制位。当变更“RE”后,以后的指令集将维持在最后的状态,除非再次变更“RE”位,否则使用相同指令集时,无需每次均重设“RE”位。

参考资料:

百度百科--12864液晶

以上就是关于求STC12C5A60S2单片机的12864液晶串行程序全部的内容,包括:求STC12C5A60S2单片机的12864液晶串行程序、哪里有液晶WGM 12864的驱动程序和显示,包括文字数据,图片显示,proteus]仿真、求个51单片机控制KNY12864M液晶屏的简单程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/9834391.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存