?? 240128_t6963c_01.txt
字號:
標簽: LCD 單片機
LCD240128(t6963c驅動程序)
最近寫了一個液晶程序,是6963C的,寫的時候花了我不少周折,主要是自模選取時有一些問題,想在液晶上豎著顯示,可是不知道該怎么選取,我試了很多遍才成功。剛開始調試時,還以為是自己的程序不對呢,呵呵,水平有限,發來大家來共享!
#include<stdio.h>
#include<intrins.h>
#include <reg52.h>
#include <math.h>
#include <absacc.h>
#include <string.h>
#include <lcd.h>
/* 地址定義 */
#define d_c_add XBYTE[0x00] //數據口 命令口
/* T6963C 命令定義 */
#define LCD_CUR_POS 0x21 /* 光標位置設置(只有設置到有效顯示地址并打開顯示時才看到) */
#define LCD_CGR_POS 0x22 /* CGRAM偏置地址設置(可以增加自已的符號) */
#define LCD_ADR_POS 0x24 /* 地址指針位置(設置讀寫操作指針) */
#define LCD_TXT_STP 0x40 /* 文本區首址(從此地址開始向屏幕左上角顯示字符) */
#define LCD_TXT_WID 0x41 /* 文本區寬度(設置顯示寬度,N/6或N/8,其中N為x軸的點數) */
#define LCD_GRH_STP 0x42 /* 圖形區首址(從此地址開始向屏幕左上角顯示點) */
#define LCD_GRH_WID 0x43 /* 圖形區寬度(設置顯示寬度,N/6或N/8,其中N為x軸的點數) */
#define LCD_MOD_OR 0x80 /* 顯示方式:邏輯或 */
#define LCD_MOD_XOR 0x81 /* 顯示方式:邏輯異或 */
#define LCD_MOD_AND 0x82 /* 顯示方式:邏輯與 */
#define LCD_MOD_TCH 0x83 /* 顯示方式:文本特征 */
#define LCD_DIS_SW 0x90 /* 顯示開關:D0=1/0,光標閃爍啟用/禁用 */
/* D1=1/0,光標顯示啟用/禁用 */
/* D2=1/0,文本顯示啟用/禁用(打開后再使用) */
/* D3=1/0,圖形顯示啟用/禁用(打開后再使用) */
#define LCD_CUR_SHP 0xA0 /* 光標形狀選擇:0xA0-0xA7表示光標占的行數 */
#define LCD_AUT_WR 0xB0 /* 自動寫設置 */
#define LCD_AUT_RD 0xB1 /* 自動讀設置 */
#define LCD_AUT_OVR 0xB2 /* 自動讀/寫結束 */
#define LCD_INC_WR 0xC0 /* 數據一次寫,地址加1 */
#define LCD_INC_RD 0xC1 /* 數據一次讀,地址加1 */
#define LCD_DEC_WR 0xC2 /* 數據一次寫,地址減1 */
#define LCD_DEC_RD 0xC3 /* 數據一次讀,地址減1 */
#define LCD_NOC_WR 0xC4 /* 數據一次寫,地址不變 */
#define LCD_NOC_RD 0xC5 /* 數據一次讀,地址不變 */
#define LCD_SCN_RD 0xE0 /* 屏讀 */
#define LCD_SCN_CP 0xE8 /* 屏拷貝 */
#define LCD_BIT_OP 0xF0 /* 位操作:D0-D2--定義D0-D7位,D3--1為置位,0為清除 */
/* 定義標志位 */
sbit CD = P1^0;
sbit CE = P1^1;
sbit light = P1^2;
uchar code ASCII_DOT_LIB[][16];
/********************************************************************************************************/
/***********************************************************************
* 名稱:LCD_TestStaBit01()
* 功能:判斷讀寫指令和讀寫數據是否允許。
* 入口參數:無
* 出口參數:返回0表示禁止,否則表示允許
***********************************************************************/
uchar LCD_TestStaBit01(void)
{ uchar i;
CD="1";CE=0;
for(i=100; i>0; i--)
{ if( (d_c_add&0x03)==0x03 ) break;
}
CE="1";
return(i);
}
/***********************************************************************
* 名稱:LCD_TestStaBit02()
* 功能:查詢是否可數據自動讀狀態
* 入口參數:無
* 出口參數:返回0表示禁止,否則表示允許
***********************************************************************/
uchar LCD_TestStaBit02(void)
{ uchar i;
CD="1"; CE="0";
for(i=100; i>0; i--)
{ if( (d_c_add&0x04)==0x04 ) break;
}
CE="1";
return(i);
}
/***********************************************************************
* 名稱:LCD_TestStaBit03()
* 功能:數據自動寫狀態是否允許。
* 入口參數:無
* 出口參數:返回0表示禁止,否則表示允許
***********************************************************************/
uchar LCD_TestStaBit03(void)
{ uchar i;
CD="1";CE=0;
for(i=100; i>0; i--)
{ if( (d_c_add&0x08)==0x08 ) break;
}
CE="1";
return(i);
}
/********************************************************************************************************/
/***********************************************************************
* 名稱:LCD_ReadState()
* 功能:讀取狀態字子程序。
* 入口參數:無
* 出口參數:返回值即為讀出的狀態字
* 說明:函數會設置LCM數據總線為輸入方式
***********************************************************************/
void LCD_WriteCommand(uchar command)
{
CD=1;CE=0;
d_c_add=command;
CE=1;
}
/********************************************************************************************************/
/***********************************************************************
* 名稱:LCD_WriteData()
* 功能:寫數據子程序。(發送數據前,不檢查液晶模塊的狀態)
* 入口參數:dat 要寫入LCM的數據
* 出口參數:無
* 說明:函數會設置LCM數據總線為輸出方式
***********************************************************************/
void LCD_WriteData(uchar dat)
{
CD=0;CE=0;
d_c_add=dat;
CE=1;
}
/********************************************************************************************************/
/***********************************************************************
* 名稱:LCD_ReadData()
* 功能:讀取數據子程序。
* 入口參數:無
* 出口參數:返回值即為讀出的數據
* 說明:函數會設置LCM數據總線為輸入方式
***********************************************************************/
uchar LCD_ReadData(void)
{
uchar dat;
CD=0;CE=0;
dat=d_c_add;
CE=1;
return dat;
}
/**************************************LCD_WriteTCommand1******************************************************************/
/***********************************************************************
* 名稱:LCD_WriteTCommand1()
* 功能:寫無參數命令子程序。會先判斷LCM狀態字。
* 入口參數:command 要寫入LCM的命令字
* 出口參數:操作出錯返回0,否則返回1
***********************************************************************/
uchar LCD_WriteTCommand1(uchar command)
{ if( LCD_TestStaBit01()==0 )return(0);
LCD_WriteCommand(command); // 發送命令字
return(1);
}
/********************************LCD_WriteTCommand2************************************************************************/
/***********************************************************************
* 名稱:LCD_WriteTCommand2()
* 功能:寫單參數命令子程序。會先判斷LCM狀態字。
* 入口參數:command 要寫入LCM的命令字
* dat1 參數1
* 出口參數:操作出錯返回0,否則返回1
* 說明:先發送參數據數據,再發送命令字
***********************************************************************/
uchar LCD_WriteTCommand2(uchar command, uchar dat1)
{ if( LCD_TestStaBit01()==0 ) return(0);
LCD_WriteData(dat1); // 發送數據1
if( LCD_TestStaBit01()==0 ) return(0);
LCD_WriteCommand(command); // 發送命令字
return(1);
}
/********************************LCD_WriteTCommand3************************************************************************/
/***********************************************************************
* 名稱:LCD_WriteTCommand3()
* 功能:寫雙參數命令子程序。會先判斷LCM狀態字。
* 入口參數:command 要寫入LCM的命令字
* dat1 參數1
* dat2 參數2
* 出口參數:操作出錯返回0,否則返回1
* 說明:先發送兩字節參數據數據,再發送命令字
***********************************************************************/
uchar LCD_WriteTCommand3(uchar command, uchar dat1, uchar dat2)
{ if( LCD_TestStaBit01()==0 ) return(0);
LCD_WriteData(dat1); // 發送數據1
if( LCD_TestStaBit01()==0 ) return(0);
LCD_WriteData(dat2); // 發送數據2
if( LCD_TestStaBit01()==0 ) return(0);
LCD_WriteCommand(command); // 發送命令字
return(1);
}
/******************************LCD_WriteTData1**************************************************************************/
/***********************************************************************
* 名稱:LCD_WriteTData1()
* 功能:寫1字節數據子程序。會先判斷狀態字。
* 入口參數:dat 要寫入LCM的數據
* 出口參數:操作出錯返回0,否則返回1
***********************************************************************/
uchar LCD_WriteTData1(uchar dat)
{ if( LCD_TestStaBit03()==0 ) {return(0);}
LCD_WriteData(dat); // 發送命令字
return(1);
}
/*******************************LCD_Initialize*************************************************************************/
void LCD_Initialize(void)
{ LCD_WriteTCommand3(LCD_TXT_STP, 0x00, 0x00); // 設置文本方式RAM起始地址
LCD_WriteTCommand3(LCD_TXT_WID, 30, 0x00); // 設置文本模式的寬度,寬度為N/6或N/8,N為寬度點數,如240
LCD_WriteTCommand3(LCD_GRH_STP, 0x00, 0x00); // 設置圖形方式RAM起始地址
LCD_WriteTCommand3(LCD_GRH_WID, 30, 0x00); // 設置圖形模式的寬度,寬度為N/6或N/8,N為寬度點數,如240
LCD_WriteTCommand1(LCD_MOD_OR); // 設置顯示方式為"或"
LCD_WriteTCommand1(LCD_DIS_SW|0x08); // 設置純圖形顯示模式
LCD_WriteTCommand1(LCD_CUR_SHP|0x07); // 光標形狀
}
/*********************************LCD_FillAll**********************************************************************/
void LCD_FillAll(uchar dat)
{ uint i;
LCD_WriteTCommand3(LCD_ADR_POS, 0x00, 0x00); // 置地址指針
LCD_WriteTCommand1(LCD_AUT_WR); // 自動寫
for(i=0;i<128*30;i++)
{ LCD_WriteTData1(dat); // 寫數據
}
LCD_WriteTCommand1(LCD_AUT_OVR); // 自動寫結束
LCD_WriteTCommand3(LCD_ADR_POS,0x00,0x00); // 重置地址指針
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -