📄 watchts.c
字号:
//147开发板24小时电子表程序
//p2.0和p2.1接两个按键用来设置分钟和小时
//编写:c6660
#include <msp430x14x.h>
#define LCD_L21 0x90
#define LCD_L22 0x91
#define LCD_L23 0x92
#define LCD_L24 0x93
#define LCD_L25 0x94
#define LCD_L26 0x95
#define LCD_L27 0x96
#define SID 0x40 //串行数据输入端 01000000
#define SCK 0x80 //同步时钟输入端 10000000
#define DDRAM_0 0x80 //显示回位 10000000
#define off_cursor 0x0c //关闭光标 00001100
#define on_cursor 0x0e //开光标 00001110
#define off_cursor_filsh 0x0e //光标关闪烁 00001110
#define on_cursor_filsh 0x0f //光标开闪烁 00001111
int w=0x30;
int u=0x31;
int p=0x30;
int q=0x30;
int r=0x30;
int s=0x30;
//**************************************************
void delay(void)
{ char i;
for (i = 0;i != 0xff;i++);
}
//**************************************************
void sendBYTE(char dat) //串行传送一字节数据
{char i;
P4DIR|=SID; //设P4.6 SID 为输出
for (i=0;i<8;i++)
{
P4OUT&=~SCK; //SCK=0 P4.7输出0
if((dat & SCK)!=0) //
P4OUT|=SID; //SID=1 p4.6输出1
else
P4OUT&=~SID; //SID=0 P4.6输出0
P4OUT|=SCK; //SCK=1 P4.7输出1
dat = dat<<1;
}
}
//****************************************************
void sendCMD(char dat) //写控制指令
{
sendBYTE(0xf8); //11111000 RWRS=00写指令到指令寄存器
sendBYTE(dat & 0xf0); //dat & 11110000 屏蔽掉低4位
sendBYTE((dat<<4)&0xf0); //左移4位,写入低4位
}
//****************************************************
void sendDAT(char dat) //写显示数据;也可以写一个单字节字符
{
sendBYTE(0xfa); //11111010 RWRS=01写入资料到资料寄存器
sendBYTE(dat & 0xf0);
sendBYTE((dat<<4)&0xf0);
}
//****************************************************
void display(char x_add,char dat,char dat1)
//写汉字到LCD屏指定位置
//x_add 显示RAM 地址
//dat/dat1显示汉字编码
{
sendCMD(x_add);
sendDAT(dat);
sendDAT(dat1);
}
//*****************************************************
void initlcm(void) //初始化LCM
{
delay();
sendCMD(0x30); //功能设置:一次送8 位数据,基本指令集 00110000
sendCMD(0x04); //点设定 :显示字符/ 光标从左到右移位,DDRAM 地址加一
sendCMD(0x0f); //显示设定:开显示,显示光 标,当前显示位反白 闪动
sendCMD(0x01); //清DDRAM 清除显示
sendCMD(0x02); //*DDRAM 地址归位
}
//****************************************************
void mcu_init(void) //单片机初始化
{ WDTCTL=WDTPW+WDTHOLD; //停止WDT
P4DIR|=SCK; //SCK设为输出
}
//****************************************************
void send_title(char l,char m,char n,char o,char j,char k) //标题显示
{
sendCMD(DDRAM_0); //DDRAM
sendCMD(off_cursor); //关光标
sendDAT(l); sendDAT(m); sendDAT(':'); sendDAT(n); sendDAT(o); sendDAT(':');sendDAT(j);sendDAT(k);
}
//*****************************************************
void Iint_Port2(void)
{ P2DIR&=~BIT0; //设置为输入方向
P2SEL&=~BIT0; //设置为普通I/O口功能
P2IES|=BIT0; //选择下降沿触发
P2IE|=BIT0; //打开中断允许
P2DIR&=~BIT1; //设置为输入方向
P2SEL&=~BIT1; //设置为普通I/O口功能
P2IES|=BIT1; //选择下降沿触发
P2IE|=BIT1; //打开中断允许
P2IFG=0; //P2IES的切换可能使P2IFG置位,需清除
}
//*****************************************************
void main(void)
{
mcu_init(); //单片机初始化
initlcm(); //LCD初始化
Iint_Port2();
TACTL=TASSEL0+TACLR;
CCTL0=CCIE;
CCR0=32768; //正好1秒
P1DIR |=0x02;
TACTL |=MC0;
_EINT();
for(;;)
{
_BIS_SR(CPUOFF);
}
}
//********************************************************
//定时器中断
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
P1OUT ^=0x02;
send_title(p,q,r,s,w,u); //LCD显示
if (u<0x39)
u=u+0x01;
else
{
u=0x30;
w=w+0x01;
}
if (w<0x36)
_NOP();
else
{
w=0x30;
s=s+0x01;
}
if (s<=0x39)
_NOP();
else
{
s=0x30;
r=r+0x01;
}
if (r<0x36)
_NOP();
else
{
r=0x30;
q=q+0x01;
}
if (q<=0x39)
_NOP();
else
{
q=0x30;
p=p+0x01;
}
if ((q>=0x34)&&(p>=0x32))
{
w=0x30;
u=0x30;
p=0x30;
q=0x30;
r=0x30;
s=0x30;
}
else
_NOP();
}
//********************************************************
//设置时间 按键中断
#pragma vector=PORT2_VECTOR
__interrupt void P2_ISR(void)
{
send_title(p,q,r,s,w,u);
//设置小时
if (P2IFG & BIT0)
{
q=q+0x01;
}
//设置分钟
if (P2IFG & BIT1)
{
s=s+0x01;
}
P2IFG=0; //多源中断,需靠软件清除P2IFG
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -