×
单片机 > 单片机程序设计 > 详情

MSP430学习笔记8-ST7920 12864液晶显示并行接口

发布时间:2020-09-03 发布时间:
|

ST7920较为常见,由于自带字库使用较为方便。下面的这个程序是根据开发板上的例程做适当修改而来,总的来说较为简单,对着ST7920的DATASheet看一下时序和指令集就能明白。驱动程序如下:

#include

typedef unsigned char uchar;

typedef unsigned int  uint;


extern const unsigned char shuzi_table[];


#define LCD_DataIn    P4DIR=0x00    //数据口方向设置为输入

#define LCD_DataOut   P4DIR=0xff    //数据口方向设置为输出

#define LCD2MCU_Data  P4IN

#define MCU2LCD_Data  P4OUT

#define LCD_CMDOut    P3DIR|=0x07     //P3口的低三位设置为输出

#define LCD_RS_H      P3OUT|=BIT0      //P3.0

#define LCD_RS_L      P3OUT&=~BIT0     //P3.0

#define LCD_RW_H      P3OUT|=BIT1      //P3.1

#define LCD_RW_L      P3OUT&=~BIT1     //P3.1

#define LCD_EN_H      P3OUT|=BIT2      //P3.2

#define LCD_EN_L      P3OUT&=~BIT2     //P3.2


/*******************************************

函数名称:Delay_1ms

功    能:延时约1ms的时间

参    数:无

返回值  :无

********************************************/

void Delay_1ms(void)

{

uchar i;

    

for(i = 150;i > 0;i--)  _NOP();

/*******************************************

函数名称:Delay_Nms

功    能:延时N个1ms的时间

参    数:n--延时长度

返回值  :无

********************************************/

void Delay_Nms(uint n)

{

    uint i;

    

    for(i = n;i > 0;i--)    Delay_1ms();

}

/*******************************************

函数名称:Write_Cmd

功    能:向液晶中写控制命令

参    数:cmd--控制命令

返回值  :无

********************************************/

void Write_Cmd(uchar cmd)

{

    uchar lcdtemp = 0;

    LCD_RS_L;

    LCD_RW_H;

    LCD_DataIn;  

    do                       //判忙

    {    

        LCD_EN_H;

        _NOP();

        lcdtemp = LCD2MCU_Data; 

        LCD_EN_L;

        

    }

    while(lcdtemp & 0x80); 

    

    LCD_DataOut;    

    LCD_RW_L; 

    MCU2LCD_Data = cmd; 

    LCD_EN_H;

    _NOP();  

    LCD_EN_L;

}

/*******************************************

函数名称:Write_Data

功    能:向液晶中写显示数据

参    数:dat--显示数据

返回值  :无

********************************************/

void  Write_Data(uchar dat)

{

    uchar lcdtemp = 0;   

        

    LCD_RS_L;

    LCD_RW_H;  

    LCD_DataIn;   

    do                       //判忙

    {    

        LCD_EN_H;

        _NOP();

        lcdtemp = LCD2MCU_Data; 

        LCD_EN_L;      

    }

    while(lcdtemp & 0x80);  

    

    LCD_DataOut; 

    LCD_RS_H;

    LCD_RW_L;  

        

    MCU2LCD_Data = dat;

    LCD_EN_H;

    _NOP();

    LCD_EN_L;

}  

/*******************************************

函数名称:Ini_Lcd

功    能:初始化液晶模块

参    数:无

返回值  :无

********************************************/

void Ini_Lcd(void)

{                  

    LCD_CMDOut;    //液晶控制端口设置为输出

    

    Delay_Nms(500);

    Write_Cmd(0x30);   //基本指令集

    Delay_1ms();

    Write_Cmd(0x02);   // 地址归位

    Delay_1ms();

Write_Cmd(0x0c);   //整体显示打开,游标关闭

    Delay_1ms();

Write_Cmd(0x01);   //清除显示

    Delay_1ms();

Write_Cmd(0x06);   //游标右移

    Delay_1ms();

Write_Cmd(0x80);   //设定显示的起始地址

}

/*******************************************

函数名称:Clear_LCD

功    能:清屏

参    数:无

返回值  :无

********************************************/

void Clear_LCD(void)

{                 

    Write_Cmd(0x01);   

}

/*******************************************

函数名称:Set_XY

功    能:设置显示的位置

参    数:x--行

          y--列

返回值  :无

********************************************/

void Set_XY( uchar x, uchar y )

{  

  uchar address;

  switch (x) 

{

case 0 :  address=0x80+y;   break;

case 1 :  address=0x90+y;   break;

case 2 :  address=0x88+y;   break;

case 3 :  address=0x98+y;   break; 

default:  address=0x80+y;   break;

}

Write_Cmd(address);

}

/*******************************************

函数名称:Disp_HZ

功    能:控制液晶显示汉字

参    数:addr--显示位置的首地址

          pt--指向显示数据的指针

          num--显示字符个数

返回值  :无

********************************************/

void Disp_HZ(uchar addr,const uchar * pt,uchar num)

{

    uchar i;

    Write_Cmd(addr); 

    for(i = 0;i < (num*2);i++) 

        Write_Data(*(pt++)); 

/*******************************************

函数名称:Disp_XY

功    能:控制液晶显示汉字

参    数:addr--显示位置的首地址

          pt--指向显示数据的指针

          num--显示字符个数

返回值  :无

********************************************/

void Disp_XY(uchar x,uchar y,const uchar *pt)

{

    Set_XY(x,y);

    while (*pt)

    {

      Write_Data(*pt);

      pt++;

    }

}

/*******************************************

函数名称:Clear_GDRAM

功    能:清除液晶GDRAM中的随机数据

参    数:无

返回值  :无

********************************************/

void Clear_GDRAM(void)

{

    uchar i,j,k;

    

Write_Cmd(0x34);        //打开扩展指令集

i = 0x80;            

for(j = 0;j < 32;j++)

{

        Write_Cmd(i++);

        Write_Cmd(0x80);

  for(k = 0;k < 16;k++)

  {

      Write_Data(0x00);

  }

}

i = 0x80;

  for(j = 0;j < 32;j++)

{

      Write_Cmd(i++);

        Write_Cmd(0x88);    

  for(k = 0;k < 16;k++)

  {

        Write_Data(0x00);

    } 

}   

Write_Cmd(0x30);        //回到基本指令集

}

/*******************************************

函数名称:Draw_PM

功    能:在整个液晶屏幕上画图

参    数:无

返回值  :无

********************************************/

void Draw_PM(const uchar *ptr)

{

    uchar i,j,k;

    

Write_Cmd(0x34);        //打开扩展指令集

i = 0x80;            

for(j = 0;j < 32;j++)

{

        Write_Cmd(i++);

        Write_Cmd(0x80);

  for(k = 0;k < 16;k++)

  {

      Write_Data(*ptr++);

  }

}

i = 0x80;

  for(j = 0;j < 32;j++)

{

      Write_Cmd(i++);

        Write_Cmd(0x88);    

  for(k = 0;k < 16;k++)

  {

        Write_Data(*ptr++);

    } 

}  

    Write_Cmd(0x36);        //打开绘图显示

Write_Cmd(0x30);        //回到基本指令集

}

/*******************************************

函数名称:Draw_TX

功    能:显示一个16*16大小的图形

参    数:Yaddr--Y地址

          Xaddr--X地址

          dp--指向图形数据存放地址的指针

绘图的坐标X以字节为单位,Y以位为单位

初始坐标 0x80,0x80

绘图时需要将YX的坐标连续写入RAM,写入期间绘图必须关闭

返回值  :无

********************************************/

void Draw_TX(uchar Yaddr,uchar Xaddr,const uchar * dp) 

{

    uchar j;

    uchar k=0;

 

    Write_Cmd(0x01);  //清屏,只能清除DDRAM

    Write_Cmd(0x34);  //使用扩展指令集,关闭绘图显示

    for(j=0;j<16;j++)

    {

        Write_Cmd(Yaddr++);       //Y地址

  Write_Cmd(Xaddr);    //X地址

  Write_Data(dp[k++]);  

  Write_Data(dp[k++]);

    }

    Write_Cmd(0x36);  //打开绘图显示

    Write_Cmd(0x30);  //回到基本指令集模式

}


程序中只包含了基本的显


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM基础知识八