/***********************************************************************
// 液晶控制芯片ST7920驅動源文件 *
// *
//硬件連接說明: *
// *
// RS(CS) ----------------------------- P3^1 *
// R/W(STD) ----------------------------- P3^4 *
// E(SCLK) ----------------------------- P3^5 *
// PSB ----------------------------- P0^1 *
// RST ----------------------------- P0^0 *
// DB0 ----------------------------- P1^0 *
// DB1 ----------------------------- P1^1 *
// DB2 ----------------------------- P1^2 *
// DB3 ----------------------------- P1^3 *
// DB4 ----------------------------- P1^4 *
// DB5 ----------------------------- P1^5 *
// DB6 ----------------------------- P1^6 *
// DB7(BUSY) ----------------------------- P1^7 *
// *
//***********************************************************************
#include <reg52.h>
#include<intrins.h>
#include<string.h>
#define uchar unsigned char
#define uint unsigned int
#define COUNT 0x10
//每行的首地址,基于RT12864-4M型液晶
#define LINE_ONE_ADDRESS 0x80
#define LINE_TWO_ADDRESS 0x90
#define LINE_THREE_ADDRESS 0x88
#define LINE_FOUR_ADDRESS 0x98
//基本指令集預定義
#define DATA 1 //數據位
#define COMMAND 0 //命令位
#define CLEAR_SCREEN 0x01 //清屏
#define ADDRESS_RESET 0x02 //地址歸零
#define BASIC_FUNCTION 0x30 //基本指令集
#define EXTEND_FUNCTION 0x34 //擴充指令集
//擴展指令集預定義
#define AWAIT_MODE 0x01 //待命模式
#define ROLLADDRESS_ON 0x03 //允許輸入垂直卷動地址
#define IRAMADDRESS_ON 0x02 //允許輸入IRAM地址
#define SLEEP_MODE 0x08 //進入睡眠模式
#define NO_SLEEP_MODE 0x0c //脫離睡眠模式
#define GRAPH_ON 0x36 //打開繪圖模式
#define GRAPH_OFF 0x34 //關閉繪圖模式
//并行位定義
sbit RS=P3^1;
sbit RW=P3^4;
sbit E= P3^5;
sbit BUSY=P1^7;
//控制位定義
sbit PSB = P2^3; //串并選擇信號
sbit RST = P2^5; //復位信號
uchar code Tab1[]="北京信息科技大學";//顯示在第一行
uchar code Tab2[]="信息與通信工程系";//顯示在第二行
uchar code Tab3[]="電子信息工程專業";//顯示在第三行
uchar code Tab4[]="全國電子設計大賽";//顯示在第四行
uchar code Tab5[]={0x54,0xf4};
//*******************************************
//*函數名稱:void Parallel_Check_Busy(void) *
//*函數功能:并行方式查忙 *
//*形式參數:無 *
//*形參說明:無 *
//*返回參數:無 *
//*使用說明:無 *
//*******************************************
void Parallel_Check_Busy(void)
{
bit temp;
P1 = 0xff; //輸入前置1
RS = 0; //指令
RW = 1; //讀模式
do
{
E = 1; //使能
temp = BUSY;
E = 0;
}
while(temp);//等待不忙
}
//************************************************************************************
//*函數名稱:void Parallel_Write_LCD( bit b_Data_Command , unsigned char uc_Content ) *
//*函數功能:并行模式向LCD發送數據或指令 *
//*形式參數:bit b_Data_Command , unsigned char uc_Content *
//*形參說明:數據或指令的標志位,指令或數據的內容 *
//*返回參數:無 *
//*使用說明:無 *
//************************************************************************************
void Parallel_Write_LCD( bit b_Data_Command , unsigned char uc_Content )
{
Parallel_Check_Busy();
if(b_Data_Command)
{
RS = 1; //數據
RW = 0; //寫模式
}
else
{
RS = 0; //指令
RW = 0; //寫模式
}
P1=uc_Content;//數據放到P1口上
E = 1;
_nop_();//很重要
_nop_();
_nop_();
E = 0;
}
//********************************************
//*函數名稱:uc_Parallel_Read_LCD_Data *
//*函數功能:并行讀LCD數據 *
//*形式參數:無 *
//*形參說明:無 *
//*返回參數:讀回的數據 *
//*使用說明:無 *
//********************************************
uchar uc_Parallel_Read_LCD_Data(void)
{
uchar uc_Content;
Parallel_Check_Busy();
P1 = 0xff; //輸入前置1
RS = 1; //數據
RW = 1; //讀模式
E = 1; //使能
uc_Content = P1; //P1口的內容放到變量中
E = 0;
return uc_Content;
}
//*************************************************************
//*函數名稱:void Parallel_DDRAM_Address_Set(uchar ucDDramAdd) *
//*函數功能:設定DDRAM(文本區)地址到地址計數器AC *
//*形式參數:uchar ucDDramAdd *
//*行參說明:具體地址 *
//*格式說明: *
//* RS RW DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 *
//* 0 0 1 AC6 AC5 AC4 AC3 AC2 AC1 AC0 *
//*返回參數:無 *
//*使用說明: *
//* 第一行地址:80H~8FH *
//* 第二行地址:90H~9FH *
//* 第三行地址:A0H~AFH *
//* 第四行地址:B0H~BFH *
//*************************************************************
void Parallel_DDRAM_Address_Set(uchar ucDDramAdd)
{
Parallel_Write_LCD(COMMAND,BASIC_FUNCTION); //基本指令集
Parallel_Write_LCD(COMMAND,ucDDramAdd); //設定DDRAM地址到地址計數器AC
}
//*************************************************************
//*函數名稱:void Parallel_CGRAM_Address_Set(uchar ucCGramAdd) *
//*函數功能:設定CGRAM(自定義字庫區)地址到地址計數器AC *
//*形式參數:uchar ucCGramAdd *
//*形參說明:具體地址 *
//*格式說明: *
//* RS RW DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 *
//* 0 0 0 1 AC5 AC4 AC3 AC2 AC1 AC0 *
//*返回參數:無 *
//*使用說明:地址范圍為40H~3FH *
//*************************************************************
void Parallel_CGRAM_Address_Set(uchar ucCGramAdd)
{
Parallel_Write_LCD(COMMAND,BASIC_FUNCTION); //基本指令集
Parallel_Write_LCD(COMMAND,ucCGramAdd); //設定CGRAM地址到地址計數器AC
}
//*******************************************************************************
//*函數名稱:void Parallel_GDRAM_Address_Set(uchar ucGDramAdd) *
//*函數功能:設定GDRAM(圖形區)地址到地址計數器AC *
//*形式參數:uchar ucGDramAdd *
//*形參說明:具體地址值 *
//* RS RW DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 *
//* 0 0 1 AC6 AC5 AC4 AC3 AC2 AC1 AC0 *
//* 先設定垂直位置再設定水平位置(連續寫入兩個字節完成垂直和水平位置的設置) *
//* 垂直地址范圍:AC6~AC0 *
//* 水平地址范圍:AC3~AC0 *
//*返回參數:無 *
//*使用說明:必須在擴展指令集的情況下使用 *
//*******************************************************************************
void Parallel_GDRAM_Address_Set(uchar ucGDramAdd)
{
Parallel_Write_LCD(COMMAND,EXTEND_FUNCTION); //擴展指令集
Parallel_Write_LCD(COMMAND,ucGDramAdd);
}
//*******************************************
//*函數名稱:void Parallel_Init_LCD(void) *
//*函數功能:并行初始化LCD *
//*形式參數:無 *
//*形參說明:無 *
//*返回參數:無 *
//*使用說明:無 *
//*******************************************
void Parallel_Init_LCD(void)
{
RST = 1; //復位后拉高,停止復位
PSB = 1; //選擇并行傳輸模式
Parallel_Write_LCD(COMMAND,BASIC_FUNCTION); //基本指令動作
Parallel_Write_LCD(COMMAND,CLEAR_SCREEN); //清屏,地址指針指向00H
Parallel_Write_LCD(COMMAND,0x06); //光標的移動方向
Parallel_Write_LCD(COMMAND,0x0c); //開顯示,關游標
}
//********************************************************
//*函數名稱:void Parallel_Clear_Ram(void) *
//*函數功能:并行清屏函數 *
//*形式參數:無 *
//*形參說明:無 *
//*返回參數:無 *
//*使用說明:DDRAM填滿20H,并設定DDRAM AC到00H *
//*格式說明: *
//* RS RW DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 *
//* 0 0 0 0 0 0 0 0 0 1 *
//********************************************************
void Parallel_Clear_Ram(void)
{
Parallel_Write_LCD(COMMAND,BASIC_FUNCTION); //基本指令集
Parallel_Write_LCD(COMMAND,CLEAR_SCREEN); //清屏
}
//*****************************************************
//*函數名稱:void Parallel_Graph_Mode_Set(bit bSelect) *
//*函數功能:打開或關閉繪圖顯示 *
//*形式參數:bit bSelect *
//*形參說明:打開或關閉繪圖顯示的標志位,1打開,0關閉 *
//*格式說明: *
//* RS RW DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 *
//* 0 0 0 0 1 DL X RE G X *
//* DL:0,4bitMPU控制界面 *
//* DL:1,8bitMPU控制界面 *
//* RE:0,基本指令集 *
//* RE:1,擴充指令集 *
//* G :0,繪圖顯示OFF *
//* G :1,繪圖顯示ON *
//*返回參數:無 *
//*使用說明:無 *
//*****************************************************
void Parallel_Graph_Mode_Set(bit bSelect)
{
Parallel_Write_LCD(COMMAND,EXTEND_FUNCTION); //擴展指令集
if(bSelect)
{
Parallel_Write_LCD(COMMAND,GRAPH_ON); //打開繪圖模式
}
else
{
Parallel_Write_LCD(COMMAND,GRAPH_OFF); //關閉繪圖模式
}
}
//*********************************************************************************
//*函數名稱:void Parallel_DisplayStrings_WithAddress(uchar ucAdd,uchar code *p) *
//*函數功能:在(文本區)ucAdd指定的位置顯示一串字符(或是漢字或是ASCII或是兩者混合) *
//*形式參數:uchar ucAdd,uchar code *p *
//*形參說明:指定的位置,要顯示的字符串 *
//*地址必須是:80H~8FH,90H~9FH,88H~AFH,98H~BFH *
//*返回參數:無 *
//*使用說明:使用之前要初始化液晶 *
//*********************************************************************************
void Parallel_DisplayStrings_WithAddress(uchar ucAdd,uchar code *p)
{
uchar length;
length = strlen(p);
Parallel_Write_LCD(COMMAND,BASIC_FUNCTION); //基本指令動作
Parallel_DDRAM_Address_Set(ucAdd);
for( ; length ; length -- )
Parallel_Write_LCD(DATA, *(p++));
}
//****************************************************************
//*函數名稱:void Parallel_ImgDisplay(unsigned char code *img) *
//*函數功能:全屏顯示128*64個象素的圖形 *
//*形式參數:unsigned char code *img *
//*形參說明:要顯示的圖形 *
//*液晶屏坐標說明: *
//* _______________________________________________ *
//* |(0,0) (7,0) | *
//* | | *
//* | | *
//* |(0,31) (7,31)| *
//* |(8,0) (15,0)| *
//* | | *
//* | | *
//* |(8,31) (15,31)| *
//* |______________________________________________| *
// *
//返回參數:無 *
//使用說明:此函數適用于RT12864-4M型液晶 *
//****************************************************************
void Parallel_ImgDisplay(unsigned char code *img)
{
uchar i,j;
Parallel_Graph_Mode_Set(0x01); //先關閉圖形顯示功能
for(j=0;j<32;j++)
{
for(i=0;i<8;i++)
{
Parallel_Write_LCD(COMMAND,0x80+j); //設定垂直坐標
Parallel_Write_LCD(COMMAND,0x80+i); //設定水平坐標
Parallel_Write_LCD(DATA,img[j*16+i*2]); //放入數據高字節
Parallel_Write_LCD(DATA,img[j*16+i*2+1]); //放入數據低字節
}
}
for(j=32;j<64;j++)
{
for(i=0;i<8;i++)
{
Parallel_Write_LCD(COMMAND,0x80+j-32);
Parallel_Write_LCD(COMMAND,0x88+i);
Parallel_Write_LCD(DATA,img[j*16+i*2]);
Parallel_Write_LCD(DATA,img[j*16+i*2+1]);
}
}
Parallel_Graph_Mode_Set(0x00);//最后打開圖形顯示功能
}
//******************************************************************************
//*函數名稱:void Parallel_ImgDisplayCharacter(uchar x,uchar y,uchar code *img) *
//*函數功能:使用繪圖的方法,在(x,y)處畫一個16*16點陣的圖案,也可以是字符 *
//*形式參數:uchar x,uchar y,uchar code *img *
//* x取值范圍:0~15 *
//* y取值范圍:0~32 (針對RT12864-4M型液晶) *
//*形參說明:坐標水平位置,坐標垂直位置,要顯示的圖形 *
//*液晶屏坐標說明: *
//* _______________128個象素______________________ *
//* |(0,0) (7,0)| *
//* | | *
//* 6 | | *
//* 4 |(0,31) (7,31)| *
//* 個 |(8,0) (15,0)| *
//* 象 | | *
//* 素 | | *
//* |(8,31)________________________________(15,31)| *
//* *
//*返回參數:無 *
//*使用說明:此函數適用于RT12864-4M型液晶 *
//******************************************************************************
void Parallel_ImgDisplayCharacter(uchar x,uchar y,uchar code *img)
{
uchar i;
Parallel_Graph_Mode_Set(0x01); //先關閉圖形顯示功能
Parallel_Write_LCD(COMMAND,EXTEND_FUNCTION);
for(i=0;i<16;i++)
{
// Parallel_Write_LCD(COMMAND,0x80+y+i);
//Parallel_Write_LCD(COMMAND,0x80+x);
Parallel_GDRAM_Address_Set(0x80+y+i);
Parallel_GDRAM_Address_Set(0x80+x);
Parallel_Write_LCD(DATA,img[i*2]);
Parallel_Write_LCD(DATA,img[i*2+1]);
}
Parallel_Graph_Mode_Set(0x00); //最后打開圖形顯示功能
}
void main(void)
{
Parallel_Init_LCD();
while(1)
{
Parallel_DisplayStrings_WithAddress(0x80,Tab1);
Parallel_DisplayStrings_WithAddress(0x90,Tab2);
Parallel_DisplayStrings_WithAddress(0x88,Tab3);
Parallel_DisplayStrings_WithAddress(0x98,Tab4);
//Parallel_ImgDisplay(Tab5);
//Parallel_ImgDisplayCharacter(2,8,Tab1);
//Parallel_ImgDisplay(Tab5);
}
}
|