MSP430G2553电子时钟实验

发布者:变形金刚最新更新时间:2020-04-28 来源: eefocus关键字:MSP430G2553  电子时钟  1602液晶 手机看文章 扫描二维码
随时随地手机看文章

用msp430g2553控制1602液晶显示时间,并可以通过按键设置时间,我做了正计时和倒计时两种模式


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

msp430g2553与1602引脚连接情况

* PIN1 --> 地

* PIN2 --> VCC(一定要接+5V)

* PIN3 -->仿真时悬空,实际电路 2K电阻-->地 (电阻可以是500-2k的,改变电阻可以改变字符显示的亮度,电阻接不好会导致什么都不显示)

* PIN4 --> RS --> P1.6

* PIN5 --> R/W --> GND

* PIN6 --> EN --> P1.7

* PIN7 --> D0不接

* PIN8 --> D1不接

* PIN9 --> D2不接

* PIN10 --> D3不接

* PIN11 --> D4 --> P2.4

* PIN12 --> D5 --> P2.5

* PIN13 --> D6 --> P2.6

* PIN14 --> D7 --> P2.7

* PIN15 --> VCC

* PIN16 --> 地



*msp430g2553与按键引脚连接情况


*k1-->p1.2


*k2-->p1.3


*k3-->p2.1


*k4-->p1.1


说明:本人用的时矩阵键盘,若用独立按键要接入电阻

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


代码如下:


#include

#include

#include

#define LCD_EN_PORT P1OUT    //以下2个要设为同一个口

#define LCD_EN_DDR P1DIR

#define LCD_RS_PORT P1OUT    //以下2个要设为同一个口

#define LCD_RS_DDR P1DIR

#define LCD_DATA_PORT P2OUT  //以下3个要设为同一个口

#define LCD_DATA_DDR P2DIR   //一定要用高4位

#define LCD_RS BIT6

#define LCD_EN BIT7

#define LCD_DATA    BIT7|BIT6|BIT5|BIT4 //4位数据线连接模式

//函数声明

void LCD_init(void);

void LCD_init_first(void);

void LCD_en_write1(void);  //上升沿使能

void LCD_en_write2(void);  //下降沿使能

void LCD_write_command(unsigned char command);

void LCD_write_data(unsigned char data);

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

void LCD_write_string(unsigned char X,unsigned char Y, unsigned char *s);

void LCD_write_char(unsigned char X,unsigned char Y, unsigned char data);

void display_HMS(unsigned char add,unsigned char date);

void delay_1ms(void);

void delay_nus(unsigned int n);

void delay_nms(unsigned int n);

void SetTime();

void SetMode();

void CalledByTimerA();

unsigned char LCDBuf1[]={"Hello world"};//第一行要显示的内容

unsigned char LCDBuf2[]={"10:30:00"}; //第二行要显示的内容



unsigned char shi1,fen1,miao1,aa,shi2,fen2,miao2;

unsigned char miao=0;

unsigned char fen=30;

unsigned char shi=10;



unsigned char aa=0;//计数器

int set_flag=0;//时间设置标志

int time_flag=0;//选择



void main()//主函数

{

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

  LCD_init_first();

  LCD_init();

  delay_nms(100);



 BCSCTL3 |= LFXT1S_2; // Set LFXT1为vol时钟即12kHZ       

 CCTL0|= CCIE;  //设置捕获/比较控制寄存器,CCIE=0x0010,使能捕获比较中断 

 CCR0 =182;  //设置捕获/比较寄存器,初始值为12000,对于ACLK时钟频率为12khz的频率,相当于1s 

 TA0CTL = TASSEL_1 +TACLR+MC_1;  

 

 P1DIR|=BIT0;//P1.0为led,显示按键起作用

 P1OUT|=BIT0+BIT3;//P1IN低电平跳转

 P1REN|=BIT2+BIT3+BIT1;//上拉电阻,缺了好像不能用

 P2REN|=BIT1;





  LCD_write_string(0,0,"      Mode      ");

  delay_nms(10);

  LCD_write_string(0,1,"k1(up) k2(down) ");

  SetMode();

   LCD_write_string(0,0,"                ");

  delay_nms(10);

  LCD_write_string(0,1,"                ");

  

  delay_nms(10); 

  LCD_write_string(0,0,LCDBuf1);

  delay_nms(10);

  LCD_write_string(0,1,LCDBuf2);



  _EINT();  //使能中断,这是一个C编译器支持的内部过程。 

 set_flag=0;

 while(1)

 { 

   P1OUT&=~BIT0;

    SetTime();

    P1OUT=BIT0+BIT3;

 }

}



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

K1-进入设置现在的时间。

K2-设置小时。

K3-设置分钟。

K4-确认完成设置。

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

void SetTime()

{

  if(!(P1IN&BIT2))

   {

      delay_nms(10);

     // P1OUT&=~BIT0;  

      set_flag=1;

      TA0CTL&=0xffcf;//停止模式



   }

   else if(!(P1IN&BIT3) && set_flag)

   {

          delay_nms(50);

          shi=(shi+1)%24;

          display_HMS(0x40,shi);

          LCD_write_command(0x80+0x41);

         // P1OUT&=~BIT0;

   }

   else if (!(P2IN&BIT1) && set_flag)

   {

      delay_nms(50);

      // P1OUT&=~BIT0;

       fen=(fen+1)%60;

       display_HMS(0x43,fen);

       LCD_write_command(0x80+0x44);

   }

   else if (!(P1IN&BIT1)&& set_flag)

   {

     delay_nms(10);

      TA0CTL = TASSEL_1 +TACLR+MC_1;

     //  P1OUT&=~BIT0;

       set_flag=0;

   }

   else

   {

     // P1OUT=BIT0+BIT3;

   }

 

}

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

K1-模式1,时间

K2-模式2,倒计时

K3-确定

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

void SetMode()

{

  while(1)

  {

    if(!(P1IN&BIT2))

    {

      

      time_flag=1;



    }

    else if(!(P1IN&BIT3))

    {

       time_flag=2;

    }

 

   if(time_flag!=0 &&!(P2IN&BIT1))

   {

      break;

   }

  }

  LCD_write_command(0x0c); //显示开,关光标,不闪烁

}



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

显示时分秒

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

void display_HMS(unsigned char add,unsigned char date)

{

unsigned char shi,ge;

shi=date/10;

ge=date%10;

LCD_write_command(add+0x80);

LCD_write_data(0x30+shi);

LCD_write_data(0x30+ge);

}



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

LCD1602液晶初始化函数

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

void LCD_init_first(void)     //LCD1602液晶初始化函数(热启动)

{

        delay_nms(500);

        LCD_DATA_DDR|=LCD_DATA;   //数据口方向为输出

        LCD_EN_DDR|=LCD_EN;       //设置EN方向为输出

        LCD_RS_DDR|=LCD_RS;       //设置RS方向为输出



        delay_nms(50);

        LCD_write_command(0x30);

        delay_nms(50);

        LCD_write_command(0x30);

        delay_nms(5);

        LCD_write_command(0x30);

        delay_nms(500);



}

void LCD_init(void)

{

delay_nms(500);

LCD_DATA_DDR|=LCD_DATA;   //数据口方向为输出

LCD_EN_DDR|=LCD_EN;       //设置EN方向为输出

LCD_RS_DDR|=LCD_RS;       //设置RS方向为输出



delay_nms(500);



LCD_write_command(0x28);  //4位数据接口

delay_nms(50);

LCD_write_command(0x28);  //4位数据接口

delay_nms(50);

LCD_write_command(0x28);  //4位数据接口

delay_nms(50);

LCD_en_write2();

delay_nms(50);

LCD_write_command(0x28); //4位数据接口

delay_nms(500);

LCD_write_command(0x01); //清屏

LCD_write_command(0x0c); //显示开,关光标,不闪烁

LCD_write_command(0x06); //设定输入方式,增量不移位

delay_nms(50);

}



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

 液晶使能上升沿

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

void LCD_en_write1(void)

{

    LCD_EN_PORT&=~LCD_EN;

    delay_nus(10);

    LCD_EN_PORT|=LCD_EN;

}

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

液晶使能下降沿

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

void LCD_en_write2(void)

{

   LCD_EN_PORT|=LCD_EN;

   delay_nus(10);

   LCD_EN_PORT&=~LCD_EN;

}



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

写指令函数

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

void LCD_write_command(unsigned char command)

{

   delay_nus(16);

   P2SEL=0x00;

   LCD_RS_PORT&=~LCD_RS; //RS=0

   LCD_en_write1();

   LCD_DATA_PORT&=0X0f; //清高四位

   LCD_DATA_PORT|=command&0xf0; //写高四位



  delay_nus(16);

   LCD_en_write2();

   command=command<<4; //低四位移到高四位

   LCD_en_write1();

   LCD_DATA_PORT&=0x0f; //清高四位

   LCD_DATA_PORT|=command&0xf0; //写低四位

   LCD_en_write2();

}





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

写数据函数

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

void LCD_write_data(unsigned char data)

{

   delay_nus(16);

   P2SEL=0x00;

   LCD_RS_PORT|=LCD_RS;      //RS=1

   LCD_en_write1();          //E上升沿

   LCD_DATA_PORT&=0X0f;      //清高四位

   LCD_DATA_PORT|=data&0xf0; //写高四位

   delay_nus(16);

   LCD_en_write2();

   data=data<<4;             //低四位移到高四位

   LCD_en_write1();

   LCD_DATA_PORT&=0X0f;      //清高四位

   LCD_DATA_PORT|=data&0xf0; //写低四位

   LCD_en_write2();

}



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

写地址函数

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

void LCD_set_xy( unsigned char x, unsigned char y )

{

   unsigned char address;

   if (y == 0) address = 0x80 + x;

   else address = 0xc0 + x;

   LCD_write_command( address);

}



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

LCD在任意位置写字符串,列x=0~15,行y=0,1

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

void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)

{

LCD_set_xy( X, Y ); //写地址

    while (*s)     //写显示字符

    {

      LCD_write_data( *s );

      s++;

    }

}



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

LCD在任意位置写字符,列x=0~15,行y=0,1

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

void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data)

{

   LCD_set_xy( X, Y ); //写地址

   LCD_write_data( data);

}



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

1us延时函数

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

void delay_1us(void)

{

   asm("nop");

}



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

[1] [2]
关键字:MSP430G2553  电子时钟  1602液晶 引用地址:MSP430G2553电子时钟实验

上一篇:MSP430熔丝及加密总结
下一篇:MSP430G2553的时钟设置简析

推荐阅读最新更新时间:2024-11-12 09:23

【自学51单片机】12 --- 1602液晶初步认识
1、1602液晶硬件接口介绍 1602液晶技术参数 说明:(1) 工作电流:在5v工作电压下液晶的工作电流为2mA,仅仅指液晶,不包括背光。 1602液晶接口原理图及引脚功能 说明:(1) 引脚3:液晶显示偏压信号。用来调整显示黑点与不显示黑点的对比度。(2) 4引脚:数据命令选择引脚。置高电平1,为读写数据,置低电平0,为读写命令。(3) 5引脚:读写选择引脚。置高电平1,为读数据或命令,置低电平0,为写数据或命令。(4) 6引脚:使能信号引脚。高电平有效,低电平无效。(5) 7~14引脚:8个数据引脚。因为总电流不大,直接接到PO口上,不用通过74HC245。 2、1602的读写时序介绍 液晶内部自带80
[单片机]
【自学51单片机】12 --- <font color='red'>1602</font><font color='red'>液晶</font>初步认识
详细解读:MSP430G2553单片机串口通信
  MSP430的不同型号,其串行通讯工作模式是一样的。以MSP430G2553为例进行说明。MSP430G2553是20个引脚的16位单片机。具有内置的16位定时器、16k的FLASH和512B的RAM,以及一个通用型模拟比较器以及采用通用串行通信接口的内置通信能力。此外还具有一个10位的模数(A/D)转换器。这里我们详细说明MSP430G2553串口通信。其引脚排布如图1.1所示。其功能表如表1.1所示。   串行通讯模块主要由三个部分组成:波特率生成部分、发送控制器以及接收控制器。如图1.2所示。            一、UART模式   在异步模式下,接收器自身实现帧的同步,外部的通讯设备并不使用这一时钟
[单片机]
详细解读:<font color='red'>MSP430G2553</font>单片机串口通信
1602液晶介绍
前边我们讲的流水灯、数码管、LED 点阵这三种都是 LED 设备,这节课我们来学习一下 LCD 显示设备——1602 液晶。那个大大的,平时第一行显示 16 个小黑块,第二行什么都不显示的东西就是 1602 液晶,是不是早就注意到它了呢? 大家学习这些电子器件,头脑中要逐渐形成一种意识,不管是我们的单片机,还是74HC138,甚至三极管等等,都是有数据手册的。不管是设计电路还是编写程序,器件的数据手册是我们最好的参考资料,那我们今天来学习 1602,首先就要看它的数据手册。手册大家可以在网上找到,这里我讲的时候只挑手册的重点讲。 首先我们来看一个主要技术参数表格,如表 12-3 所示。 表 12-3 1602 液晶主要技术参数
[单片机]
<font color='red'>1602</font><font color='red'>液晶</font>介绍
51单片机教程(七):LCD1602液晶显示模块
一、原理简介 液晶显示模块具有体积小、功耗低、显示内容丰富、超薄轻巧等优点,在嵌入式应用系统中得到越来越广泛的应用,这讲中向大家介绍的LCD1602 液晶显示模块(其内部控制器为HD44780 芯片),它可以显示两行,每行16 个字符,因此可相当于32 个LED数码管,而且比数码管显示的信息还多。采用单+5V 电源供电,外围电路配置简单,价格便宜,具有很高的性价比。 LCD1602 外观如图1(a) 所示。1602 字符型LCD 模块的管脚分布如图1(b) 所示, 其管脚各功能如表1 所示。 图1 (a) LCD1602外观图 (b) LCD1602管脚分布图 值得提出的是,各种液晶厂家均有提供几乎都是同样规格的160
[单片机]
51单片机教程(七):LCD<font color='red'>1602</font><font color='red'>液晶</font>显示模块
关于51单片机电子时钟精度的问题
前几天用STC89C52单片机制作了一个电子时钟,经过一段时间的实验,发现时间精度存在误差,一分钟慢4秒左右。 这可了不得,十分钟就要慢40秒,一天下来不得慢半96分钟!!! 这个单片机晶振频率为11.0592mhz,和大部分时钟的晶振频率相同,应该没有问题。 后天考虑到源代码: 在定时器中断函数里: void t0(void) interrupt 1 using 0 { tcount++; if(tcount==4000) {tcount=0; second++; if(second==60) {second=0; minute++; if(minute==60) {minute=0;
[单片机]
7219芯片驱动LED的电子时钟
/***************时钟采用定时中断方式,50MS一次******完整可用,硬件实验通过**********************/ #include REG51.H #include stdio.h #include intrins.h /***********************************************************************/ #define uchar unsigned char #define uint unsigned int //common part #define HIGH 1 #define LOW 0 #define
[单片机]
基于msp430G2553的低频方波频率、占空比、峰峰值测量函数
使用的平台是TI公司的launch pad,频率和占空比已经实现,峰峰值还有有待改进 1、主函数部分: /********************************************* * _ooOoo_ * * o8888888o * * 88 . 88 * * (| -_- |) * * O = /O * * ____/`---'____ * * .' \| |// `. * *
[单片机]
msp430G2553定时器中断控制LED每秒进行亮熄变化
/////////////////////////////////////////////////////////////////// // msp430G2553的定时器中断控制LED每秒钟进行亮熄变化 /////////////////////////////////////////////////////////////////// #include "msp430G2553.h" void led_init(); void timer_init(); void delay(int); //---------------------------------- void led_init() { P1DIR
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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