LCD1602动态显示--基于MSP430F149单片机

发布者:落霞与孤鹜最新更新时间:2020-02-24 来源: eefocus关键字:LCD1602  动态显示  MSP430F149  单片机 手机看文章 扫描二维码
随时随地手机看文章

main.c


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

程序功能:动态显示文字“welcome!”

----------------------------------------------------

测试说明:观察液晶显示

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

#include 

#include  "Cry1602.h"

#define uchar unsigned char

uchar *s1 = "welcome!";


void main( void )

{

    uchar i;

    WDTCTL = WDT_ADLY_250;               //间隔定时器,定时16ms


    LcdReset();

    DispStr(4,0,s1);

    LocateXY(0,9);                      //确定写入字符的显示位置

    LcdWriteCommand(0x07, 1);           //整体显示左移

    for(i = 12; i > 0; i--) 

    {

        LcdWriteData(0x20);

        //延时250ms

        IFG1 &= ~WDTIFG;

        while(!(IFG1 & WDTIFG));

        IFG1 &= ~WDTIFG; 

    }

    while(1)

    {

        LcdWriteCommand(0x05, 1);           //整体显示右移


        for(i = 24; i > 0; i--)  

        {

            LcdWriteData(0x20);

            //延时250ms

            IFG1 &= ~WDTIFG;

            while(!(IFG1 & WDTIFG));

            IFG1 &= ~WDTIFG; 

        }



        LcdWriteCommand(0x07, 1);           //整体显示左移


        for(i = 24; i > 0; i--)

        {

            LcdWriteData(0x20);

            //延时250ms

            IFG1 &= ~WDTIFG;

            while(!(IFG1 & WDTIFG));

            IFG1 &= ~WDTIFG; 

        }

    }    

}


cry1602.h


void DispStr(unsigned char x,unsigned char y,unsigned char *ptr);

void DispNChar(unsigned char x,unsigned char y, unsigned char n,unsigned char *ptr);

void LocateXY(unsigned char x,unsigned char y);

void Disp1Char(unsigned char x,unsigned char y,unsigned char data);

void LcdReset(void);

void LcdWriteCommand(unsigned char cmd,unsigned char chk);

void LcdWriteData( unsigned char data );

void WaitForEnable(void);

void Delay5ms(void);


cry1602.c


#include

#include "cry1602.h"

typedef unsigned char uchar;

typedef unsigned int  uint;


/**************宏定义***************/

#define DataDir     P4DIR

#define DataPort    P4OUT               

#define Busy        0x80

#define CtrlDir     P3DIR

#define CLR_RS P3OUT&=~BIT0;    //RS = P3.0    

#define SET_RS P3OUT|=BIT0; 

#define CLR_RW P3OUT&=~BIT1;   //RW = P3.1

#define SET_RW P3OUT|=BIT1; 

#define CLR_EN P3OUT&=~BIT2;   //EN = P3.2 

#define SET_EN P3OUT|=BIT2; 

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

函数名称:DispStr

功    能:让液晶从某个位置起连续显示一个字符串

参    数:x--位置的列坐标

          y--位置的行坐标

          ptr--指向字符串存放位置的指针

返回值  :无

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

void DispStr(uchar x,uchar y,uchar *ptr) 

{

    uchar *temp;

    uchar i,n = 0;


    temp = ptr;

    while(*ptr++ != '')   n++;    //计算字符串有效字符的个数


    for (i=0;i    {

        Disp1Char(x++,y,temp[i]);

        if (x == 0x0f)

        {

           x  = 0; 

           y ^= 1;

        }

    }

}

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

函数名称:DispNchar

功    能:让液晶从某个位置起连续显示N个字符

参    数:x--位置的列坐标

          y--位置的行坐标

          n--字符个数

          ptr--指向字符存放位置的指针

返回值  :无

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

void DispNChar(uchar x,uchar y, uchar n,uchar *ptr) 

{

    uchar i;


    for (i=0;i    {

        Disp1Char(x++,y,ptr[i]);

        if (x == 0x0f)

        {

           x = 0; 

        y ^= 1;

        }

    }

}

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

函数名称:LocateXY

功    能:向液晶输入显示字符位置的坐标信息

参    数:x--位置的列坐标

          y--位置的行坐标

返回值  :无

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

void LocateXY(uchar x,uchar y) 

{

    uchar temp;


    temp = x&0x0f;

    y &= 0x01;

    if(y)   temp |= 0x40;  //如果在第2行

    temp |= 0x80;


    LcdWriteCommand(temp,1);

}

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

函数名称:Disp1Char

功    能:在某个位置显示一个字符

参    数:x--位置的列坐标

          y--位置的行坐标

          data--显示的字符数据

返回值  :无

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

void Disp1Char(uchar x,uchar y,uchar data) 

{

    LocateXY( x, y );           

    LcdWriteData( data );       

}

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

函数名称:LcdReset

功    能:对1602液晶模块进行复位操作

参    数:无

返回值  :无

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

void LcdReset(void) 

{

    CtrlDir |= 0x07;                 //控制线端口设为输出状态 

    DataDir  = 0xFF;                 //数据端口设为输出状态


    LcdWriteCommand(0x38, 0);       //规定的复位操作

    Delay5ms();

    LcdWriteCommand(0x38, 0);       

    Delay5ms();

    LcdWriteCommand(0x38, 0);

    Delay5ms();


    LcdWriteCommand(0x38, 1);       //显示模式设置

    LcdWriteCommand(0x08, 1);       //显示关闭

    LcdWriteCommand(0x01, 1);       //显示清屏

    LcdWriteCommand(0x06, 1);       //写字符时整体不移动

    LcdWriteCommand(0x0c, 1);       //显示开,不开游标,不闪烁

}

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

函数名称:LcdWriteCommand

功    能:向液晶模块写入命令

参    数:cmd--命令,

          chk--是否判忙的标志,1:判忙,0:不判

返回值  :无

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

void LcdWriteCommand(uchar cmd,uchar chk) 

{


    if (chk) WaitForEnable();   // 检测忙信号?


    CLR_RS; 

    CLR_RW; 

    _NOP();


    DataPort = cmd;             //将命令字写入数据端口 

    _NOP();                 


    SET_EN;                     //产生使能脉冲信号

    _NOP();

    _NOP();

    CLR_EN;         

}


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

函数名称:LcdWriteData

功    能:向液晶显示的当前地址写入显示数据

参    数:data--显示字符数据

返回值  :无

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

void LcdWriteData( uchar data ) 

{

    WaitForEnable();        //等待液晶不忙


    SET_RS;

    CLR_RW; 

    _NOP();


    DataPort = data;        //将显示数据写入数据端口

    _NOP();


    SET_EN;                 //产生使能脉冲信号

    _NOP(); 

    _NOP(); 

    CLR_EN;     

}

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

函数名称:WaitForEnable

功    能:等待1602液晶完成内部操作

参    数:无

返回值  :无

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

void WaitForEnable(void) 

{

    P4DIR &= 0x00;  //将P4口切换为输入状态


    CLR_RS;

    SET_RW;

    _NOP();

    SET_EN; 

    _NOP();

    _NOP();


    while((P4IN & Busy)!=0);  //检测忙标志


    CLR_EN;


    P4DIR |= 0xFF;  //将P4口切换为输出状态

}   


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

函数名称:Delay5ms

功    能:延时约5ms

参    数:无

返回值  :无

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

void Delay5ms(void)

    uint i=40000;

    while (i != 0)

    {

        i--;

    }

}

关键字:LCD1602  动态显示  MSP430F149  单片机 引用地址:LCD1602动态显示--基于MSP430F149单片机

上一篇:MSP430F5529与LCD1602显示模块(上)
下一篇:初步学习MSP430——跑马灯

推荐阅读最新更新时间:2024-11-21 23:05

STC12C2052AD单片机AD转换C语言程序的实现
功能:STC12C2052AD AD转换C程序 +PWM输出功能 成功使用。 应用:AD检测电压进行过欠压保护(继电器控制)+PWM把直流电压斩波成脉动直流。 板子功能:给手机电池充电。 降压用的LM317,小电流应用应该够了。没时间去买开关管,就用的9013开关。 图纸: //以下是成功了的程序。如果你需要应用在你自己的项目中,您只需要更改io就能直接应用了 //程序的完整版本下载地址:http://www.51hei.com/ziliao/file/stc12c2052adde.rar #include stc12c2052ad.h //stc 单片机 专用的头文件 #include int
[单片机]
STC12C2052AD<font color='red'>单片机</font>AD转换C语言程序的实现
基于51单片机的无线心电监护系统设计
随着经济的快速发展和人们生活水平的不断提高,健康已成为人们关注的焦点。心脏疾病是危害人类健康的一大杀手,其偶然性与突发性的特点使得心电监护系统具有重要的临床应用价值。由于传统的心电监护仪不能进行远距离的实时监护,所以便携式无线心电监护系统显得更加重要。无线医疗监护系统主要由生理信息与数据采集、无线数据通信、控制和显示等单元组成。目前国内已有用于临床的无线心电监护产品,但其采用的方案大都是“采集器+发送器(PDA或手机)”,从成本上看其价格昂贵;从无线传输方面看,大多是将心电数据以模拟信号传输,这必然导致信号在传输过程中发生失真。此外,由于人体电阻差异导致心电信号在1~10 mV之间变动,固定放大倍数系统缺乏适应性。 基于此,这里提
[单片机]
基于51<font color='red'>单片机</font>的无线心电监护系统设计
51单片机串口程序,字符串/16进制发送与接收
这篇文章将说明51串口通信的发送与接收。分为:单个字符接收,字符串接收;十进制发送与接收,十六进制发送与接收。 字符串发送与十六进制发送,参考:http://blog.csdn.net/yibu_refresh/article/details/22695063 程序皆由PC串口工具发送,由单片机接收,并返回接收值给PC机。 一:单个字符的发送与接收 #include reg52.h #define uint unsigned int #define uchar unsigned char //定义接收 字符 uchar Buffer; //串口初始化函数 void URATinit( ) { TMOD=0x20; S
[单片机]
51<font color='red'>单片机</font>串口程序,字符串/16进制发送与接收
初学单片机时总结的想法及一些程序
一、单片机编程总结 1、要养成总结的好习惯,总结不仅是对自己学习的一个总结,还是对学习过程的一个回顾与加深,还可避免第二次犯错。 2、编写程序之前先要有一个对该项目熟悉的了解,做到心中有数,列一个大致框架。仔细推敲该怎么布局,怎样布局最合理,该步骤很重要。要分析先做哪个模块,具体到该模块的具体步骤,各个函数怎么命名,与其他模块的衔接等。最好拿张纸记下重要过程。 3、对于c语言的模块化编程,要先分好各个模块,一个模块一个模块的编程,确定一个顺序,按顺序来,该模块成功之后再编写下一个。对于头文件,当该模块编写好之后再编写该模块的头文件。 4、出现警告不要忽视,说明该程序一定有不合理之处,要弄清其来源,找到解决办法。找来
[单片机]
51单片机:6位数码管动态显示,从600000开始,每0.5秒加1
原理图 ##//源码 #include reg52.h #include stdlib.h #define uint unsigned long #define uchar unsigned char sbit N1 = P1^0; sbit N2 = P1^1; sbit N3 = P1^2; sbit N4 = P1^3; sbit N5 = P1^4; sbit N6 = P1^5; uchar code table ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uint num; int a,t1=0; void delayms(uint
[单片机]
51<font color='red'>单片机</font>:6位数码管<font color='red'>动态显示</font>,从600000开始,每0.5秒加1
二进制数转换为BCD码(义隆单片机)
本例为单字节 二进制 数(0X20)转换为非压缩BCD 码,存在0X25,0X24,0X23 中,0X25 为百位,0X23 为个位。 main: MOV a,@0xa4 ;赋值 MOV 0x20,a MOV 0x21,a MOV 0x22,a MOV a,@0x0 ;0x23,0x24,0x25 单元清0 MOV 0x23,a MOV 0x24,a MOV 0x25,a MOV a,@0x64 ;对100 的个数计数 MOV 0x26,a MOV a,@0x25 ;百位存在0x25 中 MOV 0x04,a call a0 ;调计数子程 MOV a,@0x0a ;对10 的个数计数 MOV 0x26,a dec 0x04 ;个位
[单片机]
瞬态电磁脉冲对单片机的辐照效应实验及加固方法
静电放电产生的电磁辐射可产生很强的瞬态电磁脉冲(ESD EMP)。随着电子技术的高速发展,ESD EMP的危害也日趋严重。ESD EMP具有峰值大、频带宽等特点,作为近场危害源,对各种数字化设备的危害程序可与核电磁脉冲(NEMP)及雷电电磁脉冲(LEMP)相提并论 。因此,研究ESD EMP对电子系统的各种效应及防护方法已成为静电防护中的一个热点问题。笔者以单片机系统为实验对象,进行了ESD EMP对单片机系统的辐照效应实验,并在实验的基础上研究了ESD EMP的防护和加固方法。 1 实验配置及方法 1.1 实验配置 实验配置如图1所示。它主要由台式静电放电抗扰性实验标准装置、静电放电模拟器和数据采集系统组成。 根
[单片机]
GD32 MCU的选项字节是什么?
GD32 MCU的选项字节是什么,有什么功能呢?选项字节被误篡改如何回复? 读者朋友们是否会有以上的疑问,首先我们先为大家介绍选项字节是什么以及选项字节的功能。 以GD32F30X系列MCU为例,其选项字节说明如下表所示,该选项字节共16个字节,用于芯片内部配置。具体说明如下:SPC为读保护控制位,可以设置芯片读保护;SPCN为SPC补字节,不需要配置;USER为用户配置字节,可以配置芯片从BANK0还是BANK1启动,配置低功耗模式唤醒后继续进入低功耗模式还是复位,配置是否使能硬件独立看门狗(硬件看门狗使能后,芯片上电后会自动打开看门狗,如果读者有发现芯片看门狗复位,且软件上没有打开看门狗,就可以排查下看是否该控制位被打开,
[单片机]
GD32 <font color='red'>MCU</font>的选项字节是什么?
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved