不知你的液晶是什么控制器的,这个是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 液晶显示汉字进行闪烁!!!!!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)