|
MSP430 驱动DS1302和LCD1602
[复制链接]
#include "MSP430F149.h"
/*****************************************软件延时************************************/
#define CPU_F ((double)8000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
/**************************************************************************************/
#define uint unsigned int
#define uchar unsigned char
#define DSCLKH P2OUT |= 0X01;
#define DSCLKL P2OUT &=~ 0X01;
#define DSDAH P2OUT |= 0X02;
#define DSDAL P2OUT &=~ 0X02;
#define DSRSTH P2OUT |= 0X04;
#define DSRSTL P2OUT &=~ 0X04;
#define LCDDATE P5OUT|=BIT5
#define LCDCOMD P5OUT&=~BIT5;
#define LCDENH P5OUT|=BIT7;
#define LCDENL P5OUT&=~BIT7;
uchar table[];
uchar miao,aa,bb;
void delay(uint xms)
{
unsigned int i,h;
for (i = xms; i >0 ; i--)
for(h=1140;h>0;h--);
}
void delaysome(uint xms)
{
uint aa;
for(aa=xms;aa>0;aa--);
}
void writedate(uchar date)
{
LCDDATE;
P4OUT = date;
delay(10);
LCDENH;
delay(10);
LCDENL;
}
void writecomd(uchar date)
{
LCDCOMD;
P4OUT = date;
delay(10);
LCDENH;
delay(10);
LCDENL;
}
void init()
{
writecomd(0x38);
writecomd(0x01);
writecomd(0x0c);
writecomd(0x06);
}
void dswrdate(uchar rr)
{
uchar temp;
P2DIR = 0XFF;
DSRSTH;
temp = rr;
for(char xx=8;xx>0;xx--)
{
if(temp&0x01)
{
DSDAH;
DSCLKL;
_NOP();
_NOP();
_NOP();
_NOP(); _NOP();
_NOP();
DSCLKH;
_NOP();
_NOP();
_NOP();
_NOP(); _NOP();
_NOP();
}
else
{
DSDAL;
DSCLKL;
_NOP();
_NOP();
_NOP();
_NOP(); _NOP();
_NOP();
DSCLKH;
_NOP();
_NOP();
_NOP();
_NOP(); _NOP();
_NOP();
}
temp>>=1;
}
}
char dsredate()
{
uchar cc;
for(uchar xx=8;xx>0;xx--)
{
P2DIR = 0XFF;
DSCLKH;
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
DSCLKL;
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
P2DIR = 0X00;
cc = cc|((P2IN&0X01)<<7);
cc>>=1;
_NOP();
_NOP();
_NOP();
}
return(cc);
}
void dsinit()
{
P2DIR=0XFF;
DSCLKL;
DSRSTL;
delay_ms(10);
DSCLKH;
}
char dsreaddate(uchar add)
{
P2DIR = 0XFF;
uchar date;
DSRSTL;
DSCLKL;
_NOP();
DSRSTH;
dswrdate(add);
date = dsredate();
DSCLKH;
DSRSTL;
return(date);
}
void dswritedate(uchar add,uchar date)
{
P2DIR = 0XFF;
DSRSTL;
DSCLKL;
DSRSTH;
dswrdate(add);
dswrdate(date);
DSCLKH;
DSRSTL;
}
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
BCSCTL2|=SELS;
BCSCTL1 &=~ XT2OFF;
do
{
uchar bb;
IFG1 &=~ OFIFG;
for(bb=0xff;bb>0;bb--);
}
while((IFG1&OFIFG)!=0);
BCSCTL2|=SELM_2+SELS+DIVS_3;
P4SEL = 0x00;
P4DIR = 0xFF; //数据口输出模式
P5SEL = 0x00;
P5DIR|= BIT5 + BIT6 + BIT7;
P5OUT&=~BIT6;
LCDENL;
_EINT();//控制口设置为输出模式
init();
dsinit();
dswritedate(0x8e,0x00);
dswritedate(0x90,0xa9);
dswritedate(0x8c,0x50);
dswritedate(0x8a,0x02);
dswritedate(0x88,0x02);
dswritedate(0x86,0x10);
dswritedate(0x84,0x10);
dswritedate(0x82,0x10);
dswritedate(0x80,0x10);
dswritedate(0x8e,0x80);
while(1)
{
aa=dsreaddate(0x81);
writecomd(0x80);
writedate(0x30+aa/26);
writedate(0x30+aa%16);
}
}
驱动不正常 哪位大神给看看。。。。O(∩_∩)O谢谢
|
|