用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 <msp430g2253.h>

#include <intrinsics.h>

#include <msp430.h>

#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");

}





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

N us延时函数

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

void delay_nus(unsigned int n)

{

   unsigned int i;

  for (i=0;i<n;i++)

   delay_1us();

}





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

1ms延时函数

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

void delay_1ms(void)

{

   unsigned int i;

   for (i=0;i<1140;i++);

}





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

N ms延时函数

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

void delay_nms(unsigned int n)

{

   unsigned int i=0;

   for (i=0;i<n;i++)

   delay_1ms();

}





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

 中断响应函数 模式一

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

void CalledByTimerA()

{  

   if(aa>=60)//一秒到了

   { 

     aa=0;//清0

     miao++; 

   }

   if(miao>=60)//一分了

   { 

     miao=0;

     fen++; 

   }

   if(fen>=60)

   { 

     fen=0;

     shi++;

     LCD_write_command(0x80+0x45);//在分秒之间显示":"

     LCD_write_data(':') ;

   }

   if(shi>=24)

   {

    shi=0;

    display_HMS(0x43,shi);

    LCD_write_command(0x80+0x42);//在时分之间显示":"

    LCD_write_data(':') ; 

   }





   display_HMS(0x46,miao);

   display_HMS(0x43,fen);

   display_HMS(0x40,shi);





  LCD_write_command(0x87);

  LCD_write_command(0x84);





}

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

 中断响应函数 模式二

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

void CalledByTimerAForCountDown()







  if(aa>=60)

  {

      aa=0;

      if(miao<=0)

      {

        if(fen<=0)

       {

           if(shi<=0)

           {

          

           }

           else

           {

              shi--;

              fen=59;

              miao=59;

            }

       }

       else

       {

        fen--;

        miao=59;

        }

      }

         else

        {

           miao--;

        }

        

    

    LCD_write_command(0x80+0x45);//在分秒之间显示":"

    LCD_write_data(':') ;

 

    LCD_write_command(0x80+0x42);//在时分之间显示":"

    LCD_write_data(':') ; 









   display_HMS(0x46,miao);

   display_HMS(0x43,fen);

   display_HMS(0x40,shi);





    LCD_write_command(0x87);

    LCD_write_command(0x84);

    

   }

 

}

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

定时器中断

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

#pragma vector=TIMER0_A0_VECTOR

__interrupt void Timer_A(void)

{

 aa++;

 if(time_flag==1)

 {

  CalledByTimerA();

 }

 else if(time_flag==2)

 {

   CalledByTimerAForCountDown();

 }

 

}

MSP430G2553电子时钟实验的更多相关文章

  1. [TPYBoard-Micropython之会python就能做硬件 3] 制作电子时钟

    转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 一.本次实验所需器材 1.TPYboard V102板  一块 2.DS3231 ...

  2. 3分钟利用TurnipBit制作电子时钟

    转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 TurnipBit(www.turnipbit.com)是一个面向青少年的开发板 ...

  3. Micropython TurnipBit 电子时钟 青少年编程入门

    电子时钟是一个很常用但是制作非常简单的小玩具了,对于Micropython初学者来说,制作一个电子时钟是非常简单又容易检验自己学习成果的实验了.TurnipBit相比于其他开发板,制作电子时钟就更加简 ...

  4. JavaScript电子时钟+倒计时

    JavaScript时间类      获取时分秒:          getHours()          getMinutes();          getSeconds();       获取 ...

  5. JS实现电子时钟

          目前有个小项目,在首页头部导航栏里需要一个电子时钟的效果,于是我就采用如下代码实现了一个电子时钟的效果.不过不完美,第一种方式容易导致网页莫名其妙的异常,后来觉得可能是做的操作太多了,然后 ...

  6. 桌面小部件----LED电子时钟实现

    桌面控件是通过 Broadcast 的形式来进行控制的,因此每个桌面控件都对应于一个BroadcastReceiver.为了简化桌面控件的开发,Android 系统提供了一个 AppWidgetPro ...

  7. Qt - 与众不同的电子时钟

     Qt的电子时钟是个老掉牙的demo了,但是利用lcdNumber显示的样子非常老土(下图第一个显示效果),一看就知道是从qt帮助文档里摘出来的example,毫无新意. 美化一下系统时钟,抛开固有控 ...

  8. MFC桌面电子时钟的设计与实现

    目录 核心技术 需求分析 程序设计 程序展示 (一)核心技术 MFC(Micosoft Foundation Class Libay,微基础类库)是微基于Windows平台下的C++类库集合,MFC包 ...

  9. 公开课 之 tony 电子时钟 (课堂笔记)

    # tony 之电子时钟from PyQt5.QtWidgets import QApplication, QWidget, QLCDNumber, QDesktopWidget, QVBoxLayo ...

随机推荐

  1. (转)Unity3D 开发优秀技术资源汇总

    原文:http://www.j2megame.com/html/xwzx/ty/3179.html Unity3D 博客 http://www.dapp.com.br/  by Dapp http:/ ...

  2. gedit插件配置

    Ubuntu用户 sudo apt-get install gedit-plugins Fedora用户 yum install gedit-plugins 使用gEdit搭配terminal来写程序 ...

  3. How to create an IPA (Xcode 5)

    This tutorial will walk you through the easiest way to generate an IPA using Xcode 5. We will be usi ...

  4. react数组key的唯一性

    1.不要使用数组的index索引作为key 2.在相邻的元素间,一定确保key的唯一性,如果出现了相同的 key,会抛出一个 Warning,告诉相邻组件间有重复的 key 值.并且只会渲染第一个重复 ...

  5. 15个最受欢迎的Python开源框架(转载)

    一.Django: Python Web应用开发框架 Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的软件设计模式,即模型M,视图V和控制器C.它最初是被开发来用于管理 ...

  6. 使用websocket进行消息推送服务

    Websocket主要做消息推送,简单,轻巧,比comet好用 入门了解:https://www.cnblogs.com/xdp-gacl/p/5193279.html /** * A Web Soc ...

  7. python对文件写操作报错UnicodeEncodeError

    2017-04-25 python连mongodb数据库并将提取部分数据写入本地文件时,出现UnicodeEncodeError. 解决方法:指定文件字符集为utf-8,在文件头部加入以下代码 imp ...

  8. 【LeetCode-面试算法经典-Java实现】【109-Convert Sorted List to Binary Search Tree(排序链表转换成二叉排序树)】

    [109-Convert Sorted List to Binary Search Tree(排序链表转换成二叉排序树)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 ...

  9. idea 热部署

  10. Rails中nil? empty? blank? present?的区别

    .nil? Ruby方法 .nil?方法被放置在Object类中,可以被任何对象调用,如果是nil则返回true 在Rails中只有nil对象才会返回true nil.nil? #=> true ...