?? 12864a.c
字號:
/*============================================
液晶模塊:12864A
端口分配:
A15 --->EA; A11--->CS2; A10--->CS1
A9 --->D/I; A8 --->R/W;
**********************************************
指令代碼:
1. 開顯示:0x3f
2. 關顯示:0x3e
3. 設置X值(頁地址):0xb8+X(X=0---7)
4. 設置Y值(列地址):0x40+Y(Y=0---63)
5. 設置Z值(顯示起始行):0xc0+Z(Z=0---63)
2007-3-7 21:37
==============================================*/
//#ifndef _12864A_H_
//#define _12864A_H_
#include <reg52.h>
#include <absacc.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define PAGE 0xb8 //X基值
#define ROW 0x40 //Y基值
#define STRTLINE 0xc0 //Z基值
//定義外部數據端口
#define LcdAddr_wril XBYTE [0x8800] //LCD 寫左半屏指令寄存器端口
#define LcdAddr_rdil XBYTE [0x8900] //LCD 讀左半屏指令寄存器端口
#define LcdAddr_wrdl XBYTE [0x8a00] //LCD 寫左半屏數據寄存器端口
#define LcdAddr_rddl XBYTE [0x8b00] //LCD 讀左半屏數據寄存器端口
#define LcdAddr_wrir XBYTE [0x8400] //LCD 寫右半屏指令寄存器端口
#define LcdAddr_rdir XBYTE [0x8500] //LCD 讀右半屏指令寄存器端口
#define LcdAddr_wrdr XBYTE [0x8600] //LCD 寫右半屏數據寄存器端口
#define LcdAddr_rddr XBYTE [0x8700] //LCD 讀右半屏數據寄存器端口
#define LcdAddr_wri XBYTE [0x8c00] //LCD 寫指令寄存器端口
#define LcdAddr_rdi XBYTE [0x8d00] //LCD 讀指令寄存器端口
#define LcdAddr_wrd XBYTE [0x8e00] //LCD 寫數據寄存器端口
#define LcdAddr_rdd XBYTE [0x8f00] //LCD 讀數據寄存器端口
//#define LcdWaitIdle() while (LcdAddr_rdi & 0x80)
//函數聲明
static void LcdWaitIdle ( void );
extern void LcdSwitch ( bit );
extern void LcdReset ( void );
extern void LcdCls ( void );
extern void LcdClrLine ( uchar );
extern void LcdPutchar ( char *dat, uchar, uchar, bit, bit );
//函數定義
//讀LCD狀態,等待空閑
static void LcdWaitIdle ( void )
{
while ( LcdAddr_rdi & 0x80 ); //提取并判斷忙標志位
}
//LCD顯示開關,0為關顯示(0x3e),1為開顯示(0x3f)
void LcdSwitch ( bit mode )
{
LcdWaitIdle ();
LcdAddr_wri =mode ? 0x3f : 0x3e;
}
//LCD復位
void LcdReset ( void )
{
LcdSwitch (0); //關顯示
LcdWaitIdle ();
LcdAddr_wri = 0xc0; //設置Z=0
LcdWaitIdle ();
LcdAddr_wri = 0xb8; //設置X=0
LcdWaitIdle ();
LcdAddr_wri = 0x40; //設置Y=0
LcdWaitIdle ();
LcdSwitch (1); //開顯示
LcdWaitIdle ();
LcdCls (); //清屏
}
//LCD清屏
void LcdCls ( void )
{
uchar idata page, row;
for ( page =0; page<8; page++ )
{
LcdWaitIdle ();
LcdAddr_wri = PAGE +page;
LcdWaitIdle ();
LcdAddr_wri = ROW;
for ( row = 0; row<64; row++ )
{
LcdWaitIdle ();
LcdAddr_wrd = 0x00;
}
}
}
/*
LCD清除某一行
參數:line ,范圍:1-4
*/
void LcdClrLine ( uchar line )
{
uchar idata page, row;
line =(line-1) & 0x03;
for ( page=line*2; page<line*2+2; page++)
{
LcdWaitIdle ();
LcdAddr_wri = PAGE +page;
LcdWaitIdle ();
LcdAddr_wri = ROW;
for ( row = 0; row<64; row++ )
{
LcdWaitIdle ();
LcdAddr_wrd = 0x00;
}
}
}
/*顯示字符
第一個參數為要顯示的數據的首地址
第二個參數為行地址, 1---4
第三個參數為列地址, 1---16(兩屏統一編制)
第四個參數為全/半角選擇,1為全角,0為半角
第五個參數為反顯開關,1為反顯,0不反顯
*/
void LcdPutchar ( char *dat, uchar page, uchar row, bit quanjiao, bit reverse )
{
uchar idata count, temp;
uchar idata x, y;
page -= 1, row -= 1;
x = PAGE + (page << 1); //頁初始值
y = ROW + ((row & 0x07) * 8); //列初始值
if ( quanjiao ) //全角字符
{
if ( row < 7 ) //完全在左半屏顯示
{
for ( temp = 0; temp < 2; temp++ )
{
LcdWaitIdle ();
LcdAddr_wril = x + temp; //寫入地址
LcdWaitIdle ();
LcdAddr_wril = y;
for ( count = 0; count < 16; count++ ) //寫入數據
{
LcdWaitIdle ();
LcdAddr_wrdl = reverse ? ~dat[count + (temp * 16)] : dat[count + (temp * 16)];
}
}
}
else if ( row > 7 ) //完全在右半屏顯示
{
for ( temp = 0; temp < 2; temp++ )
{
LcdWaitIdle ();
LcdAddr_wrir = x + temp; //寫入地址
LcdWaitIdle ();
LcdAddr_wrir = y;
for ( count = 0; count < 16; count++ ) //寫入數據
{
LcdWaitIdle ();
LcdAddr_wrdr = reverse ? ~dat[count + (temp * 16)] : dat[count + (temp * 16)];
}
}
}
else //左右半屏各半個字符
{
for ( temp = 0; temp < 2; temp++ )
{
LcdWaitIdle ();
LcdAddr_wril = x + temp; //寫入地址
LcdWaitIdle ();
LcdAddr_wril = y;
for ( count = 0; count < 8; count++ ) //寫入數據
{
LcdWaitIdle ();
LcdAddr_wrdl = reverse ? ~dat[count + (temp * 16)] : dat[count + (temp * 16)];
}
LcdWaitIdle ();
LcdAddr_wrir = x + temp; //寫入地址
LcdWaitIdle ();
LcdAddr_wrir = ROW;
for ( count = 8; count < 16; count++ ) //寫入數據
{
LcdWaitIdle ();
LcdAddr_wrdr = reverse ? ~dat[count + (temp * 16)] : dat[count + (temp * 16)];
}
}
}
}
else //半角字符
{
if ( row < 8 ) //左半屏顯示
{
for ( temp = 0; temp < 2; temp++ )
{
LcdWaitIdle ();
LcdAddr_wril = x + temp; //寫入地址
LcdWaitIdle ();
LcdAddr_wril = y;
for ( count = 0; count < 8; count++ ) //寫入數據
{
LcdWaitIdle ();
LcdAddr_wrdl = reverse ? ~dat[count + (temp * 8)] : dat[count + (temp * 8)];
}
}
}
else //右半屏顯示
{
for ( temp = 0; temp < 2; temp++ )
{
LcdWaitIdle ();
LcdAddr_wrir = x + temp; //寫入地址
LcdWaitIdle ();
LcdAddr_wrir = y;
for ( count = 0; count < 8; count++ ) //寫入數據
{
LcdWaitIdle ();
LcdAddr_wrdr = reverse ? ~dat[count + (temp * 8)] : dat[count + (temp * 8)];
}
}
}
}
}
//#endif //_12864A_H_
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -