历史上的今天
返回首页

历史上的今天

今天是:2025年02月02日(星期日)

2020年02月02日 | MSP430学习笔记8-ST7920 12864液晶显示并行接口

2020-02-02 来源:eefocus

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);  //回到基本指令集模式

}


程序中只包含了基本的显示和画图功能,使用起来较为简单,其他的划线反白等功能也可以通过画图来实现,以后再继续研究,对应的主程序例程如下:

#include

#include "LCD12864P.h"

#include "hohai.h"

unsigned char title[]="河海大学";

unsigned char flag;

int main( void )

{

    /*下面六行程序关闭所有的IO口*/

    P1DIR = 0XFF;P1OUT = 0XFF;

    P2DIR = 0XFF;P2OUT = 0XFF;

    P3DIR = 0XFF;P3OUT = 0XFF;

    P4DIR = 0XFF;P4OUT = 0XFF;

    P5DIR = 0XFF;P5OUT = 0XFF;

    P6DIR = 0XFF;P6OUT = 0XFF;

  

    WDTCTL = WDTPW + WDTHOLD;            //关闭看门狗

    P6DIR |= BIT2;P6OUT |= BIT2;         //关闭电平转换

    

    TACTL = TASSEL_1 + MC_1;             //计数时钟ACLK, 增计数模式

    CCR0 = 32768 - 1;

    CCTL0 |= CCIE;                       //使能CCR0比较中断

    _EINT(); 

    

    Ini_Lcd();                            //显示文字

    Draw_PM(hohai);

    

    Draw_TX(0x81,0x81,speaker);

    

    flag = 0;

    while(flag < 5);                    //等待5秒钟

推荐阅读

史海拾趣

Guerrilla RF公司的发展小趣事
如果电动机驱动电路损坏,可能导致硬盘无法接收到启动信号,从而无法正常工作。
AOS公司的发展小趣事

进入20世纪,AOS公司开始将目光投向热水领域。1936年,公司研发出了著名的“金圭特护内胆”技术,这一创新在热水器行业中引起了革命性的变化。金圭内胆不仅提高了热水器的耐用性和安全性,也大幅提升了产品的能效。这一技术的推出使AOS公司迅速成为热水领域的领先者,并奠定了其在全球热水器市场的领导地位。

乾坤(Cyntec)公司的发展小趣事

随着科技的不断进步,电子行业的发展日新月异。乾坤公司意识到,要想保持领先地位,就必须不断进行技术创新。于是,公司加大了对研发团队的投入,引进了一批高水平的科研人才,并与多所高校和研究机构建立了紧密的合作关系。在一次偶然的实验中,研发团队发现了一种新型材料,可以显著提升电子元器件的性能。经过一系列严格的测试和验证,这种新材料被成功应用于产品生产中,使得乾坤的电子元器件在性能上实现了质的飞跃。这一技术创新不仅为公司带来了丰厚的利润,更让乾坤在电子行业中声名鹊起。

Clulite公司的发展小趣事
  1. 创业初期
    • 描述Clulite公司的创始人或核心团队如何识别电子行业中的某个市场机遇。
    • 讲述他们是如何筹集初始资金,设立公司,并开发出第一款产品或解决方案的。
    • 可以提及公司在初创阶段面临的挑战,如技术难题、市场竞争等。
  2. 技术创新
    • 讲述Clulite如何通过研发创新,推出了一款颠覆性的产品或技术,从而获得了市场认可。
    • 详细描述这一创新过程,包括研发团队的努力、关键技术的突破等。
    • 提及这一创新如何帮助公司在市场上取得了竞争优势。
  3. 市场拓展
    • 描述Clulite如何逐步扩大市场份额,从地区市场走向全国乃至国际市场。
    • 可以讲述公司如何建立销售网络、与合作伙伴建立合作关系,以及参与行业展会等活动来推广品牌和产品。
    • 提及公司在市场拓展过程中遇到的挑战和应对策略。
  4. 品质管理
    • 讲述Clulite如何注重产品质量和客户体验,通过严格的质量控制流程来提升产品可靠性。
    • 描述公司如何建立完善的售后服务体系,为客户提供及时、专业的支持。
    • 提及这些举措如何帮助公司赢得了客户的信任和口碑。
  5. 可持续发展
    • 讲述Clulite如何关注环境保护和社会责任,推动公司的可持续发展。
    • 描述公司如何采取环保措施,减少生产过程中的污染排放。
    • 提及公司如何参与社会公益事业,回馈社会。

请注意,这些故事需要根据Clulite公司的实际情况进行调整和补充。如果你需要更具体的内容,建议查阅Clulite公司的官方网站、新闻报道或行业分析报告,以获取更详细的信息和数据。

泰科天润(GPT)公司的发展小趣事

机顶盒,全称数字视频变换盒,是连接电视与外部信号源的重要设备,其专业性与科普性均不容忽视。从广义上讲,任何与电视机连接的网络终端设备均可视为机顶盒,它们承担着将各种信号源转换为电视可识别并播放的格式的重要任务。

机顶盒的核心功能在于接收、解码和显示。它能接收来自有线电缆、卫星天线、宽带网络及地面广播等多种传输介质的数字电视信号,并通过内置的解调器和解码器,将这些信号转换为电视能够播放的视频和音频流。这一过程中,机顶盒展现了其强大的技术实力,确保用户能够享受到高质量的视听体验。

随着技术的发展,机顶盒不断进化。从最初的模拟频道增补器、解码器,到如今支持高清、4K乃至8K超高清播放的智能网络机顶盒,机顶盒的每一次升级都带来了更加丰富的内容选择和更加便捷的使用体验。同时,网络机顶盒的出现更是将电视与互联网紧密相连,使得用户能够通过电视屏幕浏览网页、观看在线视频、下载应用程序、享受交互式娱乐等多元化服务。

此外,机顶盒还具备强大的扩展性和可定制性。通过搭载不同的软件和硬件设备,机顶盒可以满足不同用户的个性化需求,如家庭影院功能、社交媒体互动、语音控制等。这些功能的加入不仅提升了机顶盒的实用性,也使其成为了现代家庭娱乐的重要组成部分。

综上所述,机顶盒作为连接电视与外部世界的桥梁,其专业性与科普性在不断提升中。随着技术的不断进步和市场的不断扩大,机顶盒将继续为用户带来更加优质、便捷、智能的视听体验。

Elpakco Inc公司的发展小趣事

Elpakco Inc公司始终将产品质量视为企业的生命线。公司建立了严格的质量控制体系,从原材料采购到生产流程,再到产品出厂检测,每一个环节都严格把关。正是这种对品质的坚持,让Elpakco Inc的产品在市场上赢得了良好的口碑,越来越多的客户开始选择信赖Elpakco Inc的品牌。

问答坊 | AI 解惑

关于水温控制系统的问题

我现在正在做水温控制系统,要用到继电器,不知道用什么型号好, 有经验的朋友,指点一下吧,谢谢…

查看全部问答>

多少频率的开关电源能够被称作高频开关电源?

多少频率的开关电源能够被称作高频开关电源?…

查看全部问答>

自家院子,选择什么样的报警装置?

村子里,最近听说周围邻居老是让人偷。想自己安装个报警,不知道用什么的好。 请大家指点。…

查看全部问答>

如何使添加的用户成为超级用户?

我用useradd -G root -g root -d/home/arm arm添加一个arm用户, 设置环境变量后重新以arm用户登陆,为什么提示符还是$, 怎么可以变成 [arm@localhost arm]#…

查看全部问答>

运用SIM508模块上网的问题!!!谢谢各位大侠了

这是连接GPRS的AT的指令,如果我想要上www.baidu.com这个网址后面的AT指令该怎么发啊?????????????????????????????????????   at+CGCLASS=\"B\"           & ...…

查看全部问答>

wince6.0 能否 直接操作IO地址

各位:       我现在的问题如下:       我现在手上有模拟输入板卡,用的是研华的2718。准备用程序触发的轮询方式读取板卡数据。       速率要求不高,一秒读一次。过程是:程序向 ...…

查看全部问答>

给推荐几本关于485通信协议的好书

最近做关于485方面的通信设备,但第一次接触,感觉比较迷惘,希望哪位大虾给推荐几本好书,谢谢。…

查看全部问答>

求助软件mcu_ideV3.0

谁有mcu_ideV3.0,(装上去之后自带工具链,如keil c51,一共四种,就是有2KB代码限制的哪个版本) 官网上下的没有工具链,…

查看全部问答>

(急!!!)ds18b20时序问题

帮我调下ARM+DS18b20时序,我调了半天调不出来。晶振11.0592。控制器LPC2131,串口和中断不用看了。谢谢! 程序: #include \"..\\\\basescr\\\\config.h\" #include \"stdio.h\" #define DS1820_DQ 10;k--); } void DelayNl (uint32 dly) { ...…

查看全部问答>