|
本帖最後由 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取代
初期顯示結果 因為參數設定錯誤
調整之後
今天去回收場已經找不到了,紙找到 1602
但是同樣1602 POWERTIP 和 SDEC 接腳卻不同
LCM最重要是接腳錯誤就完蛋了
這兩家的接頭標示和排線牛角接點相反,1>2 2>1 13>14 14>13
兩家的 VCC & GND 也剛好相反...
|
評分
-
5
查看全部評分
-
|