📄 display.c
字号:
//
//
//
// MSP430F133
// ---------------
// /|\| XIN|-
// | | |
// --|RST XOUT|-
// | |
// | P3.0|-->EN
// | P3.1|-->RW
// | P3.2|-->RS
// | P3.3|-->BACK
// | =P4.0-4.7|-->D0-D8
// | |
// TANG MING BD4WE 2004.5.1
//******************************************************************************
#define Uchar unsigned char
#define Uint unsigned int
#define DataPort P4OUT //
#define Busy 0x80
#define BACK_UP_OFF P3OUT&=~BIT3;
#define BACK_UP_ON P3OUT|=BIT3;
#define CLR_RS P3OUT&=~BIT2;
#define SET_RS P3OUT|=BIT2;
#define CLR_RW P3OUT&=~BIT1;
#define SET_RW P3OUT|=BIT1;
#define CLR_EN P3OUT&=~BIT0;
#define SET_EN P3OUT|=BIT0;
#include <msp430x13x.h>
long int fq=0x00;
void Delay400Ms(void);
void Delay5Ms(void);
void WaitForEnable( void );
void LcdWriteData( char dataW );
void LcdWriteCommand( Uchar CMD,Uchar AttribC );
void LcdReset( void );
void Display( Uchar dd );
void DispOneChar(Uchar x,Uchar y,Uchar Wdata);
void ePutstr(Uchar x,Uchar y, Uchar *ptr);
void main(void)
{
unsigned int i;
Uchar dis1[]="You're wellcome!This is domo.\n";
Uchar dis2[16]="The freqncy is:\n";
Uchar dis3[16]="12.345678MHz \n";
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
BCSCTL1 &= ~XT2OFF; // XT2 = HF XTAL
do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0xFF; i > 0; i--); // Time for flag to set
}
while ((IFG1 & OFIFG) != 0); // OSCFault flag still set?
BCSCTL2 |= SELM1; // MCLK = XT2 (safe)
P3OUT&=0X00;
P3DIR |= 0x0F; // P3.0-P3.3output
P4DIR |= 0xFF; // P4.0 DATA output
TACTL = TASSEL1 + TACLR; // SMCLK, clear TAR
CCTL1 = CCIE; // CCR1 interrupt enabled
CCR1 = 50000;
P1OUT=0X00;
P1DIR |= BIT7+BIT1; // Set P1.0 to output direction
TACTL |= MC1; // Start Timer_A in continuous mode
_EINT(); // Enable interrupts
BACK_UP_ON;
Delay400Ms();
LcdReset();
ePutstr(0,0,dis1);
P1OUT |= BIT7; // Toggle P1.0
Delay400Ms();
Delay400Ms();
Delay400Ms();
P1OUT &=~BIT7; // Toggle P1.0
Delay400Ms();
Delay400Ms();
Delay400Ms();
while(1)
{
ePutstr(0,0,dis2); //
ePutstr(0,1,dis3);
}
}
/*=======================================================
DISPLAY STRING
=======================================================*/
void ePutstr(Uchar x,Uchar y, Uchar *ptr) {
Uchar i,l=0;
while (ptr[l] >31){l++;};
for (i=0;i<l;i++)
{
DispOneChar(x++,y,ptr[i]);
if ( x == 0x0f )
{
x = 0; y ^= 1;
}
}
}
/*=======================================================
Display one line continue string,display string moving
=======================================================*/
void Display( Uchar dd ) {
Uchar i;
for (i=0;i<16;i++) {
DispOneChar(i,1,dd++);
dd &= 0x7f;
if (dd<32) dd=32;
}
}
/*=======================================================
display cursor location
=======================================================*/
void LocateXY( char posx,char posy) {
Uchar temp;
temp = posx & 0xf;
posy &= 0x1;
if ( posy )temp |= 0x40;
temp |= 0x80;
LcdWriteCommand(temp,1);
}
/*=======================================================
display a char in sigined location
=======================================================*/
void DispOneChar(Uchar x,Uchar y,Uchar Wdata) {
LocateXY( x, y ); //
LcdWriteData( Wdata ); //
}
/*=======================================================
LCD reset
=======================================================*/
void LcdReset( void ) {
LcdWriteCommand( 0x38, 0); //
Delay5Ms();
LcdWriteCommand( 0x38, 0); //
Delay5Ms();
LcdWriteCommand( 0x38, 0);
Delay5Ms();
LcdWriteCommand( 0x38, 1); //display mode set
LcdWriteCommand( 0x08, 1); //display close
LcdWriteCommand( 0x01, 1); //clr dis
LcdWriteCommand( 0x06, 1); //dis cursor location
LcdWriteCommand( 0x0f, 1); //dis enable & cursor set
}
/*=======================================================
write control char sub routin: E=1 CLR_RS CLR_RW
=======================================================*/
void LcdWriteCommand( Uchar CMD,Uchar AttribC ) {
if (AttribC) WaitForEnable(); // 检测忙信号?
CLR_RS;
CLR_RW;
_NOP();
DataPort = CMD;
_NOP(); // 送控制字子程序
SET_EN;
_NOP();
_NOP();
CLR_EN; // 操作允许脉冲信号
}
/*=======================================================
current location write char: E =1 SET_RS CLR_RW
=======================================================*/
void LcdWriteData( char dataW ) {
WaitForEnable(); // 检测忙信号
SET_RS;
CLR_RW;
_NOP();
DataPort = dataW; _NOP();
SET_EN;
_NOP();
_NOP();
CLR_EN; // 操作允许脉冲信号
}
/*=======================================================
busy bit detect: E =1 SET_RS CLR_RW
=======================================================*/
void WaitForEnable( void ) {
P4DIR &= 0x00;
CLR_RS;
SET_RW;
_NOP();
SET_EN;
_NOP();
_NOP();
while((P4IN & Busy)!=0);
CLR_EN;
P4DIR |= 0xFF;
}
/*=======================================================
Delay5Ms
=======================================================*/
void Delay5Ms(void)
{ unsigned int i;
i = 40000; // Delay
do (i--);
while (i != 0);
}
/*=======================================================
Delay400Ms
=======================================================*/
void Delay400Ms(void)
{Uchar i =50;
Uint j;
while(i--)
{
j=7269;
while(j--);
};
}
/*=======================================================
TIMER_A INTRRUPT
=======================================================*/
#pragma vector=TIMERA1_VECTOR // Timer_A3 Interrupt Vector (TAIV) handler
__interrupt void Timer_A (void)
{
switch( TAIV )
{
case 2: // CCR1
{
fq=fq+1000;
CCR1 += 50000; // Add Offset to CCR1
}
break;
case 4: break; // CCR2 not used
case 10: break; // overflow not used
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -