📄 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 + -