求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);

}

}

下面是我机子上调试过的一个程序,希望那个对你有所帮助。。

祝你好运~~~~~~

//

/ /

/名称: LCD12864显示程序 /

/功能: 显示英文,数字,符号,。 /

/难度等级: 高 /

//

#include <reg52h>

#include <stringh>

#define uchar unsigned char

/引脚定义/

sbit lck = P3^5;//锁存信号

/常用命令及参数定义/

#define DISPON 0x3f

#define DISPOFF 0x3e

#define DISPFIRST 0xc0

#define SETX 0x40

#define SETY 0xb8

#define LCDBUZY 0x80

#define L 0x00

#define R 0x40

#define LIMIT 0x80

/全局变量/

uchar cbyte;

uchar data statu;

bit xy;

/函数/

void WrL(uchar x);

void WrR(uchar x);

void Lcmcls(void);

void delay1s(void);

void Lcminit (void);

void Putpicture(uchar flag);

void delay(unsigned int time);

void VtoH8x16change(uchar hzbuf);

void Puthalf(uchar strch,uchar row,uchar col);

void Wrdata(uchar x,uchar row,uchar col);

void Locatexy(uchar row,uchar col);

void vWrite8x16Character(uchar ch,uchar row,uchar col,bit flag);

void vWrite8x16String(uchar str,uchar col, uchar row, bit flag);

extern uchar code picture1[];

extern uchar code picture2[];

extern uchar code char_Table[95][16];

/主程序/

void main(void)

{

Lcminit();

while(1){

Putpicture(0);

delay1s();

Lcmcls();

Putpicture(1);

delay1s();

Lcmcls();

vWrite8x16String("abcdefghijklmn" ,0, 8,0);

vWrite8x16String("ABCDEFGHIJKLMN", 2, 8,0);

vWrite8x16String("12345678901234", 4, 8,0);

vWrite8x16String("+-/!@#$%^&()", 6, 8,0);

delay1s();

Lcmcls();

}

}

/微秒级延时/

void delay(unsigned int time)

{ unsigned int i;

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

}

/约5S延时/

void delay1s(void)

{

delay(50000);

delay(50000);

delay(50000);

delay(50000);

delay(50000);

delay(50000);

delay(50000);

delay(50000);

delay(50000);

delay(50000);

delay(50000);

delay(50000);

delay(50000);

delay(50000);

delay(50000);

}

//初始化LCD/

void Lcminit (void)

{

cbyte=DISPOFF;

WrL(cbyte);

WrR(cbyte);

cbyte=DISPON;

WrL(cbyte);

WrR(cbyte);

cbyte=DISPFIRST;

WrL(cbyte);

WrR(cbyte);

Lcmcls();

Locatexy(0,0);

}

/LCD清屏/

void Lcmcls(void)

{ uchar i,j;

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

delay(6);

for(j=0;j<LIMIT;j++){

delay(6);

Wrdata(0x0,i,j);

}

}

}

/写左区/

void WrL(uchar x)

{

P0=0xFF;//P0口送FF,准备读

lck = 0;

P1 = 0x2a;//ELCD=1�/W=1(读),CSB=1,CSA=0

lck = 1;

while(P0 & LCDBUZY);//最高位为1,表示忙,则循环

lck = 0;

P1 = 0x00;//ELCD=0,R/W=0(读),CSB=0,CSA=0

lck = 1;

P0 = x; //数据送到P0口

lck = 0;

P1 = 0x22;//ELCD=1,RW = 0(写),CSB=1,CSA=0

lck = 1;

lck = 0;

P1 = 0x00;//ELCD=0,RW = 0(写),CSB=0,CSA=0

lck = 1;

}

/写右区/

void WrR(uchar data x)

{

P0=0xFF;//P0口送FF,准备读

lck = 0;

P1 = 0x29;//ELCD=1,R/W=1(读),CSB=0,CSA=1

lck = 1;

while(P0 & LCDBUZY);//最高位为1,表示忙,则循环

lck = 0;

P1 = 0x00;//ELCD=0,R/W=0(读),CSB=0,CSA=1

lck = 1;

P0=x; //数据送到P0口

lck = 0;

P1 = 0x21;//ELCD=1,RW = 0(写),CSB=0,CSA=1

lck = 1;

lck = 0;

P1 = 0x00;//ELCD=0,RW = 0(写),CSB=0,CSA=0

lck = 1;

}

/定位/

void Locatexy(uchar row,uchar col)

{

uchar x, y, right;

switch(col&0xc0)

{

case 0:{

P0=0xFF;//P0口送FF,准备读

lck = 0;

P1 = 0x29;//ELCD=1,R/W=1(读),CSB=0,CSA=1

lck = 1;

while(P0 & LCDBUZY);//最高位为1,表示忙,则循环

lck = 0;

P1 = 0x00;

lck = 1;

right = 1;break;}//置右半屏标志

case 0x40:{

P0=0xFF;//P0口送FF,准备读

lck = 0;

P1 = 0x2a;//ELCD=1,R/W=1(读),CSB=1,CSA=0

lck = 1;

while(P0 & LCDBUZY);//最高位为1,表示忙,则循环

lck = 0;

P1 = 0x00;//ELCD=0,R/W=0(读)�CSB=0,CSA=0

lck = 1;

right = 0;break;}//置左半屏标志

}

x=col&0x3f|SETX;//把列数据变成行命令

y=row&0x07|SETY;//把行数据变成行命令

//

lck = 0;

if(right)

P1 = 0x29;

else

P1 = 0x2a;

lck = 1;

while(P0 & LCDBUZY);//最高位为1,表示忙,则循环

lck = 0;

P1 = 0x00;

lck = 1;

/以上为判断忙标志/

//

P0 = y;

lck = 0;

if(right)

P1 = 0x21;

else

P1 = 0x22;

lck = 1;

lck = 0;

P1 = 0x00;

lck = 1;

/以上为送行命令/

P0=0xFF;

lck = 0;

if(right)

P1 = 0x29;

else

P1 = 0x2a;

lck = 1;

while(P0 & LCDBUZY);//最高位为1,表示忙,则循环

lck = 0;

P1 = 0x00;

lck = 1;

/以上为判断忙标志/

P0 = x;

lck = 0;

if(right)

P1 = 0x21;

else

P1 = 0x22;

lck = 1;

lck = 0;

P1 = 0x00;

lck = 1;

/以上为送列命令/

if(right)

statu = 1;

else

statu = 0;//置左又半区标志

}

/数据写输出/

void Wrdata(uchar x,uchar row,uchar col)

{

Locatexy(row,col);//定位显示位置

lck = 0;

if(statu)

P1 = 0x05;//ELCD=0�R/W=0(写),D/I= 1 ,CSB=0,CSA=1

else

P1 = 0x06;//ELCD=0,R/W=0(写),D/I= 1 ,CSB=1,CSA=0

lck = 1;

P0 = x;

lck = 0;

if(statu)

P1 = 0x25;//ELCD=1,R/W=0(写),D/I= 1 ,CSB=0,CSA=1

else

P1 = 0x26;//ELCD=1,R/W=0(写),D/I= 1 ,CSB=1,CSA=0

lck = 1;

lck = 0;

P1 = 0x00;

lck = 1;

}

/图形输出/

void Putpicture(uchar flag)

{

unsigned char i,j,row, col ;

unsigned int x;

row = 0; col=0;

for(j=0;j<128;j++){

x=j0x08;

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

{ if(flag)

cbyte=picture1[x++];

else

cbyte=picture2[x++];

Wrdata(cbyte,row,col);

row++;

}

row=0;

col++;

}

}

/半角数据点阵输出/

void Puthalf(uchar strch,uchar row,uchar col)

{

uchar i,bakerx;

bakerx = row;

for(i=0;i<16;i++)//上半字输出

{

cbyte=strch[i];

Wrdata(cbyte,bakerx,col);

cbyte=strch[i+1];

Wrdata(cbyte,bakerx+1,col);

col++;

i++;

}

}

/汉字输出/

/void Puthz(uchar str,uchar row,uchar col)

{

uchar i,bakerx;

bakerx=row;

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

{

cbyte=str[i];

Wrdata(cbyte,row,col); //上半字节输出

i++;

row=bakerx+1;

cbyte=str[i];

Wrdata(cbyte,row,col); //下半字节输出

row=bakerx;

col=col+1;

}

}

/

/字符型点阵行--》列转换/

void VtoH8x16change(uchar hzbuf)

{ uchar i,j,k, cash[16];

uchar newbyte, savebit[8];

for(k=0;k<16;k++){

newbyte = 0;

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

savebit[i]=hzbuf[i] & 0x80;

}

for(j=0;j<8;j++){

savebit[j] = savebit[j] >> (7-j);

newbyte = newbyte | savebit[j];

}

cash[k] = newbyte;

newbyte = 0;

for(i=8;i<16;i++){

savebit[i-8]=hzbuf[i] & 0x80;

}

for(j=0;j<8;j++){

savebit[j] = savebit[j] >> (7-j);

newbyte = newbyte |savebit[j];

}

cash[k+1] = newbyte;

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

hzbuf[j] = hzbuf[j] <<1;

}

k++;

}

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

hzbuf[i] = cash[i];

}

/显示英文和符号字符/

void vWrite8x16Character(uchar ch,uchar row,uchar col,bit flag)

{

uchar ucXArray[16],i;

if(flag){ // 反白显示英文

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

ucXArray[i] = ~ch[i];

}else{

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

ucXArray[i] = ch[i];

}

VtoH8x16change(ucXArray);

Puthalf(ucXArray,row,col);

}

/显示英文字符串/

void vWrite8x16String(uchar str,uchar row, uchar col, bit flag)

{

unsigned char i, j,thiscol;

j = strlen(str);

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

{ thiscol = (i % 16) 8 + col;//计算列地址

if(str[i] < 0xa1)//当前显示内容为英文字符

vWrite8x16Character(&char_Table[str[i]-0x20][0],row,thiscol,flag);

}

}

先写入你要闪烁的字符的地址到12864中,然后写入0x0d到12864中,屏幕上对应的字符就会反白闪烁。如果要分钟的字符闪烁就按照前一步,写入字符所在的地址,再写入0x0d。如果不需要闪烁就写入0x0c。例如:要让第一行的第二个字符闪烁,那就写入地址0x81和0x0d。

PC2~PC5为JTAG端口,所以使用PC端口时要特别小心。你尝试一下:程序里面要通过 MCUCSR = 0x80;//禁止JTAG;在下载程序时,把熔丝位中的“使能JTAG接口[JATGEN=0]”的勾去掉。(程序和熔丝位都要改哦,你先看看行不行,如果不行我再帮你看看程序!)

以上就是关于求STC12C5A60S2单片机的12864液晶串行程序全部的内容,包括:求STC12C5A60S2单片机的12864液晶串行程序、求!!液晶显示 HDG12864f-3 c程序、怎样实现12864 液晶显示汉字进行闪烁!!!!!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存