?? test44x_lcd_led_time.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 + -