|
#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;
//主系統(tǒng)時(shí)鐘切換為外部高速晶振
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時(shí)鐘即12kHZ ? ?? ??? ? ?? ??
CCTL0|= CCIE;//設(shè)置捕獲/比較控制寄存器,CCIE=0x0010,使能捕獲比較中斷
CCR0 =6;//設(shè)置捕獲/比較寄存器,初始值為12000,對(duì)于ACLK時(shí)鐘頻率為12khz的頻率,相當(dāng)于1s ? ?? ???TA0CTL = TASSEL_1 +TACLR+MC_1; // 設(shè)置定時(shí)器A控制寄存器, ? ?
// TASSEL_1選擇輔助時(shí)鐘ACLK,TASSEL_2選擇子系統(tǒng)時(shí)鐘SMCLK,與dco有關(guān);
// TACLR=0x0004,清除定時(shí)器A計(jì)數(shù)器 ? ??
//TACTL |= MC0; //設(shè)置定時(shí)器A控制寄存器,MC0=0x0010,使計(jì)數(shù)模式為增計(jì)數(shù) P1DIR=0XFF;
P1OUT=0xF0;
P2SEL=0;
_EINT();//使能中斷,這是一個(gè)C編譯器支持的內(nèi)部過(guò)程。
LCK_OUT;
LCK_L;
while(1)
{
for(a=0;a<32;a++)//黑屏,用于開(kāi)機(jī)狀態(tài)時(shí)刷屏,即關(guān)閉所有燈,沒(méi)有他的話開(kāi)機(jī)會(huì)全屏點(diǎn)亮 ? ?? ?? ?? ?? ?dispram[a]=Bmp[0][a];? ?? ?? ? ?
delay(100);
for(zi=0;zi<13;zi++)//顯示效果:向右滾屏? ?? ?? ?? ? ? ?
rightdisplay();
for(zi=13;zi<25;zi++)//向右移動(dòng) ? ?? ?? ??
updisplay();
for(zi=24;zi<33;zi++)//顯示效果:向左滾屏? ?? ?? ?? ? ? ?? ?? ??
leftdisplay();
for(zi=32;zi<NUM;zi++)//向右移動(dòng) ? ?? ?? ?? ?
downdisplay();
delay(100);//所有字顯示完了的等待時(shí)間
}
}
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void) //定時(shí)器A的CC0中斷處理程序
{
row=P1OUT; //讀取當(dāng)前顯示的行號(hào) ? ?
row++;
row&=0x0f;//行號(hào)加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;//行號(hào)端口清零 ?
LCK_H;//上升沿將數(shù)據(jù)送到輸出鎖存器 ? ?
P1OUT|=row; //寫(xiě)入行號(hào) ?
LCK_L;//鎖存顯示數(shù)據(jù) }
unsigned char tab[8];
unsigned char DIS[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};//行數(shù)據(jù)
/*-----------------------------------------------
16x16漢字取模數(shù)據(jù)
------------------------------------------------*/
unsigned char hztest[32]= //二維數(shù)組,目的是減少運(yùn)算,可以用最基本的一維數(shù)組,每個(gè)漢字有32個(gè)字節(jié)數(shù)據(jù)
{
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寫(xiě)入一個(gè)字節(jié) 單紅色
------------------------------------------------*/
void InputByte( unsigned char DataR1) //寫(xiě)一個(gè)字節(jié)
{
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;
}
}
/*-----------------------------------------------
初始化定時(shí)器,做為動(dòng)態(tài)掃描
------------------------------------------------*/
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++) //取每個(gè)漢字的前2個(gè)字節(jié),數(shù)據(jù)傳輸完成后鎖存輸出即可 j表示漢字個(gè)數(shù),如果是3個(gè)漢字屏就可以修改成3
{
InputByte(hztest[j*32+i]);
InputByte(hztest[j*32+i+1]);
}
OE_OUT_H;//暫時(shí)關(guān)閉屏幕,防止出現(xiàn)鬼影,如果沒(méi)有使用該引腳控制則會(huì)出現(xiàn)拖影現(xiàn)象。
LATCH_OUT_H; //鎖存有效,此時(shí)一行的數(shù)據(jù)顯示到屏上
P2OUT = DIS[15-count] & 0x0f;//用P2口的前4位控制16行,屏內(nèi)部通過(guò)4-16譯碼器工作,循環(huán)掃描其他15行
OE_OUT_L;//使能
count++;
i+=2; //累加調(diào)用下一行數(shù)據(jù)
if(count==16)
count=0;
if(i==32)
i=0;
}
|
|