找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1148|回复: 0
收起左侧

液晶控制芯片ST7920驱动源文件

[复制链接]
ID:625484 发表于 2021-3-23 11:14 | 显示全部楼层 |阅读模式
/***********************************************************************
//                                                液晶控制芯片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);
}
}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表