您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > 基于MSP430时钟程序(详细版)
//****************************************/*基于msp430写的简易时钟程序,1602显示,可实现时间初始值设定,按键调整时间,时分秒走时等。因为初学430,故而写个时钟熟悉一下各个模块,年月日等只用了静态数组显示,下次再用时钟芯片写个正式版,与大家分享,共同学习!*///*******************************************#includemsp430x14x.h#includelcd1602.h#includekey.h#defineuintunsignedint#defineucharunsignedcharucharmiaoflag=1;ucharfenflag=0;ucharshiflag=0;unsignedchartable0[]=DYS-2013-08-03;//*****************定时器A初始化**************************voidTimer_A_init(){TACTL=TASSEL0+TACLR;//设置定时器A控制寄存器,TASSEL0为选择辅助时钟aclk//TACLR为清除定时器A计数器CCTL0=CCIE;//设置捕获/比较控制寄存器;CCIE使能捕获比较中断CCR0=16384*2;//设置捕获/比较寄存器,初始值为16384,对于32768hz的频率来说,即为0.5s;TACTL|=MC0;//使记计模式为增模式;_EINT();//使能中断,这是一个c编译器所支持的内部过程;}//***********************设定初始时间****************************voidtimeset_init()//初试时间设定11:11:11{miaoflag=11;fenflag=11;shiflag=11;}//*****************判断按键是否按下******************voidanjian(void){while(1){//keyflag=0;delay2();if((P3IN&0x30)&&((P3IN&0x30)!=48)){delay2();if((P3IN&0x30)&&((P3IN&0x30)!=48)){switch(P3IN&0x30){case16:fenflag++;//这部分可酌情添加按键以实现加减时分秒等break;case32:shiflag++;break;default:break;}}}}}//******************主函数***************************************voidmain(){ucharflag;//StopwatchdogtimertopreventtimeoutresetWDTCTL=WDTPW+WDTHOLD;lcd1602_init();Timer_A_init();key_init();display2(0x80,table0);timeset_init();anjian();}//********************中断函数*******************************#pragmavector=TIMERA0_VECTOR//430中断表达形式;__interruptvoidTimer_A(void){ucharmiaoge,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头文件#includemsp430x14x.h#defineuintunsignedint#defineucharunsignedcharucharkeyflag;/*******************************************函数名称:delay功能:用于消抖的延时参数:无返回值:无********************************************/voiddelay2(void){uinttmp;for(tmp=12000;tmp0;tmp--);}//*******************************voidkey_init(){P3DIR&=~(BIT5+BIT4);//按键P3.5、P3.4}//*************************************************//1602.h头文件//MSP430写的1602液晶显示程序2010-07-1101:08//硬件连接P2数据口P6.5---EP6.4---RWP6.3----RS#includemsp430x14x.h#defineuintunsignedint#definerw(x)P3OUT=(P3OUT&(~BIT6))|(x?BIT6:0);#defineucharunsignedchar//**************延时***********************************voiddelay(uintz){uintt,y;for(t=z;t0;t--)for(y=110;y0;y--);}//*******写命令*****************************************voidwrite_com(unsignedcharcom){P6OUT&=~BIT3;//作为RS选择端低电平有效rw(0);P2OUT=com;delay(1);P6OUT|=BIT5;delay(5);P6OUT&=~BIT5;}//*******写数据***************************************************voidwrite_data(unsignedchardate){P6OUT|=BIT3;//作为RS选择端高电平有效劳rw(0);P2OUT=date;delay(1);P6OUT|=BIT5;//作为E选择端=1;delay(5);P6OUT&=~BIT5;}//********初始化******************************************voidlcd1602_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();}//***************数组静态显示**********************************voiddisplay2(unsignedcharx,unsignedchar*p){unsignedchary=0;//y要给其初值0否则出乱码write_com(x);while(p[y]!=0x00){write_data(p[y]);y++;delay(15);}}//*************************************************voidDisplayOneChar(ucharX,ucharY,ucharDData){Y&=1;X&=15;if(Y)X|=0x40;X|=0x80;write_com(X);write_data(DData);}//************************结束*********************************
本文标题:基于MSP430时钟程序(详细版)
链接地址:https://www.777doc.com/doc-4711532 .html