#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;
}
|