1、1602LCD:即表示一行顯示16個字符,共兩行。
如果D=0,則LCD上不顯示任何東西。
* 名稱 : write_com()
* 功能 : 寫串口指令
* 輸入 : cmdcode
* 輸出 : 無
**********************************************************************
*/
void write_com(unsigned char cmdcode)
{
CS = 1;
sendbyte(0xf8); //11111abc a如果高表示從LCD讀數據,低
表示往LCD寫數據。 b 高表示顯示數據,低表示控制指令 c 固定爲0
sendbyte(cmdcode & 0xf0); //取cmdcode的高四位
sendbyte((cmdcode << 4) & 0xf0); //取cmdcode的第四位
delay(2);
}
/********************************************************************
* 名稱 : write_data()
* 功能 : 寫串口指令
* 輸入 : cmdcode
* 輸出 : 無
**********************************************************************
*/
void write_data(unsigned char Dispdata)
{
CS = 1;
sendbyte(0xfa);
sendbyte(Dispdata & 0xf0);
sendbyte((Dispdata << 4) & 0xf0);
delay(2);
}
指 | 指 令 碼 | 功 能 | |||||||||
令 | RS | R/W | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | |
清除
顯示
|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 將DDRAM填滿"20H",並且設定DDRAM的地址計數器(AC)到"00H" |
地址
歸位
|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | X | 設定DDRAM的地址計數器(AC)到"00H",並且將遊標移到開頭原點位置;這個指令不改變DDRAM 的內容 |
顯示狀態開/關 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | D | C | B |
D=1: 整體顯示 ON
C=1: 遊標ON
B=1:遊標位置反白允許
|
進入點
設定
|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | I/D | S | 指定在數據的讀取與寫入時,設定遊標的移動方向及指定顯示的移位 |
遊標或顯示移位控制 | 0 | 0 | 0 | 0 | 0 | 1 | S/C | R/L | X | X | 設定遊標的移動與顯示的移位控制位;這個指令不改變DDRAM 的內容 |
功能
設定
|
0 | 0 | 0 | 0 | 1 | DL | X | RE | X | X |
DL=0/1:4/8位數據
RE=1: 擴充指令操作
RE=0: 基本指令操作
|
設定CGRAM
地址
|
0 | 0 | 0 | 1 | AC5 | AC4 | AC3 | AC2 | AC1 | AC0 | 設定CGRAM 地址 |
設定DDRAM
地址
|
0 | 0 | 1 | 0 | AC5 | AC4 | AC3 | AC2 | AC1 | AC0 |
設定DDRAM 地址(顯示位址)
第一行:80H-87H
第二行:90H-97H
|
讀取忙標誌和地址 | 0 | 1 | BF | AC6 | AC5 | AC4 | AC3 | AC2 | AC1 | AC0 | 讀取忙標誌(BF)可以確認內部動作是否完成,同時可以讀出地址計數器(AC)的值 |
寫數據到RAM | 1 | 0 | 數據 | 將數據D7——D0寫入到內部的RAM (DDRAM/CGRAM/IRAM/GRAM) | |||||||
讀出RAM的值 | 1 | 1 | 數據 |
從內部RAM讀取數據D7——D0
(DDRAM/CGRAM/IRAM/GRAM)
|
指 | 指 令 碼 | 功 能 | |||||||||
令 | RS | R/W | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | |
待命
模式
|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
進入待命模式,執行其他指令都棵終止
待命模式
|
捲動地址開關開啓 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | SR |
SR=1:允許輸入垂直捲動地址
SR=0:允許輸入IRAM和CGRAM地址
|
反白
選擇
|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | R1 | R0 | 選擇2行中的任一行作反白顯示,並可決定反白與否。初始值R1R0=00,第一次設定爲反白顯示,再次設定變回正常 |
睡眠
模式
|
0 | 0 | 0 | 0 | 0 | 0 | 1 | SL | X | X |
SL=0:進入睡眠模式
SL=1:脫離睡眠模式
|
擴充
功能
設定
|
0 | 0 | 0 | 0 | 1 | CL | X | RE | G | 0 |
CL=0/1:4/8位數據
RE=1: 擴充指令操作
RE=0: 基本指令操作
G=1/0:繪圖開關
|
設定繪圖RAM
地址
|
0 | 0 | 1 |
0
AC6
|
0
AC5
|
0
AC4
|
AC3
AC3
|
AC2
AC2
|
AC1
AC1
|
AC0
AC0
|
設定繪圖RAM
先設定垂直(列)地址AC6AC5…AC0
再設定水平(行)地址AC3AC2AC1AC0
將以上16位地址連續寫入即可
|
* 文件名 : 串行12864顯示.c
* 描述 : 該程序實現了12864以串行的方式進行通信。
* 創建人 : 東流,2009年4月10日
* 版本號 : 2.0
**********************************************************************
*/
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit CS=P2^5; //片選信號
sbit SID=P2^6; //數據信號
sbit SCLK=P2^7; //時鐘信號
sbit RST=P2^2; //復位信號
sbit CH = P2^4; //並行、串行選擇信號
/********************************************************************
* 名稱 : delay()
* 功能 : 延時,延時時間爲 100us * t。這是通過軟件延時,有一定誤差。
* 輸入 : t
* 輸出 : 無
**********************************************************************
*/
void delay(unsigned int t)
{
unsigned int i,j;
for(i=0; i<t; i++)
for(j=0; j<10; j++);
}
/********************************************************************
* 名稱 : sendbyte()
* 功能 : 按照液晶的串口通信協議,發送數據
* 輸入 : zdata
* 輸出 : 無
**********************************************************************
*/
void sendbyte(unsigned char zdata)
{
unsigned int i;
for(i=0; i<8; i++)
{
if((zdata << i) & 0x80)
{
SID = 1;
}
else
{
SID = 0;
}
SCLK = 0;
SCLK = 1;
}
}
/********************************************************************
* 名稱 : write_com()
* 功能 : 寫串口指令
* 輸入 : cmdcode
* 輸出 : 無
**********************************************************************
*/
void write_com(unsigned char cmdcode)
{
CS = 1;
sendbyte(0xf8); //11111abc a如果高表示從LCD讀數據,低表示往LCD寫數據。 b 高表示顯示數據,低表示控制指令 c 固定爲0
sendbyte(cmdcode & 0xf0); //取cmdcode的高四位
sendbyte((cmdcode << 4) & 0xf0); //取cmdcode的第四位
delay(2);
}
/********************************************************************
* 名稱 : write_data()
* 功能 : 寫串口指令
* 輸入 : cmdcode
* 輸出 : 無
**********************************************************************
*/
void write_data(unsigned char Dispdata)
{
CS = 1;
sendbyte(0xfa);
sendbyte(Dispdata & 0xf0);
sendbyte((Dispdata << 4) & 0xf0);
delay(2);
}
/********************************************************************
* 名稱 : lcdinit()
* 功能 : 初始化函數
* 輸入 : cmdcode
* 輸出 : 無
**********************************************************************
*/
void lcdinit()
{
RST = 0;
delay(100);
RST = 1;
delay(20000);
write_com(0x30); //功能設定,001(DL)X(0或RE)XXDL必須爲1RE=1:擴展指令集動作,RE=0:基本指令集動作
delay(50);
write_com(0x0c); //捲動地址或IRAM地址選擇:0000001SR。SR=1,允許輸入垂直捲動地址,SR=0:允許輸入IRAM地址
delay(50);
}
/********************************************************************
* 名稱 : hzkdis()
* 功能 : 顯示字符串
* 輸入 : *s
* 輸出 : 無
**********************************************************************
*/
void hzkdis(unsigned char code *s)
{
while(*s > 0)
{
write_data(*s);
s++;
delay(50);
}
}
/********************************************************************
* 名稱 : Test()
* 功能 : 顯示子函數
* 輸入 : 無
* 輸出 : 無
**********************************************************************
*/
void Test()
{
write_com(0x03);
delay(50);
write_com(0x81); //寫地址
hzkdis(" HOT-51");
write_com(0x91);
hzkdis("單片機開發板");
write_com(0x89);
hzkdis(" ");
write_com(0x98);
hzkdis(" 東流電子");
}
/********************************************************************
* 名稱 : Main()
* 功能 : 主函數
* 輸入 : 無
* 輸出 : 無
**********************************************************************
*/
void Main()
{
CH = 0; //選擇是串口
delay(1);
lcdinit();
delay(10);
while(1)
{
Test();
delay(5000);
}
}
* 文件名 : 定時器的使用.c
* 描述 :
* 創建人 : 東流,2009年4月8日
* 版本號 : 2.0
**********************************************************************
*/
#include <reg52.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
uchar code IC_DAT[];
uchar code pic1[];
uchar code pic2[];
uchar code pic3[];
sbit RS = P2^5; //並行的指令/數據選擇信號
sbit WRD = P2^6; //讀寫選擇信號
sbit E = P2^7; //使能信號
sbit PSB = P2^2; //並/串行接口選擇 高爲並,低爲串
sbit RES = P2^4; //復位,低電平有效
void TransferData(char data1,bit DI);
void display(void);
void display_grapic(void);
void delayms(uint n);
void DisplayLine(uchar line1,uchar line2);
void DisplayGraphic(uchar code *adder);
void delay(uint m);
void lcd_mesg(uchar code *adder1);
uchar code IC_DAT[]={
" HOT-51 "
" "
" 單片機開發板 "
" 東流電子 "
};
uchar code IC_DAT2[]={
" 白日依山盡, " //0x80
" 欲窮千里目, " //0x90
" 黃河入海流。 " //0x88
//" 更上一層樓。 " //0x98
"一二三四五六七八九十"
};
/********************************************************************
* 名稱 : Convert(uchar In_Date)
* 功能 : 因爲電路設計時,P0.0--P0.7接法剛好了資料中的相反,所以設計該
函數。
* 輸入 : 1602資料上的值
* 輸出 : 送到1602的值
**********************************************************************
*/
unsigned char Convert(unsigned char In_Date)
{
unsigned char i, Out_Date = 0, temp = 0;
for(i=0; i<8; i++)
{
temp = (In_Date >> i) & 0x01;
Out_Date |= (temp << (7 - i));
}
return Out_Date;
}
void initinal(void) //LCD字庫初始化程序
{
delay(40); //大於40MS的延時程序
PSB=1; //設置爲8BIT並口工作模式
delay(1); //延時
RES=0; //復位
delay(1); //延時
RES=1; //復位置高
delay(10);
TransferData(0x30,0); //Extended Function Set :8BIT設
置,RE=0: basic instruction set, G=0 :graphic display OFF
////功能設定,001(DL)X(0或RE)XXDL必須爲1RE=1:擴展指令集動作,RE=0:基
本指令集動作
delay(100); //大於100uS的延時程序
TransferData(0x30,0);
delay(37); ////大於37uS的延時程序
TransferData(0x08,0); //顯示狀態開/關00001DCB;D=1,整體顯示
ON,C=1,遊標ON B=1:遊標位置ON
delay(100); //大於100uS的延時程序
TransferData(0x10,0); //設定DDRAM,1ACACACACACACACAC,設定
DDRAM地址計數器(AC)
delay(100); //大於100uS的延時程序
TransferData(0x0C,0); //Display Control,D=1,顯示開,關閉遊
標,關閉遊標位置
delay(100); //大於100uS的延時程序
TransferData(0x01,0); //Display Clear清除顯示
delay(10); //大於10mS的延時程序
TransferData(0x06,0); //Enry Mode Set,光標從右向左加1位移
動 進入點設置
delay(100); //大於100uS的延時程序
}
/********************************************************************
* 名稱 : Main()
* 功能 : 主函數
* 輸入 : 無
* 輸出 : 無
**********************************************************************
*/
void initina2(void) //LCD顯示圖片(擴展)初始化程序
{
delay(40); //大於40MS的延時程序
PSB=1; //設置爲8BIT並口工作模式
delay(1); //延時
RES=0; //復位
delay(1); //延時
RES=1; //復位置高
delay(10);
TransferData(0x36,0); //Extended Function Set RE=1:
extended instruction功能設置
delay(100); //大於100uS的延時程序
TransferData(0x36,0); //Extended Function Set:RE=1:
extended instruction set
delay(37); ////大於37uS的延時程序
TransferData(0x3E,0); //EXFUNCTION(DL=8BITS,RE=1,G=1)功能
設置
delay(100); //大於100uS的延時程序
TransferData(0x01,0); //CLEAR SCREEN清屏
delay(100); //大於100uS的延時程序
}
/********************************************************************
* 名稱 : Main()
* 功能 : 主函數
* 輸入 : 無
* 輸出 : 無
**********************************************************************
*/
void main(void)
{
while(1)
{
initina2(); //調用LCD顯示圖片(擴展)初始化
程序
DisplayGraphic(pic2); //顯示圖片2
delayms(200);
initinal(); //調用LCD字庫初始化程序
delay(100); //大於100uS的延時程序
lcd_mesg(IC_DAT); //顯示中文漢字1
delayms(240);
delayms(240);
initinal(); //調用LCD字庫初始化程序
delay(100); //大於100uS的延時程序
lcd_mesg(IC_DAT2); //顯示中文漢字2
delayms(240);
delayms(240);
initinal();
}
}
/********************************************************************
* 名稱 : Main()
* 功能 : 主函數
* 輸入 : 無
* 輸出 : 無
**********************************************************************
*/
void lcd_mesg(unsigned char code *adder1)
{
unsigned char i;
TransferData(0x80,0); //Set Graphic Display RAM Address設置
DDRAM地址,第一行
delay(100);
for(i=0;i<32;i++)
{
TransferData(*adder1,1); //傳輸數據
adder1++;
}
TransferData(0x90,0); //Set Graphic Display RAM Address第二行
delay(100);
for(i=32;i<64;i++)
{
TransferData(*adder1,1);
adder1++;
}
}
/********************************************************************
* 名稱 : Main()
* 功能 : 主函數
* 輸入 : 無
* 輸出 : 無
**********************************************************************
*/
void TransferData(char data1,bit DI) //傳送數據或者命令,當DI=0是,
傳送命令,當DI=1,傳送數據.
{
WRD=0;
RS=DI;
delay(1);
P0=Convert(data1);
E=1;
delay(1);
E=0;
}
/********************************************************************
* 名稱 : Main()
* 功能 : 主函數
* 輸入 : 無
* 輸出 : 無
**********************************************************************
*/
void delayms(unsigned int n) //延時10×n毫秒程序
{
unsigned int i,j;
for(i=0;i<n;i++)
for(j=0;j<2000;j++);
}
/********************************************************************
* 名稱 : Main()
* 功能 : 主函數
* 輸入 : 無
* 輸出 : 無
**********************************************************************
*/
void delay(unsigned int m) //延時程序
{
unsigned int i,j;
for(i=0;i<m;i++)
for(j=0;j<10;j++);
}
/********************************************************************
* 名稱 : Main()
* 功能 : 主函數
* 輸入 : 無
* 輸出 : 無
**********************************************************************
*/
void DisplayGraphic(unsigned char code *adder)
{
int i,j;//*******顯示上半屏內容設置
for(i=0;i<32;i++) //
{
TransferData((0x80 + i),0); //SET 垂直地址 VERTICAL ADD
TransferData(0x80,0); //SET 水平地址 HORIZONTAL ADD
for(j=0;j<16;j++)
{
TransferData(*adder,1);
adder++;
}
}
//***