找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2194|回复: 0
打印 上一主题 下一主题
收起左侧

msp430g2553

[复制链接]
跳转到指定楼层
楼主
ID:110821 发表于 2016-3-26 00:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表