标题:
液晶控制芯片ST7920驱动源文件
[打印本页]
作者:
18163980399
时间:
2021-3-23 11:14
标题:
液晶控制芯片ST7920驱动源文件
/***********************************************************************
// 液晶控制芯片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);
}
}
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1