找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2059|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

請(qǐng)教單片機(jī)+24064液晶屏驅(qū)動(dòng)程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:33455 發(fā)表于 2020-10-19 16:28 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
24064液晶屏,控制芯片是T6963C,用以下程序驅(qū)動(dòng),超過(guò)16個(gè)漢字就不顯示了是什么原因,還有就是怎么顯示數(shù)字,麻煩大神幫忙修改一下,萬(wàn)分感謝

#include <C8051F020.h>     // Register definition file.
#include <stdio.h>
#include<intrins.h>
#define SYSCLK   22118400   //定義系統(tǒng)時(shí)鐘22.1184MHz
typedef unsigned int uint;
typedef unsigned char uchar;
typedef unsigned long ulong;

uint text_size,graphic_size;                        //定義文本區(qū)和圖形區(qū)寬度
uint text_startaddr,graphic_startaddr;              //文本和圖形土起始位
uint text_startaddr_l,text_startaddr_h;             //定義文本區(qū)起始高位低位置


uchar code zk[]={
//*"我"*/
         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,

//"開",
      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,

//"快",
      0x10,0x10,0x10,0x10,0x5B,0x54,0x50,0x90,
      0x10,0x1F,0x10,0x11,0x11,0x12,0x14,0x18,
      0x80,0x80,0x80,0x88,0xFC,0x88,0x88,0x88,
      0x88,0xFE,0x80,0x40,0x20,0x10,0x0E,0x04,

//"樂",
      0x00,0x00,0x1F,0x10,0x11,0x11,0x21,0x7F,
      0x01,0x01,0x09,0x09,0x11,0x21,0x45,0x02,
      0x20,0xF0,0x00,0x00,0x00,0x00,0x04,0xFE,
      0x00,0x00,0x20,0x10,0x08,0x0C,0x04,0x00,

//"每",
      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,

//"測(cè)",
      0x00,0x40,0x27,0x24,0x85,0x65,0x25,0x0D,
      0x15,0x25,0xE5,0x21,0x22,0x24,0x28,0x20,
      0x00,0x44,0xE4,0x54,0x54,0x54,0x54,0x54,
      0x54,0x54,0x54,0x04,0x84,0x44,0x54,0x08,

//"試",
      0x00,0x40,0x20,0x20,0x0F,0x00,0xE0,0x27,
      0x21,0x21,0x21,0x21,0x29,0x37,0x22,0x00,
      0x20,0x28,0x24,0x20,0xFE,0x20,0x20,0xE0,
      0x20,0x10,0x10,0x10,0xD2,0x12,0x0A,0x04,

//"液",
      0x00,0x40,0x37,0x10,0x81,0x61,0x22,0x0A,
      0x16,0x2B,0xE2,0x22,0x22,0x22,0x23,0x22,
      0x80,0x44,0xFE,0x20,0x20,0x3C,0x44,0x64,
      0x98,0x48,0x50,0x20,0x50,0x8E,0x04,0x00,

//"晶",
      0x0F,0x08,0x08,0x0F,0x08,0x08,0x0F,0x08,
      0x7E,0x42,0x42,0x7E,0x42,0x42,0x7E,0x42,
      0xE0,0x20,0x20,0xE0,0x20,0x20,0xE0,0x24,
      0xFE,0x84,0x84,0xFC,0x84,0x84,0xFC,0x84,

//"程",
      0x08,0x1D,0xF1,0x11,0x11,0xFF,0x11,0x38,
      0x37,0x54,0x50,0x91,0x10,0x10,0x17,0x10,
      0x04,0xFE,0x04,0x04,0x04,0x04,0xFC,0x00,
      0xFE,0x20,0x28,0xFC,0x20,0x24,0xFE,0x00,

//"序",
      0x01,0x00,0x3F,0x20,0x2F,0x20,0x21,0x20,
      0x2F,0x20,0x20,0x20,0x40,0x40,0x82,0x01,
      0x00,0x88,0xFC,0x00,0xF8,0x20,0x40,0x80,
      0xFC,0x88,0x90,0x80,0x80,0x80,0x80,0x00,

//"非",
      0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0x7C,
      0x04,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,
      0x40,0x40,0x44,0x7E,0x40,0x40,0x48,0x7C,
      0x40,0x40,0x40,0x44,0x7E,0x40,0x40,0x40,

//"常",
      0x01,0x11,0x09,0x7F,0x40,0x8F,0x08,0x0F,
      0x01,0x1F,0x11,0x11,0x11,0x11,0x01,0x01,
      0x00,0x10,0x20,0xFE,0x02,0xE4,0x20,0xE0,
      0x10,0xF8,0x10,0x10,0x10,0x50,0x20,0x00,

//"感",
      0x00,0x00,0x7F,0x40,0x7F,0x40,0x5F,0x51,
      0x51,0x5F,0x90,0x02,0x29,0x28,0x48,0x07,
      0x50,0x48,0xFC,0x40,0xC0,0x48,0x48,0x50,
      0x22,0x52,0x8E,0x00,0x90,0xAC,0x24,0xE0,

//"謝",
      0x02,0x44,0x2F,0x28,0x0F,0x08,0xEF,0x28,
      0x28,0x3F,0x21,0x2A,0x34,0x28,0x12,0x01,
      0x08,0x88,0xC8,0x88,0x88,0xFE,0x88,0x88,
      0xC8,0xA8,0xA8,0x88,0x88,0x88,0xA8,0x10
};                 


//外部晶振初始化/////////////////////////////
void SYSCLK_Init ()
{
    int i;                    // 延時(shí)計(jì)數(shù)器
    OSCXCN = 0x67;            // 開啟外部振蕩器22.1184MHz晶體
    for (i=0; i < 256; i++) ; // 等待振蕩器啟振
    while (!(OSCXCN & 0x80)); // 等待晶體振蕩器穩(wěn)定
    OSCICN = 0x88;            // 選擇外部振蕩器為系統(tǒng)時(shí)鐘源并允許丟失時(shí)鐘檢測(cè)器
}


//  交叉開關(guān)配置,管腳輸入輸出配置
void XBR_Init()
{
        XBR0 = 0x00;        //不配置特殊功能
        XBR1 = 0x00;        
        XBR2 = 0x40;        //使能交叉開關(guān),并且總體弱上拉
        P74OUT=0xff;
}        





/*********************延時(shí)函數(shù)************************************/
void delay(uint a)
{
        uchar b;
        for( ;a>0;a--)
         for(b=100;b>0;b--);
}

/*******************寫命令*****************************************/
void wrcomm(uchar comm)
{

        P4=P4|0x01 <<1;          //讀高電平無(wú)效
                delay(5);
                P4=P4|0x01 <<3;         //操作命令
                delay(5);
                P4=P4&~(0x01 <<0); //寫使能
                delay(5);
                P5=comm;         //把命令送給總線
        delay(5);                        //延時(shí)
        P4=P4|0x01 <<0;                        //拉高寫
}

/*******************寫數(shù)據(jù)******************************************/
void wrdate(uchar date)
{

                                //讀無(wú)效
        P4=P4|0x01 <<1;
                delay(5);
                P4=P4&~(0x01 <<3);//操作命令
                delay(5);
                P4=P4&~(0x01 <<0);//使能寫
                delay(5);
                P5=date;         //數(shù)據(jù)送給總線
        delay(5);        
        P4=P4|0x01 <<0;   //拉高寫
}

/*******************測(cè)讀寫命令忙***********************************/
void check_sta01()
{
    uchar a;    //定義變量

                           
        P4=P4|0x01 <<0;  //禁寫
                delay(5);
                P4=P4|0x01 <<3;         //命令有效
                delay(5);
                while(1)  
        {
            P5=0xff;
            delay(5);
                        P4=P4&~(0x01 <<1); //使能讀
                        delay(5);
                        a=P5;       //讀總線狀態(tài)
            delay(5);       //延時(shí)
            P4=P4|0x01 <<1;//拉高讀
                        delay(5);
                        if((a&0x03)==0x03)                  
                return;      //測(cè)試如果讀寫數(shù)據(jù)為不忙跳出循環(huán)
        }
}

/*******************測(cè)試連續(xù)寫忙************************************/
void check_sta03()
{
    uchar a;           //定義變量


        P4=P4|0x01 <<0;//禁寫
                delay(50);
                P4=P4|0x01 <<3;        //命令有效
                delay(5);
                while(1)
        {
                P5=0xff;
                delay(5);
                            P4=P4&~(0x01 <<1); //使能讀
                                delay(5);
                                a=P5;              //讀總線狀態(tài)
                delay(5);             //延時(shí)
                P4=P4|0x01 <<1; //拉高讀
                                delay(5);
                                if((a&0x08)==0x08)
                return;            //測(cè)試如果連續(xù)讀為不忙跳出循環(huán)
        }
}

/************************寫無(wú)參數(shù)命令************************************/
void no_parameter(uchar comm)
{
        check_sta01();              //測(cè)忙
        wrcomm(comm);            //寫命令
}

/************************寫雙字節(jié)參數(shù)命令*********************************/
void double_parameter(uint a,uint b,uchar c)
{
        check_sta01();              //測(cè)忙
        wrdate(a);               //寫第一字節(jié)參數(shù)
        check_sta01();              //測(cè)忙
        wrdate(b);               //寫第二節(jié)節(jié)參數(shù)
        check_sta01();              //測(cè)忙
        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);   //文本區(qū)低位和高位起始地址
                no_parameter(0xb0);                                         //連續(xù)寫命令
                for(i=1;i<9;i++)
                {
                    for(k=0;k<30;k++)
                        {
                           check_sta03();                                              //測(cè)忙
                           wrdate(vlue);
                        }                                              //寫入vlue值,0或1
                }
                check_sta03();                                                                                                 //測(cè)忙
                wrcomm(0xb2);                                                                                                 //關(guān)連續(xù)寫
        }
        if(state==1)                          //判斷state是否為1
        {
                no_parameter(0xb0);                                                                                           //連續(xù)寫命令
                for(i=30*64;i>0;i--)                                                                                           //循環(huán)
                {
                        check_sta03();                                                                                           //測(cè)連續(xù)寫忙
                        wrdate(vlue);                                                                                           //寫入vlue值
                }
                check_sta03();                                                                                                   //測(cè)忙
                wrcomm(0xb2);                                                                                                   // 關(guān)閉連續(xù)寫
        }
}

/****************************文本方式下寫8*8字符******************************************/
void text_ascii(uchar *addr,uchar hang,uchar lie)
{
        uchar temp;//定義變量
        uchar low;
        uchar high; //定義變量
        temp=30*(hang-1)+(lie-1); //每行30字符乘行加列,計(jì)算寫入起始位置
        low=temp&0x00ff; //把結(jié)果低位賦給低變量
        high=(temp>>8)&0x00ff; //把結(jié)果高位給高變量
        double_parameter(low,high,0x24);  //寫入文本起始位置
        no_parameter(0xb0);  //連續(xù)寫命令
        check_sta03();   //測(cè)忙
        wrdate(*addr);  //寫入字符地址指針
        check_sta03();  //測(cè)連續(xù)寫忙
        wrcomm(0xb2);  //關(guān)閉連續(xù)寫
}


/************************text下顯示16*16漢字**********************************************/
/***************text模式下是8*8字符,每個(gè)漢字要4個(gè)字符組成*********************************/
void hz_display(uchar addr,uchar hang,uchar lie)
{
        uint temp;   //定義變量
        uchar low,high;  //定義變量
        temp=30*2*(hang-1)+(lie-1)*2;  //把字的坐標(biāo)地址賦給變量
        low=temp&0x00ff;   //取出坐標(biāo)低位數(shù)值
        high=(temp>>8)&0x00ff; //右移8位取出坐標(biāo)高位數(shù)值
        double_parameter(low,high,0x24);   //寫入漢字坐標(biāo)
        no_parameter(0xb0);  //開連續(xù)寫
        check_sta03();  //測(cè)忙
        wrdate(addr);  //寫入漢字左上4分之1
        check_sta03(); //測(cè)試忙
        wrdate(addr+2); //寫入漢字右上4分之1
        check_sta03();  //測(cè)忙
        wrcomm(0xb2);   //關(guān)閉連續(xù)寫
        delay(1);               
        temp=30*2*(hang-1)+30+(lie-1)*2; //重新計(jì)算漢字坐標(biāo)也就是寫下部份,地址加一行(8*8)
        low=temp&0x00ff; //取出低位數(shù)值給變量
        high=(temp>>8)&0x00ff;   //右移8位取出高位給變量
        double_parameter(low,high,0x24);   //寫入新起始地址(寫漢字下部份)
        no_parameter(0xb0); //連續(xù)寫命令
        check_sta03();   //測(cè)忙
        wrdate(addr+1);  //寫入漢字左下4分之1
        check_sta03();    //測(cè)忙
        wrdate(addr+3);  //寫入漢字右下4分之1
        check_sta03();   //測(cè)忙
        wrcomm(0xb2);   //關(guān)閉連續(xù)寫
}


/******************************自定義漢字寫入CGRAM***************************************/
void cgram()
{
        uint m=0;                                                        //定義變量
        double_parameter(0x07,0x00,0x22);        //設(shè)定最高的1K為CGRAM  寄存器偏移設(shè)定
        double_parameter(0x00,0x3c,0x24);        //
        no_parameter(0xb0);   //開連續(xù)寫
        for(m=0;m<480+32;m++) //循環(huán)
        {
                check_sta03(); //測(cè)忙
                wrdate(zk[m]); //寫入數(shù)據(jù)           
        }
        check_sta03();  //測(cè)忙
        wrcomm(0xb2);  //關(guān)閉連續(xù)寫
}

/***************************主程序*******************************************************/
void main()
{
        uchar i;
           WDTCN = 0xde;
        WDTCN = 0xad;   //禁止看門狗定時(shí)器
        XBR_Init();
        SYSCLK_Init();


        P4=P4&~(0x01 <<4); //拉低液晶屏復(fù)位腳
            delay(10);    //延時(shí)                                                            
        P4=P4|0x01 <<4;
                delay(10);
                text_size=graphic_size=30*64;   //文本和圖形區(qū)寬度
        text_startaddr=0x0000;  //文本區(qū)首地址
        text_startaddr_l=text_startaddr;  //文本首地址低位
        text_startaddr_h=text_startaddr>>8;  //文本首地址高位

        double_parameter(text_startaddr_l,text_startaddr_h,0x40);  //寫入文本首地址
        double_parameter(30,0x00,0x41);                                                                //寫入文本區(qū)長(zhǎng)度(一行幾個(gè)字節(jié))
        double_parameter(30,0x00,0x43);                                                                                //寫入圖形區(qū)長(zhǎng)度(一行幾個(gè)字節(jié))


       // no_parameter(0xa7);                  //顯示8行光標(biāo)
        no_parameter(0x94);                  //文本開圖形關(guān)
                   cgram();         
              all_display(0,0x00);        //清平
                       
        
                hz_display(0x80+(0)*4,4,2);         //(第幾個(gè)字,行地址,列地址)
                hz_display(0x80+(1)*4,4,3);
                hz_display(0x80+(2)*4,4,4);
                hz_display(0x80+(3)*4,4,5);
                hz_display(0x80+(4)*4,4,6);
                hz_display(0x80+(5)*4,4,7);
                hz_display(0x80+(6)*4,4,8);
                hz_display(0x80+(7)*4,4,9);
                hz_display(0x80+(8)*4,4,10);
                hz_display(0x80+(9)*4,4,11);
                hz_display(0x80+(10)*4,4,12);
                hz_display(0x80+(11)*4,4,13);
                hz_display(0x80+(12)*4,4,14);  
                   hz_display(0x80+(13)*4,2,5);
                hz_display(0x80+(14)*4,2,6);
                hz_display(0x80+(15)*4,2,7);
        
                hz_display(0x80+(16)*4,2,7); //下面這四行就不顯示了
                hz_display(0x78+(17)*4,2,9);
                hz_display(0x76+(18)*4,2,10);
                hz_display(0x76+(19)*4,2,11);  

        while(1);

}

顯示效果如圖
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:748788 發(fā)表于 2020-10-20 08:13 | 只看該作者
如果是新買的,賣家應(yīng)該提供驅(qū)動(dòng)和例程;如果是二手的就不好說(shuō)了
回復(fù)

使用道具 舉報(bào)

板凳
ID:33455 發(fā)表于 2020-10-20 09:35 | 只看該作者
這個(gè)是拆機(jī)的屏想拿來(lái)學(xué)習(xí)呢
回復(fù)

使用道具 舉報(bào)

地板
ID:414556 發(fā)表于 2020-10-20 10:21 | 只看該作者
要想顯示多字就把字改小些,網(wǎng)上有編碼軟件。數(shù)字要跟漢字一樣建庫(kù)。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表