📄 lcd_test.c
字号:
/***********************************************
TCM12864J液晶显示屏驱动程序
驱动芯片:KS0107
MCU:AT89S52
作者:金杰
日期:08-09-05
P11--RS RS=1,表示DB7~DB0 为显示数据
RS=0”,表示DB7~DB0 为显示指令数据
P12--RW R/W=1”,E=“H”,数据被读到DB7~DB0
R/W=0”,E=“H→L”, DB7~DB0 的数据被写到IR 或DR
P13--E 使能信号: R/W=“L”,E 信号下降沿锁存DB7~DB0
R/W=“H”,E=“H” DRAM数据读到DB7~DB0
P14--CSA H:选择芯片(右半屏)信号
P15--CSB H:选择芯片(左半屏)信号
P2---DB0~7
***********************************************/
#include <reg51.h>
#include <absacc.h>
#include <intrins.h>
#include <stdio.h>
#include <Word.h>
//sbit P15 = P1^5;
sbit p_RS = P1^1;
sbit p_RW = P1^2;
sbit p_E = P1^3;
sbit p_CSA = P1^4;
sbit p_CSB = P1^5;
#define DATA P2
void DelayMs(unsigned int count1);
void lcd_busy(void);
void lcd_init(void);
void lcd_setxy(unsigned char x,unsigned char y);
void lcd_writedata(unsigned char x,unsigned char y);
void lcd_writeword(unsigned char x,unsigned char y,unsigned char d[2][6]);
void lcd_clear(void);
void lcd_writepoint(unsigned char i,unsigned char j);
unsigned char lcd_readdata(unsigned char x,unsigned char y);
void main(void) //主函数
{
unsigned char z;
unsigned char i1=32,j1,flag=0;
lcd_init();
lcd_clear();
for(j1=0;j1<128;j1++)
{
lcd_writepoint(i1,j1);
if(flag==0)i1=i1-1;
else i1=i1+1;
if(i1<=0)flag=1;
if(i1>=32)flag=0;
}
while(1)
{
for(z=0;z<2;z++)
{
lcd_writeword(3,45,w1);
DelayMs(1000);
lcd_writeword(3,45,w2);
DelayMs(1000);
lcd_writeword(3,45,w3);
DelayMs(1000);
lcd_writeword(3,45,w4);
DelayMs(1000);
lcd_writeword(3,45,w5);
DelayMs(1000);
lcd_writeword(3,45,w6);
DelayMs(1000);
lcd_writeword(3,45,w7);
DelayMs(1000);
lcd_writeword(3,45,w8);
DelayMs(2000);
}
lcd_clear();
}
for(i1=0;i1<64;i1++)
for(j1=0;j1<128;j1++)
{
lcd_writepoint(i1,j1);
DelayMs(200);
}
lcd_clear();
/* while(1)
{
lcd_clear();
lcd_busy();
lcd_writeword(0,0,ee); //南
lcd_writeword(0,16,ff); //京
lcd_writeword(0,32,aa); //绝
lcd_writeword(0,48,bb); //妙
lcd_writeword(0,64,cc); //科
lcd_writeword(0,80,dd); //技
lcd_writeword(0,96,gg); //发
lcd_writeword(0,112,hh); //展
lcd_writeword(2,0,ii); //有
lcd_writeword(2,16,jj); //限
lcd_writeword(2,32,kk); //公
lcd_writeword(2,48,ll); //司
lcd_writeword(2,64,k); //句号
lcd_writeword(2,80,mm); //专
lcd_writeword(2,96,nn); //业
lcd_writeword(2,112,oo); //液
lcd_writeword(4,0,pp); //晶
lcd_writeword(4,16,qq); //屏
lcd_writeword(4,32,dd); //技
lcd_writeword(4,48,rr); //术
lcd_writeword(4,64,k); //句号
lcd_writeword(4,80,ss); //欢
lcd_writeword(4,96,tt); //迎
lcd_writeword(4,112,uu); //使
lcd_writeword(6,0,vv); //用
lcd_writeword(6,16,k); //句号
lcd_writeword(6,80,zzz);
lcd_writeword(6,96,zzz);
lcd_writeword(6,112,zzz);
for(z=0;z<2;z++)
{
lcd_writeword(6,64,w1);
DelayMs(150);
lcd_writeword(6,64,w2);
DelayMs(150);
lcd_writeword(6,64,w3);
DelayMs(150);
lcd_writeword(6,64,w4);
DelayMs(150);
lcd_writeword(6,64,w5);
DelayMs(150);
lcd_writeword(6,64,w6);
DelayMs(150);
lcd_writeword(6,64,w7);
DelayMs(150);
lcd_writeword(6,64,w8);
DelayMs(150);
}
lcd_clear();
//第二屏
lcd_busy();
lcd_writeword(0,0,ww);//地
lcd_writeword(0,16,xx);//址
lcd_writeword(0,32,j); //:
lcd_writeword(0,48,yy);//中
lcd_writeword(0,64,zz);//山
lcd_writeword(0,80,a);//东
lcd_writeword(0,96,b);//路
lcd_writeword(0,112,zzz);
lcd_writeword(2,0,l); //11
lcd_writeword(2,16,m); //0
lcd_writeword(2,32,c); //号
lcd_writeword(2,48,d); //二
lcd_writeword(2,64,e); //楼
lcd_writeword(2,80,n); //23
lcd_writeword(2,96,c); //号
lcd_writeword(2,112,k);//句号
lcd_writeword(4,0,f); //电
lcd_writeword(4,16,g); //话
lcd_writeword(4,32,o); //02
lcd_writeword(4,48,p); //5-
lcd_writeword(4,64,q); //84
lcd_writeword(4,80,r); //53
lcd_writeword(4,96,s); //28
lcd_writeword(4,112,t); //68
lcd_writeword(6,0,h); //传
lcd_writeword(6,16,i); //真
lcd_writeword(6,32,o); //02
lcd_writeword(6,48,p); //5-
lcd_writeword(6,64,q); //84
lcd_writeword(6,80,u); //41
lcd_writeword(6,96,n); //23
lcd_writeword(6,112,v); //46
DelayMs(2000);
lcd_clear();
}*/
}
void DelayMs(unsigned int count1)
{
while (count1--)
{
unsigned char count2 = 0;
for (; count2<30; count2++);
}
}
/***********************************************
查询LCD是否忙碌,如果忙碌,则等待,直到不忙碌,
跳出该函数,顺序执行下面程序
************************************************/
void lcd_busy(void)
{
p_RS=0; //CMD
p_RW=1; //READ
while(1)
{
p_E=1;
if(DATA<0x80)break; //BUSY(DB7) = 0
p_E=0;
}
p_E=0;
}
/**********************************************
初始化
***********************************************/
void lcd_init(void)
{
//开显示
p_RS=0; //CMD
p_RW=0; //Write
DATA=0x3f; //Display ON
p_CSA=1;
p_CSB=0;
p_E=1;
p_E=0;
p_CSA=0;
p_CSB=1;
p_E=1;
p_E=0;
//0行显示
lcd_busy();
//P15=0;
DATA=0xc0; //0行开始
p_CSA=1;
p_CSB=0;
p_E=1;
p_E=0;
p_CSA=0;
p_CSB=1;
p_E=1;
p_E=0;
}
/**********************************************
设置行值和列值
***********************************************/
void lcd_setxy(unsigned char x,unsigned char y)
{
if(y<64)
{
//写行地址left
lcd_busy();
p_RS=0;
p_RW=0;
p_CSA=1;
p_CSB=0;
DATA=0xb8|x;
p_E=1;
p_E=0;
//写列地址left
lcd_busy();
p_RS=0;
p_RW=0;
p_CSA=1;
p_CSB=0;
DATA=0x40|y;
p_E=1;
p_E=0;
}
else
{
//y=y-64;
//写行地址right
lcd_busy();
p_RS=0;
p_RW=0;
p_CSA=0;
p_CSB=1;
DATA=0xb8|x;
p_E=1;
p_E=0;
//写列地址right
lcd_busy();
p_RS=0;
p_RW=0;
p_CSA=0;
p_CSB=1;
DATA=0x40|y;
p_E=1;
p_E=0;
}
}
/**********************************************
画点i(0-63),j(0-127)
***********************************************/
void lcd_writepoint(unsigned char i,unsigned char j)
{
unsigned char x,y,data_t=0x00;
y=j;
if(i>=0&&i<=7)
{
x=0;
data_t=(0x01<<i);
}
else if(i>=8&&i<=15)
{
x=1;
data_t=(0x01<<(i-8));
}
else if(i>=16&&i<=23)
{
x=2;
data_t=(0x01<<(i-16));
}
else if(i>=24&&i<=31)
{
x=3;
data_t=(0x01<<(i-24));
}
else if(i>=32&&i<=39)
{
x=4;
data_t=(0x01<<(i-32));
}
else if(i>=40&&i<=47)
{
x=5;
data_t=(0x01<<(i-40));
}
else if(i>=48&&i<=55)
{
x=6;
data_t=(0x01<<(i-48));
}
else if(i>=56&&i<=63)
{
x=7;
data_t=(0x01<<(i-56));
}
lcd_busy();
lcd_setxy(x,y);
p_RS=1;
p_RW=0;
if(y<64)
{
p_CSA=1;
p_CSB=0;
}
else
{
p_CSA=0;
p_CSB=1;
}
DATA=data_t;
p_E=1;
p_E=0;
}
/**********************************************
写数据,给所有单元都写入0
***********************************************/
void lcd_writedata(unsigned char x,unsigned char y)
{
lcd_busy();
lcd_setxy(x,y); //set x,y address
p_RS=1; //write data
p_RW=0; //write
if(y<64)
{
p_CSA=1;
p_CSB=0;
}
else
{
p_CSA=0;
p_CSB=1;
}
DATA=0x00;
p_E=1;
p_E=0;
}
/**********************************************
显示字
***********************************************/
void lcd_writeword(unsigned char x,unsigned char y,unsigned char d[2][16])
{
unsigned char i,j;
for(i=0;i<2;i++)
for(j=0;j<16;j++)
{
lcd_busy();
lcd_setxy(i+x,j+y);
p_RS=1; //write data
p_RW=0;
if(y<64)
{
p_CSA=1;
p_CSB=0;
}
else
{
p_CSA=0;
p_CSB=1;
}
DATA=d[i][j];
p_E=1;
p_E=0;
}
}
/**********************************************
读显示字
***********************************************/
unsigned char lcd_readdata(unsigned char x,unsigned char y)
{
unsigned char data_t;
lcd_busy();
lcd_setxy(x,y); //set x,y address
p_RS=1;
p_RW=1;
if(y<64)
{
p_CSA=1;
p_CSB=0;
}
else
{
p_CSA=0;
p_CSB=1;
}
p_E=1;
data_t=DATA;
p_E=0;
return data_t;
}
/**********************************************
清屏
***********************************************/
void lcd_clear(void)
{
unsigned char i,j;
for(i=0;i<8;i++)
for(j=0;j<128;j++)
lcd_writedata(i,j);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -