⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 watchts.c

📁 自己在微控论坛MSP430试验板上写的一个电子表程序
💻 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 + -