📄 12887.c
字号:
#include "msp430x44x.h "
#define uchar unsigned char
#define uint unsigned int
/*
P1.0---P1.7---> AD0--AD7
CS---> P2.0
AS---> P2.1
R/W--> P2.2
DS---> P2.3
*/
#define MIN_ADD 0X02
#define HOUR_ADD 0X04
#define WEEK_ADD 0X06
#define DAY_ADD 0X07
#define MON_ADD 0X08
#define YEAR_ADD 0X09
#define REG_A 0X0A
#define REG_B 0X0B
uchar redata;
uchar num=6;
uchar senddata[6];
uchar flag=1;
uchar add;
uchar adata;
uchar loog=6;
uchar ledcs=0xfe;
uchar leddata1;
uchar leddata2;
#define LED_IN_USE 6
uchar led_Ctrl;
uchar led_Buf[LED_IN_USE];
uint i=500;
unsigned char NUM_LED[17]=
{0xd7,0x14,0xcd,0x5d,0x1E, // 0 ~ 4
0x5b,0xdb,0x15,0xdf,0x5f, // 5 ~ 9
0x9f,0xda,0xc3,0xcc,0xcf, // a ~ e
0x8b,0x00}; //f,0x00使LED不显示
void uart_init(void)
{
//WDTCTL = WDTPW + WDTHOLD; // Stop WDT
FLL_CTL0 |= XCAP14PF; // Configure load caps
UTCTL0 = SSEL1; // UCLK = SMCLK
UBR00 = 0x6D; // 1MHz 9600
UBR10 = 0x00; // 1MHz 9600
UMCTL0 = 0x00; // no modulation
UCTL0 = CHAR; // 8-bit character *SWRST*
ME1 |= UTXE0 + URXE0; // Enable USART0 TXD/RXD
IE1 |= URXIE0; // Enable USART0 RX interrupt
P2SEL |= 0x30; // P2.4,5 = USART0 TXD/RXD
P2DIR |= 0x10; // P2.4 output direction
}
void init(void)
{
WDTCTL = WDTPW + WDTHOLD;
FLL_CTL0 = XCAP14PF;
IE2 |= BTIE;
BTCTL = BTDIV + BTIP1+BTIP0;
P1SEL = 0x00; //select a common I/O
P3SEL=0X00;
P4SEL&=0XFC;
P2DIR = BIT0+BIT1+BIT2+BIT3; //selected as output
P2OUT = BIT0+BIT1+BIT2+BIT3;
P3DIR = 0xff;
P4DIR |= 0X03;
P3OUT = 0xff;
P4OUT &= 0xfc;
}
void write_byte(uchar address,uchar data)
{
P1DIR =0XFF;
P2OUT &=~BIT1;//AS=0;
P2OUT |=BIT2;//WR=1
P2OUT |= BIT1;//AS=1
P2OUT &=~BIT0; //CS=0
_NOP();
_NOP();
P1OUT =address;
P2OUT &=~BIT1;//AS=0;锁存ADDRESS
P2OUT &=~BIT2;//WR=0
P1OUT =data;
_NOP();
_NOP();
P2OUT |= BIT1;//AS=1
P2OUT |=BIT2;//WR=1
P2OUT |= BIT0;//CS=1
}
void read_byte(uchar address)
{
P1DIR =BIT0+BIT1+BIT2+BIT3+BIT4+BIT5+BIT6+BIT7;
P2OUT &=~BIT0; //CS=0
P2OUT &=~BIT1;//AS=0
P2OUT |= BIT3;//DS=1
P2OUT |=BIT2;//WR=1
P2OUT |= BIT1;//AS=1
_NOP();
_NOP();
P1OUT =address;
_NOP();
P2OUT &=~BIT1;//AS=0;锁存ADDRESS
P2OUT &=~BIT3;//DS=0
P1DIR =0X00;
_NOP();
_NOP();
redata =P1IN;
_NOP();
P2OUT |= BIT3;//DS=1
P2OUT |= BIT1;//AS=1
P2OUT |= BIT0;//CS=1
}
void led_Display(){
unsigned tmp ;
tmp = 0x01;
P3OUT = NUM_LED[led_Buf[led_Ctrl]]; // 设置显示值
P4OUT |= 0x02; // 打开数据锁存器
P4OUT &= 0XFD; // 关闭数据锁存
P3OUT = ~(tmp<<led_Ctrl); // 设置那只LED显示
P4OUT |= 0x01; // 打开控制锁存
P4OUT &= 0XFE; // 关闭控制锁存
led_Ctrl= (led_Ctrl +1) % LED_IN_USE; // 设置下一个要显示的LED
}
void init_12887(void)
{
write_byte(REG_A,0x20);
write_byte(REG_B,0x72);
}
void settime(void)
{
read_byte(REG_B);
redata|=0x80;
write_byte(REG_B,redata);
write_byte(MIN_ADD,0x12);
write_byte(HOUR_ADD,0x14);
write_byte(WEEK_ADD,0x3);
write_byte(DAY_ADD,0x20);
write_byte(MON_ADD,0x12);
write_byte(YEAR_ADD,0x06);
read_byte(REG_B);
redata&=0x7f;
write_byte(REG_B,redata);
/* redata=1;
add=0x20;
adata=15;
while(adata--)
{
write_byte(add,redata);
add++;
redata++;
}*/
}
void gettime(void)
{
/* read_byte(REG_B);
i=5000;
while(i--);
while ((IFG1 & UTXIFG0) == 0);
TXBUF0=redata;*/
read_byte(REG_A);
// while ((IFG1 & UTXIFG0) == 0);
// TXBUF0=redata;
if((redata&0x80)==0x00)
{
flag=0;
num=6;
read_byte(YEAR_ADD);
senddata[0]=redata;
read_byte(MON_ADD);
senddata[1]=redata;
read_byte(DAY_ADD);
led_Buf[1]=redata%16;
led_Buf[0]=redata/16;
senddata[2]=redata;
read_byte(WEEK_ADD);
senddata[3]=redata;
read_byte(HOUR_ADD);
led_Buf[3]=redata%16;
led_Buf[2]=redata/16;
senddata[4]=redata;
read_byte(MIN_ADD);
led_Buf[5]=redata%16;
led_Buf[4]=redata/16;
senddata[5]=redata;
/* while(!flag&&num)
{
num--;
while ((IFG1 & UTXIFG0) == 0);
TXBUF0=senddata[num];
}*/
}
}
main(void)
{
init();
uart_init();
init_12887();
settime();
_EINT();
for(;;)
{
gettime();
// display();
led_Display();
/* for(i=0;i<num;i++)
{
while ((IFG1 & UTXIFG0) == 0);
while(i--);
TXBUF0=senddata[num];
}*/
flag=1;
num=6;
}
}
#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx(void)
{
while ((IFG1 & UTXIFG0) == 0); // USART0 TX buffer ready?
TXBUF0 = RXBUF0; // RXBUF0 to TXBUF0
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -