标题:
LCD240*64 T6963C单片机驱动程序+电路图+实物制作
[打印本页]
作者:
51黑ren
时间:
2015-12-23 01:52
标题:
LCD240*64 T6963C单片机驱动程序+电路图+实物制作
倒班了,能有点在家时间了没事鼓弄着玩!上传到51黑电子论坛分享给需要的朋友们。
LCD240*64 T6963C电路图和单片机连接
这是做出来的实物图
下面是LCD240*128液晶屏幕T6963C驱动芯片的程序源代码:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define nop() _nop_();
sbit ce=P1^0; //片选
sbit cd=P1^3; //命令或数据
sbit rd=P1^4; //读
sbit wr=P1^5; //写
sbit rst=P1^6; //复位
//sbit sta0=P2^0; //测执行命令忙
//sbit sta1=P2^1; //测读写数据忙
//sbit sta2=P2^3; //测连续写忙
uint text_size,graphic_size; //定义文本区和图形区宽度
uint text_startaddr,graphic_startaddr; //文本和图形土起始位
uint text_startaddr_l,text_startaddr_h; //定义文本区起始高位低位置
uint graphic_startaddr_l,graphic_startaddr_h; //定义图形区首地址
uint *p; //图片数据指针
uchar code cgtab[]={
//-- 我 --
0x04,0x0E,0x78,0x08,0x08,0xFF,0x08,0x08,
0x0A,0x0C,0x18,0x68,0x09,0x0A,0x28,0x10,
0x80,0xA0,0x90,0x90,0x84,0xFE,0x80,0x90,
0x90,0x60,0x40,0xA0,0x20,0x14,0x14,0x0C,
//-- 爱 --
0x00,0x3F,0x11,0x09,0x7F,0x42,0x82,0x7F,
0x04,0x07,0x0A,0x09,0x10,0x11,0x22,0x0C,
0x78,0x80,0x10,0x20,0xFE,0x02,0x04,0xF8,
0x00,0xF0,0x20,0x40,0x80,0x60,0x1C,0x08,
//-- 家 --
0x02,0x01,0x7F,0x40,0x80,0x3F,0x04,0x1A,
0x63,0x05,0x19,0x63,0x05,0x19,0x65,0x02,
0x00,0x00,0xFE,0x02,0x04,0xF8,0x00,0x10,
0x30,0x40,0x80,0x40,0x30,0x0E,0x04,0x00,
//-- 希 --
0x08,0x06,0x01,0x06,0x3A,0x02,0xFF,0x04,
0x08,0x1F,0x28,0xC8,0x08,0x08,0x00,0x00,
0x30,0xC0,0x00,0xC0,0x38,0x00,0xFE,0x80,
0x88,0xFC,0x88,0x88,0xA8,0x90,0x80,0x80,
//-- 望 --
0x10,0x0A,0xFF,0x20,0x20,0x26,0x38,0x20,
0x00,0x3F,0x01,0x1F,0x01,0x01,0xFF,0x00,
0x04,0x7E,0x44,0x7C,0x44,0x7C,0x44,0x8C,
0x00,0xF8,0x00,0xF0,0x00,0x04,0xFE,0x00,
//-- 和 --
0x02,0x07,0x78,0x08,0x0A,0xFF,0x08,0x18,
0x1C,0x2A,0x2A,0x48,0x88,0x08,0x08,0x08,
0x00,0x00,0x00,0x04,0xFE,0x84,0x84,0x84,
0x84,0x84,0x84,0x84,0xFC,0x84,0x00,0x00,
//-- 睦 --
0x08,0x7C,0x4B,0x48,0x48,0x78,0x4F,0x49,
0x4A,0x7C,0x4B,0x48,0x48,0x78,0x4F,0x00,
0x40,0x48,0xFC,0x40,0x40,0x44,0xFE,0x10,
0x4C,0x44,0xF8,0x40,0x40,0x44,0xFE,0x00,
//-- 开 --
0x00,0x7F,0x08,0x08,0x08,0x08,0x08,0xFF,
0x08,0x08,0x08,0x08,0x10,0x10,0x20,0x40,
0x08,0xFC,0x20,0x20,0x20,0x20,0x24,0xFE,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
//-- 心 --
0x02,0x01,0x00,0x00,0x08,0x08,0x28,0x28,
0x28,0x48,0x88,0x08,0x08,0x08,0x07,0x00,
0x00,0x00,0x80,0xC0,0x80,0x00,0x08,0x04,
0x02,0x02,0x02,0x00,0x10,0x10,0xF0,0x00,
//-- 幸 --
0x01,0x01,0x3F,0x01,0x01,0xFF,0x08,0x04,
0x3F,0x01,0x01,0x7F,0x01,0x01,0x01,0x01,
0x00,0x10,0xF8,0x00,0x04,0xFE,0x20,0x50,
0xF8,0x00,0x08,0xFC,0x00,0x00,0x00,0x00,
//-- 福 --
0x20,0x17,0x10,0x03,0xFA,0x0A,0x13,0x38,
0x57,0x94,0x14,0x17,0x14,0x14,0x17,0x14,
0x08,0xFC,0x00,0xF8,0x08,0x08,0xF8,0x04,
0xFE,0x44,0x44,0xFC,0x44,0x44,0xFC,0x04,
//-- 每 --
0x10,0x10,0x1F,0x20,0x5F,0x12,0x11,0x10,
0xFF,0x12,0x21,0x20,0x3F,0x00,0x00,0x00,
0x00,0x08,0xFC,0x10,0xF8,0x10,0x10,0x14,
0xFE,0x10,0x10,0x10,0xF8,0x20,0xA0,0x40,
//-- 一 --
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x04,0xFE,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//-- 天 --
0x00,0x7F,0x01,0x01,0x01,0x01,0xFF,0x01,
0x02,0x02,0x04,0x04,0x08,0x10,0x20,0xC0,
0x08,0xFC,0x00,0x00,0x00,0x04,0xFE,0x00,
0x80,0x80,0x40,0x40,0x20,0x10,0x0E,0x04,
//-- 。 --
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x3C,0x66,0x66,0x66,0x3C,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
/*********************延时函数************************************/
void delay(uint a)
{
uchar b;
// uint c;
for( ;a>0;a--)
for(b=110;b>0;b--);
}
/*******************写命令*****************************************/
void wrcomm(uchar comm)
{
ce=0; //选中芯 片
rd=1; //读高电平无效
cd=1; //操作命令
wr=0; //写使能
P2=comm; //把命令送给总线
nop(); //延时
wr=1; //拉高写
}
/*******************写数据******************************************/
void wrdate(uchar date)
{
ce=0; //使能片选
rd=1; //读无效
cd=0; //操作命令
wr=0; //使能写
P2=date; //数据送给总线
nop(); //延时
wr=1; //拉高写
}
/*******************测读写命令忙***********************************/
void check_sta01()
{
uchar a; //定义变量
ce=0; //使能片选
wr=1; //禁写
cd=1; //命令有效
while(1) //循环
{
P2=0xff;
rd=0; //使能读
a=P2; //读总线状态
nop(); //延时
rd=1; //拉高读
if((a&0x03)==0x03)
return; //测试如果读写数据为不忙跳出循环
}
}
/*******************测试连续写忙************************************/
void check_sta03()
{
uchar a; //定义变量
ce=0; //全能片选
wr=1; //禁写
cd=1; //命令有效
while(1)
{
P2=0xff;
rd=0; //使能读
a=P2; //读总线状态
nop(); //延时
rd=1; //拉高读
if((a&0x08)==0x08)
return; //测试如果连续读为不忙跳出循环
}
}
/************************写无参数命令************************************/
void no_parameter(uchar comm)
{
check_sta01(); //测忙
wrcomm(comm); //写命令
}
/************************写双字节参数命令*********************************/
void double_parameter(uint a,uint b,uchar c)
{
check_sta01(); //测忙
wrdate(a); //写第一字节参数
check_sta01(); //测忙
wrdate(b); //写第二节节参数
check_sta01(); //测忙
wrcomm(c); //写命令
}
/************************清屏全亮或全灭***********************************/
void all_display(uchar state,uchar vlue)
{
uint i,k; //定义变量
if(state==0) //判断state是否为0
{
double_parameter(text_startaddr_l,text_startaddr_h,0x24); //文本区低位和高位起始地址
no_parameter(0xb0); //连续写命令
for(i=1;i<9;i++)
{
for(k=0;k<30;k++)
{
check_sta03(); //测忙
wrdate(vlue);
} //写入vlue值,0或1
}
check_sta03(); //测忙
wrcomm(0xb2); //关连续写
}
if(state==1) //判断state是否为1
{
double_parameter(graphic_startaddr_l,graphic_startaddr_h,0x24); //图开形区起始低,高位
no_parameter(0xb0); //连续写命令
for(i=30*64;i>0;i--) //循环
{
check_sta03(); //测连续写忙
wrdate(vlue); //写入vlue值
}
check_sta03(); //测忙
wrcomm(0xb2); // 关闭连续写
}
}
/****************************文本方式下写8*8字符******************************************/
void text_ascii(uchar *addr,uchar hang,uchar lie)
{
uchar temp; //定义变量
uchar low; //定义变量
uchar high; //定义变量
temp=30*(hang-1)+(lie-1); //每行30字符乘行加列,计算写入起始位置
low=temp&0x00ff; //把结果低位赋给低变量
high=(temp>>8)&0x00ff; //把结果高位给高变量
double_parameter(low,high,0x24); //写入文本起始位置
no_parameter(0xb0); //连续写命令
check_sta03(); //测忙
wrdate(*addr); //写入字符地址指针
check_sta03(); //测连续写忙
wrcomm(0xb2); //关闭连续写
}
/**************************graphic下显示图片*********************************************/
void display(uchar *p,uchar hang,uchar lie)
{
uchar m,n; //定义变量
uint temp; //定义变量
temp=(hang-1)*30+lie; //计算图形写入地址
graphic_startaddr_l=temp&0x00ff; //取出低位数据
graphic_startaddr_h=(temp>>8)&0x00ff;
double_parameter(graphic_startaddr_l,graphic_startaddr_h,0x24);//写入图形首地址
no_parameter(0xb0); //连续写命令
for(m=240;m>0;m--) //循环行数
{
for(n=30;n<0;n--) //每字节8位,列数/8
{
check_sta03(); //测忙
wrdate(* p++); //写入图形指针,然后加1地址
}
}
check_sta03(); //测忙
wrcomm(0xb2); //关闭连续写
}
/************************text下显示16*16汉字**********************************************
***************text模式下是8*8字符,每个汉字要4个字符组成*********************************/
void hz_display(uchar addr,uchar hang,uchar lie)
{
uint temp; //定义变量
uchar low,high; //定义变量
temp=30*2*(hang-1)+(lie-1)*2; //把字的坐标地址赋给变量
low=temp&0x00ff; //取出坐标低位数值
high=(temp>>8)&0x00ff; //右移8位取出坐标高位数值
double_parameter(low,high,0x24); //写入汉字坐标
no_parameter(0xb0); //开连续写
check_sta03(); //测忙
wrdate(addr); //写入汉字左上4分之1
check_sta03(); //测试忙
wrdate(addr+2); //写入汉字右上4分之1
check_sta03(); //测忙
wrcomm(0xb2); //关闭连续写
delay(1);
temp=30*2*(hang-1)+30+(lie-1)*2; //重新计算汉字坐标也就是写下部份,地址加一行(8*8)
low=temp&0x00ff; //取出低位数值给变量
high=(temp>>8)&0x00ff; //右移8位取出高位给变量
double_parameter(low,high,0x24); //写入新起始地址(写汉字下部份)
no_parameter(0xb0); //连续写命令
check_sta03(); //测忙
wrdate(addr+1); //写入汉字左下4分之1
check_sta03(); //测忙
wrdate(addr+3); //写入汉字右下4分之1
check_sta03(); //测忙
wrcomm(0xb2); //关闭连续写
}
/******************************自定义汉字写入CGRAM***************************************/
void cgram()
{
uint m=0; //定义变量
double_parameter(0x07,0x00,0x22); //设定最高的1K为CGRAM 寄存器偏移设定
double_parameter(0x00,0x3c,0x24); //
no_parameter(0xb0); //开连续写
for(m=0;m<480+32;m++) //循环
{
check_sta03(); //测忙
wrdate(cgtab[m]); //写入数据
}
check_sta03(); //测忙
wrcomm(0xb2); //关闭连续写
}
/***************************主程序*******************************************************/
void main()
{
uchar i; //定义变量
rst=0; //拉低液晶屏复位脚
nop(); //
nop();
nop(); //延时
rst=1;
text_size=graphic_size=30*64; //文本和图形区宽度
text_startaddr=0x0000; //文本区首地址
text_startaddr_l=text_startaddr; //文本首地址低位
text_startaddr_h=text_startaddr>>8; //文本首地址高位
graphic_startaddr=text_startaddr+text_size; //图形区首地址
graphic_startaddr_l=graphic_startaddr; //图形区首地址低位
graphic_startaddr_h=graphic_startaddr>>8; //图形区首地址高位
double_parameter(text_startaddr_l,text_startaddr_h,0x40); //写入文本首地址
double_parameter(30,0x00,0x41); //写入文本区长度(一行几个字节)
double_parameter(graphic_startaddr_l,graphic_startaddr_h,0x42); //写入图形区首地址
double_parameter(30,0x00,0x43); //写入图形区长度(一行几个字节)
no_parameter(0x80); //文本 或 图形
no_parameter(0x98); //图形开文本关
all_display(1,0xff); //表屏全亮
delay(5000);
no_parameter(0xa7); //显示8行光标
no_parameter(0x94); //文本开图形关
cgram();
// while(1)
all_display(0,0x00);
{
for(i=1;i<16;i++)
{
hz_display(0x80+(i-1)*4,1,i);
hz_display(0x80+(i-1)*4,2,i);
hz_display(0x80+(i-1)*4,3,i);
hz_display(0x80+(i-1)*4,4,i);
}
while(1);
}
}
作者:
祝云章
时间:
2019-1-28 15:05
谢谢分享!
作者:
sulon
时间:
2019-3-8 16:17
你好
想请问液晶屏的第4脚V0怎么接的?接负电压了吗?
作者:
lyMarvin
时间:
2020-7-7 16:37
谢谢分享
有机会学习学习
作者:
QQQQ987
时间:
2023-5-7 21:12
sulon 发表于 2019-3-8 16:17
你好
想请问液晶屏的第4脚V0怎么接的?接负电压了吗?
用不上,就空脚
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1