#include "msp430g2553.h"
#define LATCH_OUT P1DIR |= BIT5
#define LATCH_OUT_H P1OUT |= BIT5
#define LATCH_OUT_L P1OUT &=~ BIT5
#define SCK_OUT P1DIR |= BIT4
#define SCK_OUT_H P1OUT |= BIT4
#define SCK_OUT_L P1OUT &=~ BIT4
#define OE_OUT P1DIR |= BIT2
#define OE_OUT_H P1OUT |= BIT2
#define OE_OUT_L P1OUT &=~ BIT2
#define R1_OUT P1DIR |= BIT1
#define R1_OUT_H P1OUT |= BIT1
#define R1_OUT_L P1OUT &=~ BIT1
#define G1_OUT P1DIR |= BIT3
#define G1_OUT_H P1OUT |= BIT3
#define G1_OUT_L P1OUT &=~ BIT3
#define A_OUT P2DIR |= BIT0
#define A_OUT_H P2OUT |= BIT0
#define A_OUT_L P2OUT &=~ BIT0
#define B_OUT P2DIR |= BIT1
#define B_OUT_H P2OUT |= BIT1
#define B_OUT_L P2OUT &=~ BIT1
#define C_OUT P2DIR |= BIT2
#define C_OUT_H P2OUT |= BIT2
#define C_OUT_L P2OUT &=~ BIT2
#define D_OUT P2DIR |= BIT3
#define D_OUT_H P2OUT |= BIT3
#define D_OUT_L P2OUT &=~ BIT3
#include "move.h"
void main()
{
// Stop watchdog timer to prevent time out reset ?
WDTCTL = WDTPW + WDTHOLD;
//主系統時鐘切換為外部高速晶振
if (CALBC1_8MHZ == 0xFF || CALDCO_8MHZ == 0xFF)
{
while(1);// If calibration constants erased, trap CPU!!
}
// Configure Basic Clock
BCSCTL1 = CALBC1_8MHZ;// Set range
DCOCTL = CALDCO_8MHZ;// Set DCO step + modulation*/ ? ?? ??? ? ?? ??
BCSCTL3 |= LFXT1S_2; // Set LFXT1為vol時鐘即12kHZ ? ?? ??? ? ?? ??
CCTL0|= CCIE;//設置捕獲/比較控制寄存器,CCIE=0x0010,使能捕獲比較中斷
CCR0 =6;//設置捕獲/比較寄存器,初始值為12000,對于ACLK時鐘頻率為12khz的頻率,相當于1s ? ?? ???TA0CTL = TASSEL_1 +TACLR+MC_1; // 設置定時器A控制寄存器, ? ?
// TASSEL_1選擇輔助時鐘ACLK,TASSEL_2選擇子系統時鐘SMCLK,與dco有關;
// TACLR=0x0004,清除定時器A計數器 ? ??
//TACTL |= MC0; //設置定時器A控制寄存器,MC0=0x0010,使計數模式為增計數 P1DIR=0XFF;
P1OUT=0xF0;
P2SEL=0;
_EINT();//使能中斷,這是一個C編譯器支持的內部過程。
LCK_OUT;
LCK_L;
while(1)
{
for(a=0;a<32;a++)//黑屏,用于開機狀態時刷屏,即關閉所有燈,沒有他的話開機會全屏點亮 ? ?? ?? ?? ?? ?dispram[a]=Bmp[0][a];? ?? ?? ? ?
delay(100);
for(zi=0;zi<13;zi++)//顯示效果:向右滾屏? ?? ?? ?? ? ? ?
rightdisplay();
for(zi=13;zi<25;zi++)//向右移動 ? ?? ?? ??
updisplay();
for(zi=24;zi<33;zi++)//顯示效果:向左滾屏? ?? ?? ?? ? ? ?? ?? ??
leftdisplay();
for(zi=32;zi<NUM;zi++)//向右移動 ? ?? ?? ?? ?
downdisplay();
delay(100);//所有字顯示完了的等待時間
}
}
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void) //定時器A的CC0中斷處理程序
{
row=P1OUT; //讀取當前顯示的行號 ? ?
row++;
row&=0x0f;//行號加1,屏蔽高4位 ? ? ?
if(zi<13)
toright(CHENG);
else if(zi<25&&zi>=12)
toupdown(GREEN);
else if(zi<33&&zi>=24)
toleft(RED);
else
toupdown(GREEN);
P1OUT&=0xf0;//行號端口清零 ?
LCK_H;//上升沿將數據送到輸出鎖存器 ? ?
P1OUT|=row; //寫入行號 ?
LCK_L;//鎖存顯示數據 }
unsigned char tab[8];
unsigned char DIS[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};//行數據
/*-----------------------------------------------
16x16漢字取模數據
------------------------------------------------*/
unsigned char hztest[32]= //二維數組,目的是減少運算,可以用最基本的一維數組,每個漢字有32個字節數據
{
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
};
/*-----------------------------------------------
向595寫入一個字節 單紅色
------------------------------------------------*/
void InputByte( unsigned char DataR1) //寫一個字節
{
unsigned char i;
for(i=0; i<8; i++)
{
if((DataR1&0x01) == 1)
{
R1_OUT_L;
}
else
{
R1_OUT_H;
}
SCK_OUT_L;
SCK_OUT_H;
DataR1 = DataR1 >> 1;
}
}
/*-----------------------------------------------
初始化定時器,做為動態掃描
------------------------------------------------*/
void Init_TimerA0(void)
{
CCTL0 = CCIE; // CCR0 interrupt enabled
CCR0 = 300;
TACTL = TASSEL_2 + MC_1; // SMCLK, contmode
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P1DIR |= BIT0; // P1.0 output
LATCH_OUT;
SCK_OUT;
OE_OUT;
R1_OUT;
G1_OUT;
A_OUT;
B_OUT;
C_OUT;
D_OUT;
Init_TimerA0();
_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
while(1);
}
// Timer A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
static unsigned char count,j,i;
// unsigned char i;
LATCH_OUT_L; //鎖存釋放
for(j=0;j<1;j++) //取每個漢字的前2個字節,數據傳輸完成后鎖存輸出即可 j表示漢字個數,如果是3個漢字屏就可以修改成3
{
InputByte(hztest[j*32+i]);
InputByte(hztest[j*32+i+1]);
}
OE_OUT_H;//暫時關閉屏幕,防止出現鬼影,如果沒有使用該引腳控制則會出現拖影現象。
LATCH_OUT_H; //鎖存有效,此時一行的數據顯示到屏上
P2OUT = DIS[15-count] & 0x0f;//用P2口的前4位控制16行,屏內部通過4-16譯碼器工作,循環掃描其他15行
OE_OUT_L;//使能
count++;
i+=2; //累加調用下一行數據
if(count==16)
count=0;
if(i==32)
i=0;
}
|