找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7976|回复: 4
打印 上一主题 下一主题
收起左侧

LCD240*64 T6963C单片机驱动程序+电路图+实物制作

[复制链接]
跳转到指定楼层
楼主
ID:99624 发表于 2015-12-23 01:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
倒班了,能有点在家时间了没事鼓弄着玩!上传到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);
   }           
}        



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:288930 发表于 2019-1-28 15:05 | 只看该作者
谢谢分享!
回复

使用道具 举报

板凳
ID:459530 发表于 2019-3-8 16:17 | 只看该作者
你好
   想请问液晶屏的第4脚V0怎么接的?接负电压了吗?
回复

使用道具 举报

无效楼层,该帖已经被删除
5#
ID:58110 发表于 2020-7-7 16:37 | 只看该作者
谢谢分享
有机会学习学习
回复

使用道具 举报

6#
ID:1042173 发表于 2023-5-7 21:12 | 只看该作者
sulon 发表于 2019-3-8 16:17
你好
   想请问液晶屏的第4脚V0怎么接的?接负电压了吗?

用不上,就空脚
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表