痞酷網_PIGOO

 找回密碼
 立即註冊
!!! [系統偵測到廣告阻擋軟體] !!!

如果您覺得痞酷網對您有些許幫助,或者您認同痞酷網的理想,

那麼希望您將痞酷網設定為白名單.

並請在上論壇的時候,動動您的手指,用行動支持我們.

謝謝!
查看: 3672|回復: 0

LCM240128&24064(T6963C)驅動程式以及種種經驗

[複製鏈接]
發表於 2012-3-1 23:39:23 | 顯示全部樓層 |閱讀模式
本帖最後由 antlu 於 2012-3-2 09:55 PM 編輯

前一陣子回收場買了一片 LCM SDEC 240128 於是上網找資料,因為它的接腳定義和 LCM1602不一樣,為了測試他的功能是否可用,還真的煞費苦心!!網路上有一些人PO了C程式我發現幾個現象,a. 只是提供部分程式 b.程式內容有誤無法使用 c.I/O等並沒有定義,或是使用 地址定位方式,並不適合 8951的方式,為了和 C的初學者分享我的經驗,我就野人獻曝一下,也給自己留個紀錄好查詢... 高手前輩就不要太計較了(但是歡迎指正和教導),目前還在探索中,最終目標 時鐘溫度計...

/*======================================================
        功  能:MSP-G24064(T6963C)液晶驱动
        创  建:Hzxin
        时  间:2011.7.20
---------------------------------------------------------
  本程序参考仿真社区(http://proteus.5d6d.com)一个网友
       写的LCD240*128显示程序修改,在此表示感谢!
=======================================================*/
#include<reg52.h>
#include<stdio.h>
#include <intrins.h>

#define uchar unsigned char
#define unint unsigned int
#define unchar unsigned char
#define uint unsigned int

#define LCD_Data P0

// LCD240*64 I/O 信号管脚
//RESET接5V
sbit CD  = P2^4; // 指令\数据 选择  高选择指令,低选择数据
sbit CE  = P2^5; // 片选信号,低电平有效,可直接接地
sbit RD0  = P2^3; // 读选择 ,低电平有效
sbit WR0  = P2^6; // 写信号,低有效
sbit FS  = P2^7; // 字体选择:L:8*8  H:6*8(目前未使用)

void DelayUs2x(unsigned char t)
   {   
     while(t--);
   }
void DelayMs(unsigned char t)
{
      while(t--);
   {
     DelayUs2x(245);//from245>>45
         DelayUs2x(245);
   }
}

//读取LCD状态字
uchar readstate(void)
{
        uchar lcd_state;
        LCD_Data=0xff; // 读取总线端口物理电平
        CD=1;
         _nop_();
         CE=0;
        RD0=0;
         _nop_();
        lcd_state=LCD_Data;
        _nop_();
        _nop_();
        RD0=1;
    CE=1;
        CD=0;
        return lcd_state;
}

//判断指令(数据)读写忙否状态
void st01(void)
{
        while((readstate()&0x03)!=3)
    ;   
}

//判断数据自动读状态
/*void st2(void)
{
  while((readstate()&0x04)!=4)
    ;
}*/

//判断数据自动写状态
void st3(void)
{
        while((readstate()&0x08)!=8)
    ;
}


/******************写一个命令***********/
void WriteCmd(unchar cmd)
{
        st01();                         //状态判断
        CD=1;
        LCD_Data=cmd;
        CE=0;
        WR0=0;
        _nop_();
        _nop_();
        WR0=1;
        CE=1;
        CD=0;
}
/****************写一个数据*************/
void WriteDate(unchar date)
{
        st01();                         //状态判断
        CD=0;
        _nop_();
        LCD_Data=date;
        CE=0;
        WR0=0;
        _nop_();
        _nop_();
        WR0=1;
        CE=1;
        CD=1;
}
//数据自动写入函数
void writeauto(uchar onedata)
{
        st3();    //状态判断
        CD=0;      //C/D=0,数据通道
        _nop_();
        LCD_Data=onedata;
        CE=0;
        WR0=0;
        _nop_();
        _nop_();
        WR0=1;
        CE=1;
        CD=1;
}

/**************写单参数******************/
void WriteTcp(unchar onep1,unchar comd1)
{
        WriteDate(onep1);
        WriteCmd(comd1);

}

/**************写双参数******************/
void WriteTcp2(unchar date1,unchar date2,unchar comd2)
{
        WriteDate(date1);
        WriteDate(date2);
        WriteCmd(comd2);
}
/***********************************************************
液晶初始化,清屏
***********************************************************/
void LcdInit(void)
{
        WriteTcp2(0,0,0x40);
        WriteTcp2(40,0,0x41);
        WriteTcp2(0,0,0x42);
        WriteTcp2(40,0,0x43);
        WriteCmd(0x80);
        WriteCmd(0x9c);
}

//清除屏幕(清所有8K存储空间)
void LcdClear(void)
{
        uint cl_count;
        WriteTcp2(0x00,0x00,0x24);  //设置显示存储器首地址
        WriteCmd(0xb0);  //设置自动写状态
        for(cl_count=8192;cl_count>0;cl_count--) writeauto(0x00);
        WriteCmd(0xb2);  //关闭自动写状态  
}

/************************画一幅图片***************/
void ShowPicture(unchar x,unchar y,unchar length,unchar width,unchar *picture)
{
    unint i,j,address;
        address=x*40+y;//计算初始地址
        WriteTcp2(address&0xff,address/256,0x24);//写入地址
    for(j=0;j<width;j++)
          {         
           WriteTcp2(address&0xff,address/256,0x24);
                 for(i=0;i<length;i++)
                   {
                          WriteCmd(0xb0);//啟動自動寫
               WriteDate(picture[(length)*j+i]-32);//if cancel *j will show same word
                         WriteCmd(0xb2);//關閉自動寫
                    }
                address=address+40;
          }
       
}


void main (void)
{



  WriteCmd(0x80);
   WriteTcp2(0,0,0x42);
WriteTcp2(40,0,0x43);
WriteTcp2(0,0,0x40);
WriteTcp2(40,0,0x41);
WriteTcp2(0,0,0x24);
  WriteTcp2(0,0,0x21);
WriteTcp2(0,0,0x22);
   WriteTcp(55,0xe0);
  WriteTcp(0xaa,0xe0);

WriteTcp2(0,00,0x24);
WriteTcp(0x34,0xc0);
WriteTcp(0x3f,0xc0);
  WriteCmd(0xa7);
  DelayMs(5);
WriteCmd(0x94);//check text mode only 前面不會有亂碼
LcdClear();
while(1)
{

WriteCmd(80);
ShowPicture(3,10,20,4,"0123456789 abcdefghijklmnopqrstuvwxyz ...");
WriteTcp2(0,0,0x24);
WriteTcp(0x00,0xc0);
WriteTcp(0x29,0xc0);
WriteTcp(0x00,0xc0);
WriteTcp(0x2c,0xc0);
WriteTcp(0x2f,0xc0);
WriteTcp(0x36,0xc0);
WriteTcp(0x25,0xc0);
WriteTcp(0x00,0xc0);
WriteTcp(0x39,0xc0);
WriteTcp(0x2f,0xc0);
WriteTcp(0x35,0xc0);
}
}

**** LCM一定要外加10K可變電阻來調整對比,否則第一關就不會顯示,或者是全白無法反應字體出來!!!

原來的背光故障用LED取代
LCM01 [800x600].JPG

LCM02 [800x600].JPG

LCM03 [800x600].JPG

LCM04 [800x600].JPG

LCM05 [800x600].JPG

LCM06 [800x600].JPG

LCM10 [800x600].JPG

   初期顯示結果 因為參數設定錯誤
LCM07 [800x600].JPG

LCM08 [800x600].JPG

LCM09 [800x600].JPG

調整之後
LCM11 [800x600].JPG

LCM12 [800x600].JPG

今天去回收場已經找不到了,紙找到 1602
但是同樣1602 POWERTIP 和 SDEC 接腳卻不同
LCM最重要是接腳錯誤就完蛋了
這兩家的接頭標示和排線牛角接點相反,1>2 2>1 13>14 14>13
兩家的 VCC & GND 也剛好相反...
LCM13 [800x600].JPG

LCM14 [800x600].JPG

LCM15 [800x600].JPG

LCM16 [800x600].JPG

LCM17 [800x600].JPG

LCM18 [800x600].JPG

LCM19 [800x600].JPG

LCM20 [800x600].JPG




評分

5

查看全部評分

您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

關閉

站長小叮嚀上一條 /1 下一條

禁閉室|手機版|連繫我們|痞酷網電子技術論壇

GMT+8, 2024-5-14 01:46 AM , Processed in 0.159250 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.