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

📄 test44x_lcd_led_time.c

📁 msp430在IAR编译环境下关于段式液晶的驱动程序
💻 C
字号:
#include  "msp430x44x.h "
//-------------------------------------------------------------
//MSP-Test44x Demo   lcd ,led dishplay the timer
//
// 该程序是用F449驱动LCD显示 LSD 048和74HC373驱动LED显示时钟。
//                          MSP430F449
//                       -----------------
//                   /|\|              XIN|-
//                    | |                 |         74HC373(1)&(2)
//         LSD 048        --|RST          XOUT|-       ---------------
//        ----------    |                 |       |               |             LED
//       |     COM0|<---|COM0         P3.1|------>|D0             |           -------
//       |       . |  . |  .            . |   .   |.              |          |       |
//       |     COM3|<---|COM3         P3.7|------>|D7             |          |       |
//       |      S0 |<---|S0           P4.0|------>|bit /CE choose | -------->|-------|
//       |       . |  . |             P4.1|------>|seg /CE choose | -------->|       |
//       |      S14|<---|S14              |       |               |          |       |
//       |         |    |                 |       |               |           -------
//  Lierda, Inc
//  February 2006.03
//  Built with IAR Embedded Workbench Version: 3.40a
//  ID:  MSP430-TEST44X
//  DATA:2005-7-12
//  REV: 2.0A
//  1、程序功能:该程序是用 F449的LCD内部显示功能,来控制LCD 显示实时时钟没,另外,也控制LED显示。
//  2、硬件连接:必须连接所有短接器,同时,必须将拨动开关P1的P3和P4拨到ON的位置。
//  3、显示数据:实时时钟
//---------------------------------------------------------
static  unsigned char sec;            //秒寄存器
static  unsigned char min;            //分寄存器
static  unsigned char hour;           //小时寄存器
static  unsigned char led_disp_bit=0x40;//LED显示位寄存器
static  unsigned char tt;
static  unsigned char pp;
//----------------------------------------------------------
const   unsigned char lcd_table[12]={
0x7b,       //*"0"*//
0x12,       //*"1"*//
0x4f,       //*"2"*//
0x1f,       //*"3"*//                 //LCD显示代码表
0x36,       //*"4"*//
0x3d,       //*"5"*//
0x7d,       //*"6"*//
0x13,       //*"7"*//
0x7f,       //*"8"*//
0x3f,       //*"9"*//
0x00,       //*"no"*//
0x00,       //*"no"*//
};
const   unsigned char led_table[12]={
0xd7,       //*"0"*//
0x14,       //*"1"*//
0xcd,       //*"2"*//
0x5d,       //*"3"*//                                 //LED显示代码  LED 共阴
0x1e,       //*"4"*//
0x5b,       //*"5"*//
0xdb,       //*"6"*//
0x15,       //*"7"*//
0xdf,       //*"8"*//
0x5f,       //*"9"*//
0x00,       //*"no"*//
0x00,       //*"no"*//
};

void rtc(void);                                       // 时钟处理程序
void display_rtc(void);                               // LCD 显示程序
void display_dec(unsigned char  i,unsigned char  j);  //
void led_display(unsigned char i);                    // LED 显示程序
//-------------------------------------------------------------
//---------------主程序----------------------------------------
//-------------------------------------------------------------
void main(void)
{
    int i;
    pp = 0x60;
    tt =(pp%10+0x20);
    WDTCTL = WDTPW + WDTHOLD;
    BTCTL=BTSSEL+BT_ADLY_500+BTFRFQ1;        // BT 0.5S中断
    IE2|=BTIE;                               // enable BT int
    P5SEL=0xfc;                              // lcd segment
    LCDCTL=LCDON+LCD4MUX+LCDP2;              // LCD模块初始化
    P3DIR=0xff;                              // 端口3初始化  led segment
    P4DIR=0x03;                              // 端口4初始化  p4.0 control bit 373 /ce ;   p4.1 control seg 373 /ce
    P3OUT=0x00;                              // LED清屏
    P4OUT|=0x02;
    P4OUT&=~0x02;
    P3OUT=0xff;
    P4OUT|=0x01;
    P4OUT&=~0x01;
    TACTL=TASSEL0+TACLR;                     //  Timer_a的时钟源为ACLK,
    CCTL0=CCIE;
    CCR0=100;                                // 100/32.768K=3ms中断  用于LED显示刷新频率
    TACTL|=MC0;
    for (i=0; i<8; ++i)                      //LCD 清屏
    LCDMEM[i] = 0x00;
    _EINT();                                 //允许中断
//*mainloop*//
    for(;;)
    {
       _BIS_SR(LPM3_bits);                   //进入低功耗模式3
       _NOP();
    }
}

//------------------------------------------------------

//interrupt[BASICTIMER_VECTOR] void basic_timer(void)
#pragma vector=BASICTIMER_VECTOR
__interrupt void basic_timer (void)
{
    rtc();                                   //时钟处理
    display_rtc();                           //时钟LCD显示
}
//------------------------------------------------------
//interrupt[TIMERA0_VECTOR] void Timer_A (void)
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
  led_disp_bit=led_disp_bit>0x01?led_disp_bit>>1:0x40;   //LED显示处理
  switch(led_disp_bit)                 //选择led的刷新位//3ms刷新一位
    {
    case 1:led_display(led_table[hour/10]);break;
    case 2:led_display(led_table[hour%10]+0x20);break;// 0X20是小数点
    case 4:led_display(led_table[min/10]);break;
    case 8:led_display(led_table[min%10]+0x20);break;
    case 16:led_display(led_table[(sec>>1)/10]);break;
    case 32:led_display(led_table[(sec>>1)%10]);
    }
}
//-------------------------------------------------------
//-------时钟处理程序------------------------------------
//-------------------------------------------------------
void  rtc (void)                                      // 0.5秒中断一次。
{
  if (++sec < 120)
    return;
  sec = 0;
  if (++min < 60)
    return;
  min = 0;
  if (++hour < 24)
    return;
  hour = 0;
}
//--------------------------------------------------------
//--------时钟LCD显示程序---------------------------------
//--------------------------------------------------------
void display_rtc(void)
{ int i;
  i=sec;                                              // 显示秒
  i=i>>1;
  display_dec(0,i);
  i=min;                                              // 显示分
  display_dec(2,i);
  i=hour;                                             // 显示时
  display_dec(4,i);
  LCDMEM[6]=0x00;
}
//--------------------------------------------------------
//--------LCD显示处理程序---------------------------------
//--------------------------------------------------------
void display_dec(unsigned char  i,unsigned char  j)
{
 LCDMEM[i]=lcd_table[j%10]+0x80;                      // 0X80 是小数点
 LCDMEM[i+1]=lcd_table[j/10];
}
//--------------------------------------------------------
//-------LED 1位显示程序----------------------------------
//-------I 为显示代码值-----------------------------------
void led_display(unsigned char i)
{
P3OUT=i;                                     // SEND LED SEGMENT
P4OUT=0x02;                                  // ENABLE 373 /CE
P4OUT&=~0x02;

P3OUT=~led_disp_bit;                         // SEND LED BIT
P4OUT=0x01;                                  // ENABLE 373 /CE
P4OUT&=~0x01;
P3OUT=0x00;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -