#include "msp430f5529.h"
typedef unsigned char uchar;
typedef unsigned int uint;
void Init_Rtc(void);
void Init_Clk(void);
void Init_System(void);
int sec=0;
int min=0;
int hour=0;
/*************************************************
函数(模块)名称:void Init_System(void)
功能: 该程序系统初始化
本函数(模块)调用的函数(模块)清单:
调用本函数(模块)的函数(模块)清单:
输入参数: void
输出参数: void
函数返回值说明 :void
使用的资源
其它说明:
*************************************************/
void Init_System(void)
{
Init_Clk(); //调用时钟函数
Init_Rtc(); //RTC 初始化
P3DIR |= BIT6; //P1.0为输出
P3OUT |= BIT6;
P3DIR |= BIT7; //P7.7为输出
P3OUT &= ~BIT7;
__bis_SR_register( GIE);
}
/*************************************************
函数(模块)名称:void Init_Rtc(void)
功能: RTC初始化
本函数(模块)调用的函数(模块)清单:
调用本函数(模块)的函数(模块)清单:
输入参数: void
输出参数: void
函数返回值说明 :void
使用的资源
其它说明:
*************************************************/
void Init_Rtc(void)
{ // BCD码日历格式输出
RTCCTL01 = RTCHOLD + RTCMODE + RTCTEV_0;
RTCPS0CTL = RT0PSHOLD ; //配置两个计数器分频
RTCPS1CTL = RT1PSHOLD ;
RTCSEC = 54; //初始化秒
RTCMIN = 59 ; //初始化分钟
RTCHOUR =8; //初始化小时
RTCCTL01 &= ~RTCHOLD; //打开RTC模块
RTCPS0CTL &= ~RT0PSHOLD; //打开RTCPS0CTL
RTCPS1CTL &= ~RT1PSHOLD; //打开RTCPS1CTL
RTCCTL0 |= RTCRDYIE + RTCTEVIE; //打开安全访问使能 ,闹钟使能
}
/*************************************************
函数(模块)名称:void Init_Clk(void)
功能: 时钟初始化
本函数(模块)调用的函数(模块)清单:
调用本函数(模块)的函数(模块)清单:
输入参数: void
输出参数: void
函数返回值说明 :void
使用的资源
其它说明:
*************************************************/
void Init_Clk(void)
{
P5SEL |= BIT4+BIT5; //启动XT1
UCSCTL1 = DCORSEL_2; //DCO 范围配置
UCSCTL4 = SELM_3 + SELA_0 + SELS_4; //设置时钟源
while (SFRIFG1 & OFIFG) //等待时钟系统正常工作
{
UCSCTL7 &= ~( XT1LFOFFG + DCOFFG);
SFRIFG1 &= ~OFIFG;
}
}
uchar yi[16]= {" 新型全自动机 "};
uchar er[16]= {" 械磨床 "};
uchar san[16]={" 时间 "};
uchar si[16]= {"加工零件数: "};
int cnt=0;
#define LCD_DataIn P1DIR=0x00 //数据口方向设置为输入
#define LCD_DataOut P1DIR=0xff //数据口方向设置为输出
#define LCD2MCU_Data P1IN
#define MCU2LCD_Data P1OUT
#define LCD_CMDOut P3DIR|=0x07 //P3口的低三位设置为输出
#define LCD_RS_H P3OUT|=BIT0 //P3.0
#define LCD_RS_L P3OUT&=~BIT0 //P3.0
#define LCD_RW_H P3OUT|=BIT1 //P3.1
#define LCD_RW_L P3OUT&=~BIT1 //P3.1
#define LCD_EN_H P3OUT|=BIT2 //P3.2
#define LCD_EN_L P3OUT&=~BIT2 //P3.2
/*************************************************
函数(模块)名称:void Init_Rtc(void)
功能: RTC初始化
本函数(模块)调用的函数(模块)清单:
调用本函数(模块)的函数(模块)清单:
输入参数: void
输出参数: void
函数返回值说明 :void
使用的资源
其它说明:
*************************************************/
void Ini_rtc(void)
{ // BCD码日历格式输出
RTCCTL1 =RTCBCD+RTCHOLD+RTCMODE;
RTCPS0CTL = RT0PSHOLD ; //配置两个计数器分频
RTCPS1CTL = RT1PSHOLD ;
RTCSEC = 0x22; //初始化秒
RTCMIN = 0X00 ; //初始化分钟
RTCHOUR =0X08; //初始化小时
RTCDOW = 0X02 ;
RTCTIM1 = 0X0411;
RTCDAY = 0x24; //日期初始化
RTCMON = 0X08 ; //初始化月份
RTCYEAR = 0x2014; //初始化年份
RTCAMINHR = 0X2200 + BIT7; //闹钟小时和分钟设置
RTCADOWDAY = 0X2402; //闹钟星期和日期设置
RTCCTL01 &= ~RTCHOLD; //打开RTC模块
RTCPS0CTL &= ~RT0PSHOLD; //打开RTCPS0CTL
RTCPS1CTL &= ~RT1PSHOLD; //打开RTCPS1CTL
RTCCTL0 |= RTCRDYIE + RTCTEVIE; //打开安全访问使能 ,闹钟使能
}
/*******************************************
函数名称:Delay_1ms
功 能:延时约1ms的时间
参 数:无
返回值 :无
********************************************/
void Delay_1ms(void)
{
uchar i;
for(i = 150;i > 0;i--) _NOP();
}
/*******************************************
函数名称:Delay_Nms
功 能:延时N个1ms的时间
参 数:n--延时长度
返回值 :无
********************************************/
void Delay_Nms(uint n)
{
uint i;
for(i = n;i > 0;i--) Delay_1ms();
}
/*******************************************
函数名称:Write_Cmd
功 能:向液晶中写控制命令
参 数:cmd--控制命令
返回值 :无
********************************************/
void Write_Cmd(uchar cmd)
{
uchar lcdtemp = 0;
LCD_RS_L;
LCD_RW_H;
LCD_DataIn;
do //判忙
{
LCD_EN_H;
_NOP();
lcdtemp = LCD2MCU_Data;
LCD_EN_L;
}
while(lcdtemp & 0x80);
LCD_DataOut;
LCD_RW_L;
MCU2LCD_Data = cmd;
LCD_EN_H;
_NOP();
LCD_EN_L;
}
/*******************************************
函数名称:Write_Data
功 能:向液晶中写显示数据
参 数:dat--显示数据
返回值 :无
********************************************/
void Write_Data(uchar dat)
{
uchar lcdtemp = 0;
LCD_RS_L;
LCD_RW_H;
LCD_DataIn;
do //判忙
{
LCD_EN_H;
_NOP();
lcdtemp = LCD2MCU_Data;
LCD_EN_L;
}
while(lcdtemp & 0x80);
LCD_DataOut;
LCD_RS_H;
LCD_RW_L;
MCU2LCD_Data = dat;
LCD_EN_H;
_NOP();
LCD_EN_L;
}
/*******************************************
函数名称:Ini_Lcd
功 能:初始化液晶模块
参 数:无
返回值 :无
********************************************/
void Ini_Lcd(void)
{
LCD_CMDOut; //液晶控制端口设置为输出
Delay_Nms(500);
Write_Cmd(0x30); //基本指令集
Delay_1ms();
Write_Cmd(0x02); // 地址归位
Delay_1ms();
Write_Cmd(0x0c); //整体显示打开,游标关闭
Delay_1ms();
Write_Cmd(0x01); //清除显示
Delay_1ms();
Write_Cmd(0x06); //游标右移
Delay_1ms();
Write_Cmd(0x80); //设定显示的起始地址
}
/*************************************************************
程序功能:在12864液晶上显示ASCII常用字符
-------------------------------------------------------------
跳线设置:将跳线座J5的1脚(+)和2脚短接,选择并行数据传输方式
-------------------------------------------------------------
测试说明:观察液晶显示
**************************************************************/
/*
将工件数装换为显示
*/
void zhuan_cnt(void)
{
int i;
i=cnt;
si[15]=i%10+0x30;
i=i/10;
si[14]=i%10+0x30;
i=i/10;
si[13]=i%10+0x30;
i=i/10;
si[12]=i%10+0x30;
i=i/10;
si[11]=i%10+0x30;
}
/*
rtc时间转换
*/
void zhuan_rtc(void)
{
san[15]=sec%10+'0';
san[14]=sec/10+'0';
san[13]=':';
san[12]=(min%10)+'0';
san[11]=(min/10)+'0';
san[10]=':';
san[9]=(hour%10)+'0';
san[8]=(hour/10)+'0';
san[7]=':';
}
void dis( void )
{
uint i;
zhuan_rtc();
zhuan_cnt();
Write_Cmd(0x80); //写第一行的显示地址
for(i = 0; i < 16; i++)
Write_Data(yi[i]); //显示0x30~0x3f对应的字符
Write_Cmd(0x90); //写第二行的显示地址
for(i = 0; i < 16; i++)
Write_Data(er[i]); //显示0x40~0x4f对应的字符
Write_Cmd(0x88); //写第三行的显示地址
for(i = 0; i < 16; i++)
Write_Data(san[i]); //显示0x50~0x5f对应的字符
Write_Cmd(0x98); //写第四行的显示地址
for(i = 0; i < 16; i++)
Write_Data(si[i]); //显示0x60~0x6f对应的字符
}
/***************************主函数***************************/
void main(void)
{
uint i,j;
WDTCTL = WDTPW + WDTHOLD; //关狗
Ini_Lcd(); //初始化液晶
Init_System(); //初始化rtc
for(;;)
{
dis();
for(i = 100; i > 0; i--) //延时一会
{
for(j = 1000; j > 0; j--)
_NOP();
}
}
}
/************************ RTC中断*****************************/
#pragma vector=RTC_VECTOR
__interrupt void basic_timer(void)
{
switch(RTCIV)
{
case 2 : P3OUT ^= BIT6;
sec=RTCSEC; //初始化秒
min=RTCMIN; //初始化分钟
hour=RTCHOUR;
break; //RTCRDYIFG
case 4 ://P3OUT ^= BIT6;
break;
case 6 : break; //RTCAIFG
case 8 : break;
case 10 : break;
}
}
|