📄 st7920driver.c
字号:
//***********************************************************************
// 液晶控制芯片ST7920驱动源文件
//作者:RYUDO
//时间:2007.3.10
//说明:
// 1.配合头文件使用;
// 2.不明之处请查阅资料.
//硬件举例说明:
//
// RS(CS) ----------------------------- P3^2
// R/W(STD) ----------------------------- P3^1
// E(SCLK) ----------------------------- P3^0
// 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<reg51.h>
#include<string.h>
#include"ST7920DRIVER.h"
uchar code table[]= //测试用字符
{
"杨"
};
uchar code table1[]= //测试用字符
{
/*-- 文字: 他 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x10,0x40,0x18,0x40,0x12,0x40,0x12,0x44,0x22,0x5E,0x72,0xE4,0xAF,0x44,0x22,0x44,
0x22,0x44,0x22,0x54,0x22,0x48,0x22,0x42,0x22,0x42,0x22,0x02,0x23,0xFE,0x00,0x00,
};
uchar code table2[]= //测试用字符
{
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFB, 0xFF, 0xFE, 0x7F, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFD, 0xFF, 0xFF, 0x3F, 0x9C, 0x1F, 0xFF, 0xEF, 0xFF, 0xFF, 0xC7, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFC, 0x07, 0xFF, 0xBC, 0x33, 0xDF, 0xFF, 0xEF, 0xFF, 0xFF, 0xF3, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xF9, 0xF7, 0xFF, 0xFD, 0xF5, 0xDF, 0xFF, 0x80, 0x3C, 0x1F, 0xF9, 0xFF, 0xFF, 0xFF,
0xFF, 0xFC, 0x7B, 0xF7, 0xFF, 0xFD, 0xFD, 0xCF, 0xFC, 0x6F, 0xA1, 0xDF, 0xFC, 0x7F, 0xFF, 0xFF,
0xFF, 0xE1, 0x7B, 0xF7, 0xFF, 0xFD, 0xFD, 0xEF, 0xF9, 0xEF, 0xB7, 0xDF, 0xFE, 0x7F, 0xFF, 0xFF,
0xFF, 0xC7, 0x73, 0xB7, 0xFC, 0x3D, 0xFD, 0xDF, 0xFF, 0xEF, 0xB7, 0xDF, 0xFE, 0x3F, 0xFF, 0xFF,
0xFF, 0xF2, 0x77, 0xB7, 0xFF, 0x3D, 0xFD, 0x5F, 0xFF, 0xDF, 0xB7, 0xDF, 0xFC, 0x9F, 0xFF, 0xFF,
0xFF, 0xF8, 0xFF, 0xBF, 0xFF, 0x7D, 0x7D, 0x1F, 0xFF, 0xDF, 0xB3, 0xDF, 0xFD, 0xC7, 0xFF, 0xFF,
0xFF, 0xFC, 0x7F, 0x3F, 0xFF, 0x1C, 0x7D, 0xFF, 0xFF, 0x9F, 0x3B, 0xDF, 0xF3, 0xF3, 0xFF, 0xFF,
0xFF, 0xF1, 0x3F, 0x7F, 0xFF, 0xDC, 0xFD, 0xFF, 0xFF, 0xBF, 0x7B, 0xDF, 0xCF, 0xFC, 0xFF, 0xFF,
0xFF, 0xE7, 0xDE, 0x3F, 0xFF, 0xDF, 0xFD, 0xFF, 0xFF, 0xBE, 0x7B, 0xDF, 0x3F, 0xFE, 0x7F, 0xFF,
0xFF, 0xFF, 0xFE, 0xDF, 0xFF, 0xBF, 0xFD, 0xFF, 0xFF, 0x7E, 0xFA, 0x1F, 0xFF, 0xFF, 0x9F, 0xFF,
0xFF, 0xFF, 0xFD, 0xC7, 0xFF, 0xBF, 0xFC, 0xFF, 0xFE, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xFF,
0xFF, 0xFF, 0xF1, 0xF1, 0xFF, 0x3F, 0xFE, 0xFF, 0xFD, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0xFF,
0xFF, 0xFF, 0xC7, 0xFC, 0x3E, 0x00, 0x0E, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x0F, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xFF, 0x7F, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0xFF, 0xDF, 0xFF, 0x7F, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xF8, 0xDF, 0xFF, 0x7F, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFE, 0xDF, 0xFF, 0x7F, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0x5F, 0xFF, 0x7C, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xF7, 0xDF, 0xFF, 0x7F, 0xDF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFB, 0xDF, 0xFF, 0x77, 0xDF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x0C, 0xDF, 0xFF, 0x87, 0xDF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFE, 0xDF, 0xFC, 0x3F, 0xDF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0xDF, 0xF9, 0xBD, 0x9F, 0x47, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x70, 0x00, 0x7F, 0xBD, 0xBF, 0x73, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE5, 0x3F, 0xDF, 0xFF, 0xBB, 0xBF, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0x9F, 0xDF, 0xFF, 0xBB, 0xBF, 0x7B, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xDF, 0xDF, 0xFF, 0xB3, 0xBF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xCF, 0xCF, 0xFF, 0xB7, 0xBF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9D, 0xFF, 0xCF, 0xFF, 0xBF, 0xBF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3D, 0xFF, 0xDF, 0xFF, 0xBF, 0xBF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xDF, 0xFF, 0xBF, 0x3F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xDF, 0xFF, 0xB0, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xDF, 0xFF, 0xB3, 0xFE, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xDF, 0xFF, 0xBF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xDF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
};
//*******************************************
//函数名称:void Serial_Write_LCD( bit b_Data_Command , unsigned char uc_Content)
//函数功能:以串行模式向LCD发送 数据 或 指令
//形式参数:bit b_Data_Command , unsigned char uc_Content
//行参说明:数据或命令的标志位,数据或指令的内容
//返回参数:无
//使用说明:无
//*******************************************
void Serial_Write_LCD( bit b_Data_Command , unsigned char uc_Content)
{
uchar uc_i,uc_j;
CS = 1;
SCLK= 0;
STD = 1;
for( uc_i=5 ; uc_i ; --uc_i)
{
SCLK = 1;
SCLK = 0;
}
STD = 0; //RW = 0;
SCLK = 1;
SCLK = 0;
if( b_Data_Command )
STD = 1; //RS = 1,写数据
else
STD = 0; //RS = 0,写指令
SCLK = 1;
SCLK = 0;
STD = 0;
SCLK = 1;
SCLK = 0;
for( uc_i=0 ; uc_i<2 ; uc_i++ )
{
for( uc_j=0 ; uc_j<4 ; uc_j++ )
{
uc_Content<<=1;
STD = CY; //这句很精彩,不过减弱了程序的移植性
SCLK= 1;
SCLK= 0;
}
STD = 0;
for( uc_j=0 ; uc_j<4 ; uc_j++ )
{
SCLK= 1;
SCLK= 0;
}
}
}
//*******************************************
//函数名称:void Serial_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 Serial_Clear_Ram(void)
{
Serial_Write_LCD(COMMAND,BASIC_FUNCTION); //基本指令集
Serial_Write_LCD(COMMAND,CLEAR_SCREEN); //清屏
}
//*******************************************
//函数名称:void Serial_DDRAM_Address_Reset(void)
//函数功能:DDRAM地址回到00H
//形式参数:无
//行参说明:无
//返回参数:无
//使用说明:设定DDRAM AC到00H,并将游标移动到开头原点位置,这个指令不改变DDRAM内容
//格式说明:
// RS RW DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
// 0 0 0 0 0 0 0 0 1 X
//*******************************************
void Serial_DDRAM_Address_Reset(void)
{
Serial_Write_LCD(COMMAND,BASIC_FUNCTION); //基本指令集
Serial_Write_LCD(COMMAND,ADDRESS_RESET); //DDRAM地址归位
}
//*******************************************
//函数名称:void Serial_EnterPoint_Set(uchar ucEnPoSet)
//函数功能:设定在资料的读取与写入时,游标移动方式及指定显示的移位
//形式参数:uchar ucEnPoSet
//行参说明:具体的控制指令
//格式说明:
// RS RW DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
// 0 0 0 0 0 0 0 1 I/D S
// I/D:0,游标左移,DDRAM AC减1
// I/D:1,游标右移,DDRAM AC加1
// S---显示画面整体位移
// S:0,或者DDRAM为读状态,整体显示不位移
// S:1,且DDRAM为写状态,I/D=0,整体显示右移
// S:1,且DDRAM为写状态,I/D=1,整体显示左移
//返回参数:无
//使用说明:无
//*******************************************
void Serial_EnterPoint_Set(uchar ucEnPoSet)
{
Serial_Write_LCD(COMMAND,BASIC_FUNCTION); //基本指令集
Serial_Write_LCD(COMMAND,ucEnPoSet); //设定在资料的读取与写入时,游标移动方式及指定显示的移位
}
//*******************************************
//函数名称:void Serial_DisplayState_Set(uchar ucDisStaSet)
//函数功能:显示状态设定
//形式参数:uchar ucDisStaSet
//行参说明:具体的控制指令
//格式说明:
// RS RW DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
// 0 0 0 0 0 0 1 D C B
// D:0,整体显示OFF,但这个指令不改变DDRAM内容
// D:1,整体显示ON
// C:0,游标显示OFF
// C:1,游标显示ON
// B:0,游标位置反白显示OFF
// B:1,游标位置反白显示ON,将游标位置的资料反白显示
//返回参数:无
//使用说明:无
//*******************************************
void Serial_DisplayState_Set(uchar ucDisStaSet)
{
Serial_Write_LCD(COMMAND,BASIC_FUNCTION); //基本指令集
Serial_Write_LCD(COMMAND,ucDisStaSet); //设定显示状态
}
//*******************************************
//函数名称:void Serial_Cursor_Display_Transpose_Control_Set(uchar ucCurDisTraConSet)
//函数功能:设定游标的移动与显示的移位
//形式参数:uchar ucCurDisTraConSet
//行参说明:具体的控制指令
//格式说明:
// RS RW DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
// 0 0 0 0 0 1 S/C R/L X X
// S/C,R/L:00,游标向左移动,AC减1
// S/C,R/L:01,游标向右移动,AC加1
// S/C,R/L:10,显示向左移动,游标跟着,但AC不变
// S/C,R/L:11,显示向右移动,游标跟着,但AC不变
//返回参数:无
//使用说明:这个指令不改变DDRAM内容
//*******************************************
void Serial_Cursor_Display_Transpose_Control_Set(uchar ucCurDisTraConSet)
{
Serial_Write_LCD(COMMAND,BASIC_FUNCTION); //基本指令集
Serial_Write_LCD(COMMAND,ucCurDisTraConSet); //设定游标的移动与显示的移位
}
//*******************************************
//函数名称:void Serial_Function_Set(uchar ucFunSet)
//函数功能:显示功能设定
//形式参数:uchar ucFunSet
//行参说明:具体的指令
//格式说明:
// RS RW DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
// 0 0 0 0 1 DL X RE X X
// DL:0,4bitMPU控制界面
// DL:1,8bitMPU控制界面
// RE:0,基本指令集
// RE:1,扩充指令集
//返回参数:无
//使用说明:同一指令不可同时更改DL和RE,需要先改变DL,再改变RE,才可保证正确标志
//*******************************************
void Serial_Function_Set(uchar ucFunSet)
{
Serial_Write_LCD(COMMAND,BASIC_FUNCTION); //基本指令集
Serial_Write_LCD(COMMAND,ucFunSet); //显示功能设定
}
//*******************************************
//函数名称:void Serial_CGRAM_Address_Set(uchar ucCGramAdd)
//函数功能:设定CGRAM(自定义字库区)地址到地址计数器AC
//形式参数:uchar ucCGramAdd
//行参说明:具体地址
//格式说明:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -