① 做LCD液晶屏幕跟單片機有沒有關系
單片機直接驅動lcd液晶屏,可以,已經做過量產的產品。但有要求:
1、com口需接分壓電阻。
2、單片機io口要可以設置高阻狀態。
3、液晶最好是二分之一偏置的液晶。
至於連接使用方法,可以網路尋找。
② 單片機用串口液晶顯示屏(漢顯)
一、OCM12864液晶顯示模塊概述
1. OCM12864液晶顯示模塊是128×64點陣型液晶顯示模塊,可顯示各種字元及圖形,可與CPU直接介面,具有8位標准數據匯流排、6條控制線及電源線。採用KS0107控制IC。
2. 外觀尺寸:113×65×11mm(ocm12864-1), 93×70×10mm(ocm12864-2)
78×70×10mm(ocm12864-3),
3. 視域尺寸:73.4×38.8mm(ocm12864-1) 70.7×38mm(ocm12864-2),
64×44mm(ocm12864-3)
4. 重量:大約 g
l 補充說明:外觀尺寸可根據用戶的要求進行適度調整。
二、最大工作范圍
1、邏輯工作電壓(Vcc):4.5~5.5V
2、電源地(GND):0V
3、LCD驅動電壓(Vee):0~-10V
4、輸入電壓:Vee~Vdd
5、工作溫度(Ta):0~55℃(常溫) / -20~70℃(寬溫)
6、保存溫度(Tstg):-10~65℃
三、電氣特性(測試條件 Ta=25,Vdd=5.0+/-0.25V)
1、輸入高電平(Vih):3.5Vmin
2、輸入低電平(Vil):0.55Vmax
3、輸出高電平(Voh):3.75Vmin
4、輸出低電平(Vol):1.0Vmax
5、工作電流:2.0mAmax
四、介面說明
1. 12864-1,12864-2介面說明表
管腳號 管腳 電平 說明
1 VSS 0V 邏輯電源地。
2 VDD 5.0V 邏輯電源正。
3 V0 LCD驅動電壓,應用時在VEE與V0之間加一2K可調電阻。
4 D/I H/L 數據\指令選擇:高電平:數據D0-D7將送入顯示RAM;
低電平:數據D0-D7將送入指令寄存器執行。
5 R/W H/L 讀\寫選擇: 高電平:讀數據;低電平:寫數據。
6 E H.H/L 讀寫使能,高電平有效,下降沿鎖定數據。
7 DB0 H/L 數據輸入輸出引腳。
8 DB1 H/L 數據輸入輸出引腳。
9 DB2 H/L 數據輸入輸出引腳。
10 DB3 H/L 數據輸入輸出引腳。
11 DB4 H/L 數據輸入輸出引腳。
12 DB5 H/L 數據輸入輸出引腳。
13 DB6 H/L 數據輸入輸出引腳。
14 DB7 H/L 數據輸入輸出引腳。
15 CS1 H/L 片選擇信號,低電平時選擇前64列。
16 CS2 H 片選擇信號,低電平時選擇後64列。
17 RET L 復位信號,低電平有效。
18 VEE -10V LCD驅動電源。
19 BL AC 背光電源,LED+。
20 BL AC 背光電源,LED-。
2. 12864-3A介面說明表
管腳號 管腳 電平 說明
1 CSA H/L 片選擇信號,低電平時選擇前64列。
2 CSB H 片選擇信號,低電平時選擇後64列。
3 GND 0V 邏輯電源地。
4 VCC 5V 邏輯電源。
5 VEE -10V LCD驅動電源。
6 D/I H/L 數據\指令選擇,高電平:數據D0-D7將送入顯示RAM;
低電平:數據D0-D7將送入指令寄存器執行。
7 R/W H/L 讀\寫選擇,高電平:讀數據;低電平:寫數據。
8 E H.H/L 讀寫使能,高電平有效,下降沿鎖定數據。
9 DB0 H/L 數據輸入輸出引腳。
10 DB1 H/L 數據輸入輸出引腳。
11 DB2 H/L 數據輸入輸出引腳。
12 DB3 H/L 數據輸入輸出引腳。
13 DB4 H/L 數據輸入輸出引腳。
14 DB5 H/L 數據輸入輸出引腳。
15 DB6 H/L 數據輸入輸出引腳。
16 DB7 H/L 數據輸入輸出引腳。
3. 12864-3B介面說明表
管腳號 管腳 電平 說明
1 CSA H/L 片選擇信號,低電平時選擇前64列。
2 CSB H 片選擇信號,低電平時選擇後64列。
3 GND 0V 邏輯電源地。
4 VCC 5V 邏輯電源。
5 V0 -10V LCD驅動電源。
6 D/I H/L 數據\指令選擇,高電平:數據D0-D7將送入顯示RAM;
低電平:數據D0-D7將送入指令寄存器執行。
7 R/W H/L 讀\寫選擇,高電平:讀數據;低電平:寫數據。
8 E H.H/L 讀寫使能,高電平有效,下降沿鎖定數據。
9 DB0 H/L 數據輸入輸出引腳。
10 DB1 H/L 數據輸入輸出引腳。
11 DB2 H/L 數據輸入輸出引腳。
12 DB3 H/L 數據輸入輸出引腳。
13 DB4 H/L 數據輸入輸出引腳。
14 DB5 H/L 數據輸入輸出引腳。
15 DB6 H/L 數據輸入輸出引腳。
16 DB7 H/L 數據輸入輸出引腳。
17 RET L 復位信號,低電平有效。
18 VEE -10V LCD驅動電源。
19 BL AC 背光電源,LED+。
20 BL AC 背光電源,LED-。
五、指令描述
1、顯示開/關設置
CODE: R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
L L L L H H H H H H/L
功能:設置屏幕顯示開/關。
DB0=H,開顯示;DB0=L,關顯示。不影響顯示RAM(DD RAM)中的內容。
2、設置顯示起始行
CODE: R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
L L H H 行地址(0~63)
功能:執行該命令後,所設置的行將顯示在屏幕的第一行。顯示起始行是由Z地址計數器控制的,該命令自動將A0-A5位地址送入Z地址計數器,起始地址可以是0-63范圍內任意一行。Z地址計數器具有循環計數功能,用於顯示行掃描同步,當掃描完一行後自動加一。
3、設置頁地址
CODE: R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
L L H L H H H 頁地址(0~7)
功能:執行本指令後,下面的讀寫操作將在指定頁內,直到重新設置。頁地址就是DD RAM 的行地址,頁地址存儲在X地址計數器中,A2-A0可表示8頁,讀寫數據對頁地址沒有影響,除本指令可改變頁地址外,復位信號(RST)可把頁地址計數器內容清零。
DD RAM地址映像表
Y 地址
0 1 2 ……………………… 61 62 63
DB0
∫ PAGE0
DB7 X=0
DB0
∫ PAGE1
DB7 X=1
∷
∷
∷
∷
DB0
∫ PAGE6
DB7 X=7
DB0
∫ PAGE7
DB7 X=8
4、設置列地址
CODE: R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
L L L H 列地址(0~63)
功能: DD RAM 的列地址存儲在Y地址計數器中,讀寫數據對列地址有影響,在對DD RAM進行讀寫操作後,Y地址自動加一。
5、狀態檢測
CODE: R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
H L BF L ON/OFF RST L L L L
功能:讀忙信號標志位(BF)、復位標志位(RST)以及顯示狀態位(ON/OFF)。
BF=H:內部正在執行操作; BF=L:空閑狀態。
RST=H:正處於復位初始化狀態; RST=L:正常狀態。
ON/OFF=H:表示顯示關閉; ON/OFF=L:表示顯示開。
6、寫顯示數據
CODE: R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
L H D7 D6 D5 D4 D3 D2 D1 D0
功能:寫數據到DD RAM,DD RAM是存儲圖形顯示數據的,寫指令執行後Y地址計數器自動加1。D7-D0位數據為1表示顯示,數據為0表示不顯示。寫數據到DD RAM前,要先執行「設置頁地址」及「設置列地址」命令。
7、讀顯示數據
CODE: RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
H H D7 D6 D5 D4 D3 D2 D1 D0
功能:從DD RAM讀數據,讀指令執行後Y地址計數器自動加1。從DD RAM讀數據前要先執行「設置頁地址」 及「設置列地址」命令。
六、介面時序
1.寫操作時序
時序1
4. 讀操作時序
************************************************************
串列連接操作程序
新勢力單片機網站:[url]www.xinshili.net[/url]
對外函數列表:
void LCD_Init( void ); //初始化
void LCD_PutStr(unsigned char row,unsigned char col,unsigned char *puts); //寫入文本
void LCD_PutBMP(unsigned char *puts); //寫入圖片
void LCD_ClearTXT( void ); //清除文本
void LCD_ClearBMP( void ); //清除圖片
***********************************************************/
#define LCDNOP() NOP();NOP()
//以下配置IO管腳
//=========================================================
#define LCDSIDPORT PORTE //SID PORT
#define LCDSIDDDR DDRE //SID DDR
#define LCDSIDPIN PINE //SID PINE
#define LCDSIDIO 2 //SID IO
#define LCDSCLKPORT PORTE
#define LCDSCLKDDR DDRE
#define LCDSCLKPIN PINE
#define LCDSCLKIO 3
#define LCDRSTPORT PORTE
#define LCDRSTDDR DDRE
#define LCDRSTPIN PINE
#define LCDRSTIO 4
//========================================================
#define OUTLCDSCLK() LCDSCLKDDR |= 1 << LCDSCLKIO //設置輸出
#define SETLCDSCLK() LCDSCLKPORT |= 1 << LCDSCLKIO //拉高
#define CLRLCDSCLK() LCDSCLKPORT &= ~(1 << LCDSCLKIO) //拉低
#define OUTLCDSID() LCDSIDDDR |= 1 << LCDSIDIO //設置輸出
#define INLCDSID() LCDSIDDDR &= ~(1 << LCDSIDIO); LCDSIDPORT |= 1 << LCDSIDIO //設置輸入
#define SETLCDSID() LCDSIDPORT |= 1 << LCDSIDIO //拉高
#define CLRLCDSID() LCDSIDPORT &= ~(1 << LCDSIDIO) //拉低
#define GETLCDSID() ((LCDSIDPIN & (1 << LCDSIDIO)) >> LCDSIDIO) //讀IO值
const unsigned char AC_TABLE[]={
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, //第一行漢字位置
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, //第二行漢字位置
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f, //第三行漢字位置
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f, //第四行漢字位置
};
//串口發送一個位元組
void LCD_WriteByte(unsigned char Dbyte)
{
unsigned char i;
OUTLCDSCLK();
OUTLCDSID();
for(i=0;i<8;i++)
{
CLRLCDSCLK();
Dbyte=Dbyte<<1; //左移一位
if (SREG & 1)
SETLCDSID();
else
CLRLCDSID();
SETLCDSCLK();
LCDNOP();
CLRLCDSCLK();
}
return;
}
//串口接收一個位元組
//僅在讀取數據的時候用到
//而讀出的數據是一次只能讀出4bit的
unsigned char LCD_ReadByte(void)
{
unsigned char i,temp1,temp2;
temp1=temp2=0;
OUTLCDSCLK();
INLCDSID();
for(i=0;i<8;i++)
{
temp1=temp1<<1;
CLRLCDSCLK();
LCDNOP();
SETLCDSCLK();
LCDNOP();
CLRLCDSCLK();
if(GETLCDSID()) temp1++;
}
for(i=0;i<8;i++)
{
temp2=temp2<<1;
CLRLCDSCLK();
LCDNOP();
SETLCDSCLK();
LCDNOP();
CLRLCDSCLK();
if(GETLCDSID()) temp2++;
}
return ((0xf0&temp1)+(0x0f&temp2));
}
void LCD_CheckBusy( void )
{
LCDNOP();
return;
do LCD_WriteByte(0xfc); //11111,RW(1),RS(0),0
while(0x80&LCD_ReadByte()); //BF(.7)=1 Busy
}
void LCD_WriteCmd( unsigned char Cbyte )
{
//LCD_CS = 1;
LCD_CheckBusy();
LCD_WriteByte(0xf8); //11111,RW(0),RS(0),0
LCD_WriteByte(0xf0&Cbyte); //高四位
LCD_WriteByte(0xf0&Cbyte<<4);//低四位(先執行<<)
//LCD_CS = 0;
}
void LCD_WriteData( unsigned char Dbyte )
{
//LCD_CS = 1;
LCD_CheckBusy();
LCD_WriteByte(0xfa); //11111,RW(0),RS(1),0
LCD_WriteByte(0xf0&Dbyte); //高四位
LCD_WriteByte(0xf0&Dbyte<<4);//低四位(先執行<<)
//LCD_CS = 0;
}
unsigned char LCD_ReadData( void )
{
LCD_CheckBusy();
LCD_WriteByte(0xfe); //11111,RW(1),RS(1),0
return LCD_ReadByte();
}
void LCD_Init( void )
{
LCD_WriteCmd(0x30); //8BitMCU,基本指令集合
LCD_WriteCmd(0x03); //AC歸0,不改變DDRAM內容
LCD_WriteCmd(0x0C); //顯示ON,游標OFF,游標位反白OFF
LCD_WriteCmd(0x01); //清屏,AC歸0
LCD_WriteCmd(0x06); //寫入時,游標右移動
}
//文本區清RAM函數
void LCD_ClearTXT( void )
{
unsigned char i;
LCD_WriteCmd(0x30); //8BitMCU,基本指令集合
LCD_WriteCmd(0x80); //AC歸起始位
for(i=0;i<64;i++)
LCD_WriteData(0x20);
}
//圖形區和文本區顯示在兩個不同的RAM區
//圖形區清RAM函數
void LCD_ClearBMP( void )
{
unsigned char i,j;
LCD_WriteCmd(0x34); //8Bit擴充指令集,即使是36H也要寫兩次
LCD_WriteCmd(0x36); //繪圖ON,基本指令集裡面36H不能開繪圖
for(i=0;i<32;i++) //12864實際為256x32
{
LCD_WriteCmd(0x80|i); //行位置
LCD_WriteCmd(0x80); //列位置
for(j=0;j<32;j++) //256/8=32 byte
LCD_WriteData(0);
}
}
void LCD_PutStr(unsigned char row,unsigned char col,unsigned char *puts)
{
LCD_WriteCmd(0x30); //8BitMCU,基本指令集合
LCD_WriteCmd(AC_TABLE[8*row+col]); //起始位置
while(*puts != '\0') //判斷字元串是否顯示完畢
{
if(col==8) //判斷換行
{ //若不判斷,則自動從第一行到第三行
col=0;
row++;
}
if(row==4) row=0; //一屏顯示完,回到屏左上角
LCD_WriteCmd(AC_TABLE[8*row+col]);
LCD_WriteData(*puts); //一個漢字要寫兩次
puts++;
if (*puts != '\0')
{
LCD_WriteData(*puts);
puts++;
}else{break;}
col++;
}
}
void LCD_PutBMP(unsigned char *puts)
{
unsigned int x=0;
unsigned char i,j;
LCD_WriteCmd(0x34); //8Bit擴充指令集,即使是36H也要寫兩次
LCD_WriteCmd(0x36); //繪圖ON,基本指令集裡面36H不能開繪圖
for(i=0;i<32;i++) //12864實際為256x32
{
LCD_WriteCmd(0x80|i); //行位置
LCD_WriteCmd(0x80); //列位置
for(j=0;j<32;j++) //256/8=32 byte
{ //列位置每行自動增加
LCD_WriteData(puts[x]);
x++;
}
}
}
本文轉自:新勢力單片機 [url]http://www.XinShiLi.net[/url]