msp430单片机课程设计实时时钟与键盘控制Word文档下载推荐.docx
《msp430单片机课程设计实时时钟与键盘控制Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《msp430单片机课程设计实时时钟与键盘控制Word文档下载推荐.docx(11页珍藏版)》请在冰豆网上搜索。
按下ENTER键,确认当前位的修改,注意是单个位的修改。
3、体现430系列单片机的超低功耗的特性。
在中断处理结束,以及循环结束,或者等待键盘按键时,会进入低功耗工作模式,同时编程时也尽量减少函数的调用,并将一些变量定义为寄存器变量,提高运行效率。
二、参数计算
设计时钟时,应能做到分秒的60进1,时的24进1,年以两位数表示满100进1,月满12进1;
关于天的计数较为复杂:
先根据年月判断该月的最大天数,实现进位。
三、编程步骤
1、编写时间显示函数,测试以确认函数功能正常。
2、设置初始值为04年2月28日。
利用定时器A控制秒信号的自加,并用LCD显示判断算法是否正确。
3、已经得到正确的秒信号,根据算法实现时间的进位。
4、设计键盘,使键盘能正确输入,读取键值。
5、设计翻页功能,实现时间和日期的切换。
6、设计时间的修改功能,以串输入修改数据的形式进行修改。
7、程序存档,测试检验基本功能。
8、优化程序算法,精简变量与函数调用,实现超低功耗,测试检验,提交最后成果。
四、实践感受
五、源程序
//实时时钟+键盘控制(串输入修改方式)
#include<
msp430x44x.h>
stdio.h>
//定义液晶显示笔画
#definea(0x01)
#defineb(0x02)
#definec(0x10)
#defined(0x08)
#definee(0x40)
#definef(0x20)
#defineg(0x04)
//#defineh(0x80)
//显示字符的指针
constunsignedcharLCD_Tab[]={
a+b+c+d+e+f,//显示"
0"
LCD_Tab[00]
b+c,//显示"
1"
LCD_Tab[01]
a+b+d+e+g,//显示"
2"
LCD_Tab[02]
a+b+c+d+g,//显示"
3"
LCD_Tab[03]
b+c+f+g,//显示"
4"
LCD_Tab[04]
a+c+d+f+g,//显示"
5"
LCD_Tab[05]
a+c+d+e+f+g,//显示"
6"
LCD_Tab[06]
a+b+c,//显示"
7"
LCD_Tab[07]
a+b+c+d+e+f+g,//显示"
8"
LCD_Tab[08]
a+b+c+d+f+g,//显示"
9"
LCD_Tab[09]
a+b+c+e+f+g,//显示"
A"
LCD_Tab[0A]
c+d+e+f+g,//显示"
b"
LCD_Tab[0B]
a+d+e+f,//显示"
C"
LCD_Tab[0C]
b+c+d+e+g,//显示"
d"
LCD_Tab[0D]
a+d+e+f+g,//显示"
E"
LCD_Tab[0E]
a+e+f+g,//显示"
F"
LCD_Tab[0F]
0,//显示"
"
LCD_Tab[10]
};
//定义时钟2004-02-2823:
59:
53
unsignedshortintyear=04,mon=2,day=28,hour=23,min=59,sec=53;
unsignedshortintx,num,page=0;
unsignedcharp3;
doubledx;
unsignedintset=0,p=0;
//p表示当前修改哪个位
unsignedintkey=0,temp=10;
longintdiv_val=1,div=1,data=0,dat=0;
voidmInitSTDIO()//系统初始化
{
unsignedchari;
//主时钟初始化
WDTCTL=WDTPW+WDTHOLD;
//stopwatchdogtimer
FLL_CTL0|=XCAP14PF;
//Configureloadcaps
//定时器A初始化
TACTL=TASSEL0+TACLR;
//ACLK,clearTAR
TACCTL0=CCIE;
//CCR0interruptenabled
TACCR0=32768;
//定时器常数(1秒)
TACTL|=MC0;
//StartTimer_ainupmode
//定时器B初始化
TBCTL=TASSEL0+TACLR;
TBCCTL0=CCIE;
TBCCR0=328;
//定时器常数(1/100秒)
TBCTL|=MC0;
//P口初始化
P1DIR=0;
//设置P1.0~P1.7为输入方式
P1IFG=0;
//清除P1的中断标志
P1IE=0xFF;
//设置P1.0~P1.7中断
P1IES=0xFF;
//设置P1.0~P1.7下降沿中断
P2DIR|=0xCF;
//设置P2.0~P2.3,P2.6,P2.7为输出方式
P3DIR=0xFF;
//设置P3.0~P3.7为输出方式
P4DIR|=0xFC;
//设置P4.2~P4.7为输出方式
P5SEL=0xFF;
//P5用于LCD显示
P6SEL=1;
//P6.0用于ADC
P3DIR|=0xFE;
//设置P6.1~P6.7为输出方式(临时)
//初始化LCD
LCDCTL=LCDON+LCD4MUX+LCDP0;
//4-MuxLCD,segmentsS0-S15
BTCTL=BTFRFQ1;
for(i=0;
i<
8;
i++)LCDMEM[i]=0;
//清除显示
}
//========================主程序====================================
voidmain(void)
charx=0;
mInitSTDIO();
//系统初始化
_EINT();
//开启中断
for(dx=0;
dx<
1000;
dx++);
printf("
Start\n"
);
while
(1)
{
while(page%2==0&
&
set==0)//判断条件为偶数页,显示时分秒
{
LCDMEM[0]=LCD_Tab[sec%10];
LCDMEM[1]=LCD_Tab[sec/10];
LCDMEM[2]=LCD_Tab[min%10];
LCDMEM[3]=LCD_Tab[min/10];
LCDMEM[4]=LCD_Tab[hour%10];
LCDMEM[5]=LCD_Tab[hour/10];
//_BIS_SR(LPM3_bits);
//EnterLPM3
_BIS_SR(LPM0_bits);
//EnterLPM0
}
while(page%2==1&
set==0)//判断条件为奇数页,显示年月日
LCDMEM[0]=LCD_Tab[day%10];
LCDMEM[1]=LCD_Tab[day/10];
LCDMEM[2]=LCD_Tab[mon%10];
LCDMEM[3]=LCD_Tab[mon/10];
LCDMEM[4]=LCD_Tab[year%10];
LCDMEM[5]=LCD_Tab[year/10];
_BIS_SR(LPM3_bits);
while(set==1)//set=1时,设置模式
LCDMEM[0]=LCD_Tab[temp];
//最低位闪烁
LCDMEM[0]=LCD_Tab[16];
//空白,不显示
2000;
//-------------------------------字符串输入------------------------------------------
while(key<
0x0a)//按键为0~9,可进行修改
data=data*10+key;
dat=data;
x=p;
do
{LCDMEM[x--]=LCD_Tab[dat/div];
dat%=div;
div/=10;
}while(div);
div_val=div_val*10;
div=div_val;
p++;
p%=6;
temp=key;
key=0x0a;
}//data为输入的6位数,start键确认修改
}//设置模式end~~~
//修改建议:
尝试按位修改时间
}//while
(1)
}//=======main结束=========
//------------------------------TimerA0中断服务程序--------------------------------------------
#pragmavector=TIMERA0_VECTOR
__interruptvoidTimer_A0(void)
{
p3<
<
=1;
if(p3==0)p3=1;
P3OU