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

发布者:创新火花最新更新时间:2018-07-11 来源: 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);

1

2

3

4

5

6

7

8

9

10

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++ != '\0')   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单片机

上一篇:NRF24L01实现msp430单片机通信(SPI)
下一篇:单片机MSP430 - 定时器Timer_A

推荐阅读最新更新时间:2024-03-16 16:08

MSP430F149的ADC12模块
1 概述 MSP430F149的ADC12为SAR型12位AD,共有16路输入通道,其中8路独立的外部输入通道,2路接外部Vref+,Vref-,3路内部通道可分别测内部温度传感器、AVCC、和外部参考源。 P6口第二功能为AD输入端。MSP430F149的10、11分别接外部电压参考源正负极,7脚可将内部电压参考源输出。 ADC12共有18个中断源,公用一个中断向量ADC12_VECTOR。 AD的参考源可选择内部电压参考源或外部电压参考源。内部电压参考源有1.5V,2.5V可选,使用时向ADC12CTL0写入REFON+ REF2_5V就打开了2.5V。外部电压参考源由REF+接入。上电时若不设置参考源,则参考
[单片机]
51单片机实现数码管动态显示60~0
硬件电路原理图 元件清单 C语言程序 #include reg51.h unsigned char table ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管字符码 void show(unsigned char n); void delay(unsigned int k); void main() { unsigned char i; int j; while(1) { for(i=60;j=60,i 0;i--) while(j--) show(i); } } void show(unsigned char n) { P0=table ; P1
[单片机]
51单片机实现数码管<font color='red'>动态显示</font>60~0
1602液晶动态显示
学了一段时间的51单片机,自己编了一些简单的程序,实现了一些比较简单的功能,我会把这些程序在后面几篇博客中贴上,供需要的人参考。 这些程序都是我调试好的,都能正常使用只是可能有些功能我没有写完,不过我都加了注释提醒,也比较简单,有时间的话,我会补全的。 有些地方写的不妥或不简洁,是因为能力所致,知识欠缺,现在正在恶补 下面的程序是控制1602液晶上下两行分别显示JUST DO IT !和DO YOUR BEST!两句话,并整屏左右移动三次,最后静态显示出来 #include reg52.h #define uchar unsigned char #define uint unsigned int uchar c
[单片机]
基于80C51单片机的LED动态显示实例
  单片机80c51接线图如图1所示。图1中,4位显示管用共阳极。运用动态显示,采用循环导通或循环截止各位显示器的做法。当循环显示时间间隔较小时,由于人眼的暂留特性,就将看不出数码管的闪烁现象。    图1 单片机80c51接线图   控制系统设计   程序框图    图2 程序框图   程序清单   程序写入80c51芯片,如下   #include   /*---------------------定义变量----------------------------------*/   sbit p1_0=P1^0;   sbit p1_1=P1^1;   sbit p1_2=P1^2;   sbit p
[单片机]
基于80C51单片机的LED<font color='red'>动态显示</font>实例
51单片机lcd1602
{ Uchar i; for (i=0;i 16;i++) { DispOneChar(i,1,dd++); dd &= 0x7f; if (dd 32) dd=32; } } // 显示光标定位 void LocateXY( char posx,char posy) { Uchar temp; temp = posx & 0xf; posy &= 0x1; if ( posy )temp |= 0x40; temp |= 0x80; LcdWriteCommand(temp,0); } // 按指定位置显示数出一个字符 void DispOneChar(Uchar x,Uchar y,Uchar Wd
[单片机]
51单片机LCD1602两行移动显示
第一行:My name is Eagal 第二行:Music film Games #include reg52.h #define uchar unsigned char #define uint unsigned int sbit lcden=P3^4; sbit rs=P3^5; sbit rw=P3^6; sbit dula=P2^6; sbit wela=P2^7; uchar table1 = My name is Eagal ; uchar table2 = Music Flim Games ; void delay(uint x) { uint a,b; for(a=x;a 0;a--) f
[单片机]
51单片机小白零基础教程——数码管的动态显示
数码管的动态显示 数码管的动态显示:数码管的动态显示又叫做数码管的动态扫描。动态显示的特点是:将所有位数码管段选线并联在一起,,由位选控制是哪一位数码管有效。所谓动态扫描显示即轮流向各位数码管送出字型码和相应的位选,利用发光管的余晖和人眼视觉暂留作用,使人感觉好像各位数码管同时都在显示,而实际上多位数码管是一位一位轮流显示的,只是轮流的速度比较快,人眼已经无法分辨出来。 关于数码管以及74HC573锁存器的分析放在这,有详细的分析过程,请自行查看https://blog.csdn.net/chrisbum/article/details/115583779?spm=1001.2014.3001.5502 设计要求:在实验板
[单片机]
51单片机小白零基础教程——数码管的<font color='red'>动态显示</font>
89C52与LCD1602
这两天看了下C51的资料,熟悉一下语句,51的资源都还没看,就急着写了个这程序 ,很生硬的,总算是LCD1602工作并显示起来了, 难点1:时序,难点2:LCD1602的11条指令; 时序对了,LCD1602基本上就能显示了:(LCD1602的老是忙等待,所以把忙等待改成10MS延时程序了); 下面是程序: //------------------------------------------- #include reg52.h #include intrins.h #define dataport P0 #define uchar unsigned char #define uint unsigned int //
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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