倒班了,能有點在家時間了沒事鼓弄著玩!上傳到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);
}
}
|