找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1837|回復(fù): 0
收起左側(cè)

液晶控制芯片ST7920驅(qū)動(dòng)源文件

[復(fù)制鏈接]
ID:625484 發(fā)表于 2021-3-23 11:14 | 顯示全部樓層 |閱讀模式
/***********************************************************************
//                                                液晶控制芯片ST7920驅(qū)動(dòng)源文件                                        *
//                                                                                                                                                *
//硬件連接說明:                                                                                                                 *
//                                                                                                                                                *
//                                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

//基本指令集預(yù)定義
#define DATA                       1                 //數(shù)據(jù)位
#define COMMAND                    0                         //命令位
#define        CLEAR_SCREEN               0x01                  //清屏       
#define        ADDRESS_RESET              0x02                //地址歸零         
#define        BASIC_FUNCTION                  0x30                //基本指令集
#define        EXTEND_FUNCTION                   0x34                //擴(kuò)充指令集

//擴(kuò)展指令集預(yù)定義
#define        AWAIT_MODE                        0x01                 //待命模式       
#define ROLLADDRESS_ON                0x03                //允許輸入垂直卷動(dòng)地址
#define IRAMADDRESS_ON                0x02                //允許輸入IRAM地址       
#define        SLEEP_MODE                        0x08                 //進(jìn)入睡眠模式
#define        NO_SLEEP_MODE                0x0c                 //脫離睡眠模式
#define GRAPH_ON                        0x36                //打開繪圖模式
#define GRAPH_OFF                        0x34                //關(guān)閉繪圖模式


//并行位定義
sbit RS=P3^1;
sbit RW=P3^4;
sbit E= P3^5;
sbit BUSY=P1^7;

//控制位定義
sbit PSB = P2^3;        //串并選擇信號
sbit RST = P2^5;         //復(fù)位信號


uchar code Tab1[]="北京信息科技大學(xué)";//顯示在第一行
uchar code Tab2[]="信息與通信工程系";//顯示在第二行
uchar code Tab3[]="電子信息工程專業(yè)";//顯示在第三行
uchar code Tab4[]="全國電子設(shè)計(jì)大賽";//顯示在第四行
uchar code Tab5[]={0x54,0xf4};

//*******************************************
//*函數(shù)名稱:void Parallel_Check_Busy(void)        *
//*函數(shù)功能:并行方式查忙                                        *
//*形式參數(shù):無                                                                *
//*形參說明:無                                                                *
//*返回參數(shù):無                                                                *
//*使用說明:無                                                                *
//*******************************************
void Parallel_Check_Busy(void)
{
        bit temp;
          P1 = 0xff;        //輸入前置1
          RS = 0;                //指令
          RW = 1;                //讀模式
        do
        {       
            E  = 1;         //使能
                temp = BUSY;
              E  = 0;
        }
          while(temp);//等待不忙
}


//************************************************************************************
//*函數(shù)名稱:void Parallel_Write_LCD( bit b_Data_Command , unsigned char uc_Content ) *
//*函數(shù)功能:并行模式向LCD發(fā)送數(shù)據(jù)或指令                                                                                                 *
//*形式參數(shù):bit b_Data_Command , unsigned char uc_Content                                                         *
//*形參說明:數(shù)據(jù)或指令的標(biāo)志位,指令或數(shù)據(jù)的內(nèi)容                                                                                 *
//*返回參數(shù):無                                                                                                                                                 *
//*使用說明:無                                                                                                                                                 *
//************************************************************************************
void Parallel_Write_LCD( bit b_Data_Command , unsigned char uc_Content )
{
        Parallel_Check_Busy();
          if(b_Data_Command)
            {
                RS = 1;   //數(shù)據(jù)
            RW = 0;   //寫模式
            }
          else
            {
            RS = 0;   //指令
            RW = 0;   //寫模式
            }
          P1=uc_Content;//數(shù)據(jù)放到P1口上
          E = 1;
          _nop_();//很重要
        _nop_();
           _nop_();
    E = 0;                                                                                                               
}


//********************************************
//*函數(shù)名稱:uc_Parallel_Read_LCD_Data                 *
//*函數(shù)功能:并行讀LCD數(shù)據(jù)                                         *
//*形式參數(shù):無                                                                 *
//*形參說明:無                                                                 *
//*返回參數(shù):讀回的數(shù)據(jù)                                                 *
//*使用說明:無                                                                 *
//********************************************
uchar uc_Parallel_Read_LCD_Data(void)
{
        uchar uc_Content;
        Parallel_Check_Busy();
        P1 = 0xff;                        //輸入前置1
    RS = 1;                           //數(shù)據(jù)
    RW = 1;                           //讀模式
          E = 1;                                //使能
          uc_Content = P1;    //P1口的內(nèi)容放到變量中
          E = 0;
        return uc_Content;
}

//*************************************************************
//*函數(shù)名稱:void Parallel_DDRAM_Address_Set(uchar ucDDramAdd) *
//*函數(shù)功能:設(shè)定DDRAM(文本區(qū))地址到地址計(jì)數(shù)器AC                                  *
//*形式參數(shù):uchar ucDDramAdd                                                                  *
//*行參說明:具體地址                                                                                  *
//*格式說明:                                                                                                  *
//*                RS        RW        DB7        DB6        DB5        DB4        DB3        DB2        DB1        DB0                                  *
//*                0        0        1        AC6        AC5        AC4        AC3        AC2        AC1        AC0                                  *
//*返回參數(shù):無                                                                                                  *
//*使用說明:                                                                                                  *
//*        第一行地址: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);                                //設(shè)定DDRAM地址到地址計(jì)數(shù)器AC
}


//*************************************************************
//*函數(shù)名稱:void Parallel_CGRAM_Address_Set(uchar ucCGramAdd) *
//*函數(shù)功能:設(shè)定CGRAM(自定義字庫區(qū))地址到地址計(jì)數(shù)器AC                  *
//*形式參數(shù):uchar ucCGramAdd                                                                  *
//*形參說明:具體地址                                                                                  *
//*格式說明:                                                                                                  *
//*                RS        RW        DB7        DB6        DB5        DB4        DB3        DB2        DB1        DB0                                  *
//*                0        0        0        1        AC5        AC4        AC3        AC2        AC1        AC0                                  *
//*返回參數(shù):無                                                                                                  *
//*使用說明:地址范圍為40H~3FH                                                                  *
//*************************************************************
void Parallel_CGRAM_Address_Set(uchar ucCGramAdd)
{
        Parallel_Write_LCD(COMMAND,BASIC_FUNCTION);                        //基本指令集
        Parallel_Write_LCD(COMMAND,ucCGramAdd);                                //設(shè)定CGRAM地址到地址計(jì)數(shù)器AC
}


//*******************************************************************************
//*函數(shù)名稱:void Parallel_GDRAM_Address_Set(uchar ucGDramAdd)                                        *
//*函數(shù)功能:設(shè)定GDRAM(圖形區(qū))地址到地址計(jì)數(shù)器AC                                                                        *
//*形式參數(shù):uchar ucGDramAdd                                                                                                        *
//*形參說明:具體地址值                                                                                                                        *
//*                RS        RW        DB7        DB6        DB5        DB4        DB3        DB2        DB1        DB0                                                                        *
//*                0        0        1        AC6        AC5        AC4        AC3        AC2        AC1        AC0                                                                        *
//*                先設(shè)定垂直位置再設(shè)定水平位置(連續(xù)寫入兩個(gè)字節(jié)完成垂直和水平位置的設(shè)置)        *       
//*                垂直地址范圍:AC6~AC0                                                                                                        *
//*                水平地址范圍:AC3~AC0                                                                                                        *
//*返回參數(shù):無                                                                                                                                        *
//*使用說明:必須在擴(kuò)展指令集的情況下使用                                                                                *
//*******************************************************************************
void Parallel_GDRAM_Address_Set(uchar ucGDramAdd)
{
        Parallel_Write_LCD(COMMAND,EXTEND_FUNCTION);                        //擴(kuò)展指令集
        Parallel_Write_LCD(COMMAND,ucGDramAdd);               
}



//*******************************************
//*函數(shù)名稱:void Parallel_Init_LCD(void)        *
//*函數(shù)功能:并行初始化LCD                                        *
//*形式參數(shù):無                                                                *
//*形參說明:無                                                                *
//*返回參數(shù):無                                                                *
//*使用說明:無                                                                *
//*******************************************
void Parallel_Init_LCD(void)
{
          RST = 1;                                                                        //復(fù)位后拉高,停止復(fù)位
          PSB = 1;                                                                        //選擇并行傳輸模式               
          Parallel_Write_LCD(COMMAND,BASIC_FUNCTION); //基本指令動(dòng)作   
          Parallel_Write_LCD(COMMAND,CLEAR_SCREEN);          //清屏,地址指針指向00H
          Parallel_Write_LCD(COMMAND,0x06);                      //光標(biāo)的移動(dòng)方向
          Parallel_Write_LCD(COMMAND,0x0c);                          //開顯示,關(guān)游標(biāo)

}



//********************************************************
//*函數(shù)名稱:void Parallel_Clear_Ram(void)                     *
//*函數(shù)功能:并行清屏函數(shù)                                                     *
//*形式參數(shù):無                                                                             *
//*形參說明:無                                                                              *
//*返回參數(shù):無                                                                             *
//*使用說明:DDRAM填滿20H,并設(shè)定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);                        //清屏
}


//*****************************************************
//*函數(shù)名稱:void Parallel_Graph_Mode_Set(bit bSelect) *
//*函數(shù)功能:打開或關(guān)閉繪圖顯示                                                  *
//*形式參數(shù):bit bSelect                                                                  *
//*形參說明:打開或關(guān)閉繪圖顯示的標(biāo)志位,1打開,0關(guān)閉          *
//*格式說明:                                                                                  *
//*                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,擴(kuò)充指令集                                                                  *
//*                G :0,繪圖顯示OFF                                                          *
//*                G :1,繪圖顯示ON                                                                  *
//*返回參數(shù):無                                                                                  *
//*使用說明:無                                                                                  *
//*****************************************************
void Parallel_Graph_Mode_Set(bit bSelect)
{
        Parallel_Write_LCD(COMMAND,EXTEND_FUNCTION);        //擴(kuò)展指令集
        if(bSelect)
        {
        Parallel_Write_LCD(COMMAND,GRAPH_ON);                        //打開繪圖模式
        }
        else
        {
        Parallel_Write_LCD(COMMAND,GRAPH_OFF);                        //關(guān)閉繪圖模式       
        }
}


//*********************************************************************************
//*函數(shù)名稱:void Parallel_DisplayStrings_WithAddress(uchar ucAdd,uchar code *p)          *
//*函數(shù)功能:在(文本區(qū))ucAdd指定的位置顯示一串字符(或是漢字或是ASCII或是兩者混合)  *
//*形式參數(shù):uchar ucAdd,uchar code *p                                                                                          *
//*形參說明:指定的位置,要顯示的字符串                                                                                          *
//*地址必須是:80H~8FH,90H~9FH,88H~AFH,98H~BFH                                                                          *
//*返回參數(shù):無                                                                                                                                          *
//*使用說明:使用之前要初始化液晶                                                                                                  *
//*********************************************************************************
void Parallel_DisplayStrings_WithAddress(uchar ucAdd,uchar code *p)
{
        uchar length;
        length = strlen(p);
    Parallel_Write_LCD(COMMAND,BASIC_FUNCTION);                          //基本指令動(dòng)作   
        Parallel_DDRAM_Address_Set(ucAdd);
        for( ;  length ; length -- )
        Parallel_Write_LCD(DATA, *(p++));                                       
}



//****************************************************************
//*函數(shù)名稱:void Parallel_ImgDisplay(unsigned char code *img)         *
//*函數(shù)功能:全屏顯示128*64個(gè)象素的圖形                                                         *
//*形式參數(shù):unsigned char code *img                                                                 *
//*形參說明:要顯示的圖形                                                                                 *
//*液晶屏坐標(biāo)說明:                                                                                                 *
//*                 _______________________________________________                 *
//*                |(0,0)                                                         (7,0) |                 *
//*                |                                                                                        |                 *
//*                |                                                                                    |                 *
//*                |(0,31)                                                         (7,31)|                 *
//*                |(8,0)                                                         (15,0)|                 *
//*                |                                                                                        |                 *
//*                |                                                                                         |                 *
//*                |(8,31)                                 (15,31)|                 *
//*            |______________________________________________|                 *
//                                                                                                                                 *
//返回參數(shù):無                                                                                                         *
//使用說明:此函數(shù)適用于RT12864-4M型液晶                                                         *
//****************************************************************
void Parallel_ImgDisplay(unsigned char code *img)
{
          uchar i,j;
    Parallel_Graph_Mode_Set(0x01); //先關(guān)閉圖形顯示功能
        for(j=0;j<32;j++)
           {
            for(i=0;i<8;i++)
              {
                      Parallel_Write_LCD(COMMAND,0x80+j);                //設(shè)定垂直坐標(biāo)
                      Parallel_Write_LCD(COMMAND,0x80+i);                //設(shè)定水平坐標(biāo)
                  Parallel_Write_LCD(DATA,img[j*16+i*2]);        //放入數(shù)據(jù)高字節(jié)
                      Parallel_Write_LCD(DATA,img[j*16+i*2+1]);        //放入數(shù)據(jù)低字節(jié)
             }
           }
          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);//最后打開圖形顯示功能
}



//******************************************************************************
//*函數(shù)名稱:void Parallel_ImgDisplayCharacter(uchar x,uchar y,uchar code *img) *
//*函數(shù)功能:使用繪圖的方法,在(x,y)處畫一個(gè)16*16點(diǎn)陣的圖案,也可以是字符                   *
//*形式參數(shù):uchar x,uchar y,uchar code *img                                                                           *
//*                        x取值范圍:0~15                                                                                                           *
//*                        y取值范圍:0~32 (針對RT12864-4M型液晶)                                                       *
//*形參說明:坐標(biāo)水平位置,坐標(biāo)垂直位置,要顯示的圖形                                                           *
//*液晶屏坐標(biāo)說明:                                                                                                                           *
//*                _______________128個(gè)象素______________________                                                   *
//*                |(0,0)                                                                     (7,0)|                                                   *
//*                |                                                                                          |                                                   *
//*        6        |                                                                                          |                                                   *
//*        4        |(0,31)                                                                        (7,31)|                                                   *
//*        個(gè)        |(8,0)                                                                        (15,0)|                                                   *
//*        象        |                                                                                          |                                                   *
//*        素        |                                                                                          |                                                   *
//*                |(8,31)________________________________(15,31)|                                                   *
//*                                                                                                                                                           *
//*返回參數(shù):無                                                                                                                                   *
//*使用說明:此函數(shù)適用于RT12864-4M型液晶                                                                       *
//******************************************************************************
void Parallel_ImgDisplayCharacter(uchar x,uchar y,uchar code *img)
{
          uchar i;
        Parallel_Graph_Mode_Set(0x01);                //先關(guān)閉圖形顯示功能
    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);
}
}

回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表