当前位置:文档之家› 基于MSP430时钟程序(详细版)

基于MSP430时钟程序(详细版)

//****************************************/*基于msp430写的简易时钟程序,1602显示,可实现时间初始值设定,按键调整时间,时分秒走时等。

因为初学430,故而写个时钟熟悉一下各个模块,年月日等只用了静态数组显示,下次再用时钟芯片写个正式版,与大家分享,共同学习!*///*******************************************#include <msp430x14x.h>#include "lcd1602.h"#include "key.h"#define uint unsigned int#define uchar unsigned charuchar miaoflag=1;uchar fenflag=0;uchar shiflag=0;unsigned char table0[]="DYS-2013-08-03";//*****************定时器A初始化**************************void Timer_A_init(){TACTL=TASSEL0+TACLR;//设置定时器A控制寄存器,TASSEL0为选择辅助时钟aclk//TACLR为清除定时器A计数器CCTL0=CCIE; //设置捕获/比较控制寄存器;CCIE使能捕获比较中断CCR0=16384*2; //设置捕获/比较寄存器,初始值为16384,对于32768hz的频率来说,即为0.5s;TACTL |=MC0; //使记计模式为增模式;_EINT(); //使能中断,这是一个c编译器所支持的内部过程;}//***********************设定初始时间****************************void timeset_init()//初试时间设定11:11:11{miaoflag=11;fenflag=11;shiflag=11;}//*****************判断按键是否按下******************void anjian(void){while(1){//keyflag=0;delay2();if((P3IN&0x30)&&((P3IN&0x30)!=48)){delay2();if((P3IN&0x30)&&((P3IN&0x30)!=48)){switch(P3IN&0x30){case 16: fenflag++;//这部分可酌情添加按键以实现加减时分秒等break;case 32: shiflag++;break;default :break;}}}}}//******************主函数***************************************void main(){uchar flag;// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;lcd1602_init();Timer_A_init();key_init();display2(0x80,table0);timeset_init();anjian();}//********************中断函数*******************************#pragma vector=TIMERA0_VECTOR //430中断表达形式;__interrupt void Timer_A(void){uchar miaoge,miaoshi,fenge,fenshi,shishi,shige;miaoge=miaoflag%10+0x30;miaoshi=miaoflag/10+0x30;fenge=fenflag%10+0x30;fenshi=fenflag/10+0x30;shige=shiflag%10+0x30;shishi=shiflag/10+0x30;DisplayOneChar(7,1,miaoshi);DisplayOneChar(8,1,miaoge);DisplayOneChar(6,1,':');DisplayOneChar(5,1,fenge);DisplayOneChar(4,1,fenshi);DisplayOneChar(3,1,':');DisplayOneChar(2,1,shige);DisplayOneChar(1,1,shishi);miaoflag++;if(miaoflag==60){miaoflag=0;fenflag++;}if(fenflag==60){fenflag=0;shiflag++;}}//***************************************************8附录上述用到的几个自己写的头文件//key.h头文件#include <msp430x14x.h>#define uint unsigned int#define uchar unsigned charuchar keyflag;/*******************************************函数名称:delay功能:用于消抖的延时参数:无返回值:无********************************************/void delay2(void){uint tmp;for(tmp = 12000;tmp > 0;tmp--);}//*******************************void key_init(){P3DIR &=~(BIT5+BIT4);//按键P3.5、P3.4}//*************************************************//1602.h头文件//MSP430写的1602液晶显示程序2010-07-11 01:08//硬件连接P2 数据口P6.5---E P6.4---RW P6.3----RS#include"msp430x14x.h"#define uint unsigned int#define rw(x) P3OUT=(P3OUT&(~BIT6))|(x?BIT6:0);#define uchar unsigned char//**************延时***********************************void delay(uint z){uint t,y;for(t=z;t>0;t--)for(y=110;y>0;y--);}//*******写命令*****************************************void write_com(unsigned char com){P6OUT&=~BIT3;//作为RS选择端低电平有效rw(0);P2OUT=com;delay(1);P6OUT|=BIT5;delay(5);P6OUT&=~BIT5;}//*******写数据*************************************************** void write_data(unsigned char date){P6OUT|=BIT3;//作为RS选择端高电平有效劳rw(0);P2OUT=date;delay(1);P6OUT|=BIT5;//作为E选择端=1;delay(5);P6OUT&=~BIT5;}//********初始化******************************************void lcd1602_init(){P6DIR=0xff;//P3输出作控制口P6SEL=0;P6OUT=0x00;P6OUT&=~BIT5;//EP6OUT&=~BIT3;//RSP2DIR=0XFF;//P4输出作数据口//P2SEL=0; //P2OUT=0X00;write_com(0x38);//显示模式设置write_com(0x0c);//开显示,不显光标write_com(0x06);//数据地址指针write_com(0x01);//清屏_BIS_SR(GIE);//两个开总中断的方法随便用哪一个// _EINT();}//***************数组静态显示********************************** void display2(unsigned char x,unsigned char *p){unsigned char y=0; //y要给其初值0否则出乱码write_com(x);while(p[y]!=0x00){write_data(p[y]);y++;delay(15);}}//*************************************************void DisplayOneChar(uchar X,uchar Y,uchar DData){Y&=1;X&=15;if(Y)X|=0x40;X|=0x80;write_com(X);write_data(DData);}//************************结束*********************************。

相关主题