注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
lovedata的个人空间 https://home.eeworld.com.cn/space-uid-83057.html [收藏] [复制] [分享] [RSS]
日志

MSP430光影棒完整程序

已有 943 次阅读2009-1-19 13:44 |个人分类:光影棒

俺写的光影棒程序,因电脑上没并口,没法调试,请焊好的朋友们帮忙调试下,高手批评指正!

/****************************************************************************
NAME         :光影棒                                 
AUTHOR       :lovedata                           
DATE         :2009-01-17 
****************************************************************************/

#include "msp430x12x2.h"

typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ulong;

uchar k,num;
uint led16;

/**********************取字模***********************************/
const uint lao[]={ 
  0xBFF7,0xBBF7,0xBBFB,0xBBFB,0xBBFD,0xBBC1,0x80B6,0x3BB7,
  0x3BBB,0xBBBB,0x9BBD,0xABBD,0xB1BF,0xBB8F,0xBFFF,0xFFFF};//老

const uint po[]={ 
  0xFBFF,0xB67B,0x3D78,0xCF7A,0x73B3,0x9FA9,0xE1DB,0xCDD9,
  0xADDA,0x60AB,0xADB2,0xCD7A,0xED79,0xF979,0xFDFB,0xFFFF};//婆

const uint wo[]={   
  0xDFFB,0xDFFB,0xDDBD,0xDD7D,0x0180,0xDEFE,0xDEFE,0xDFEF,
  0xDFEF,0x00F7,0xDFF8,0xDDE5,0x53DE,0xDFBF,0xDF0F,0xFFFF};//我
 
const uint ai[]={
  0xFFBF,0xBFDF,0x4D5F,0x696F,0x65B3,0x6DB8,0x09D5,0x65D5,
  0x6CED,0x6EE5,0x66D9,0x68DD,0x6EBF,0x6F3F,0xCFBF,0xFFFF};//爱

const uint ni[]={ 
  0x7FFF,0xBFFF,0x0F80,0xD3FF,0xBCEF,0xDFF3,0x67FC,0xF0DE,
  0xF5BF,0x17C0,0xF7FF,0x77FF,0xD7FC,0xE3E3,0xF7F7,0xFFFF};//你

const uint xinxing[]={
  0x3FFE,0xDFFD,0xEFFB,0xF7F7,0xF7EF,0xEFDF,0xDFBF,0xBF7F,
  0xDFBF,0xEFDF,0xF7EF,0xF7F7,0xEFFB,0xDFFD,0x3FFE,0xFFFF};//心型


/*********延时1ms子程序**************************/
void delayMs(ulong Ms)
{
  ulong i,j;
  for(i = Ms; i > 0; i--)
    for(j = 2667; j > 0; j--);
}

/********延时1us子程序***************************/
void delayUs(ulong Us)
{
  ulong i,j;
  for(i = Us; i > 0; i--)
    for(j = 3; j > 0; j--);
}

/*******系统初始化********************************/
void initSys()
{
  volatile uint i;
  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 |=SELM_2+SELS;            //MCLR= XT2 (safe)

}

/************端口初始化*****************************/
void initPort()
{
  //将P3口,P1.0~P1.3,P2.0,P2.3~P2.5设置为输出方式
  P3DIR = 0xff;          //将P3口设置为输出方式
  P1DIR |= 0xff;         //P1口设置为输出方式
  P2DIR |= 0xf9;         //P2.1、P2.2设置为输入方式

  P2IE |= BIT1;          //管脚P2.1使能中断
  P2IES |= BIT1;         //下降沿使相应标志置位
  P2IE |= BIT2;          //管脚P2.2使能中断
  P2IES |= BIT2;         //下降沿使相应标志置位
  _EINT();           //开中断
}

/*****显示函数***************************************/
void display(void)
{
  uchar i;
  P2OUT  &= ~BIT5;       //红灯显示
  P2OUT  |= BIT0;     //绿灯不显示
  P3OUT = (led16>>4)&0x0f + (led16>>11)&0x10 + (led16>>9)&0x20 +

                    (led16>>7)&0x40 + (led16>>5)&0x80;
  P2OUT = (led16>>1)&0x1f;
  P1OUT = (led16>>6)&0x0f + (led16>>10)&0x60;
 
  switch(num)
  {
  case 0: for(i=0;i<16;i++)
            {
              led16 = lao[i];     //显示汉字“老”
              delayUs(100);
            }
          break;
  case 1: for(i=0;i<16;i++)
            {
              led16 = po[i];      //显示汉字“婆”
              delayUs(100);
            }
          break;
  case 2: for(i=0;i<16;i++)
            {
              led16 = wo[i];        //显示汉字“我”   
              delayUs(100);
            }
          break;
  case 3: for(i=0;i<16;i++)
            {
              led16 = ai[i];       //显示汉字“爱”
              delayUs(100);
            }
          break;
  case 4: for(i=0;i<16;i++)
            {
              led16 = ni[i];         //显示汉字“你”
              delayUs(100);
            }
          break;
  case 5: for(i=0;i<16;i++)
            {
              led16 = xinxing[i];   //显示心型
              delayUs(100);
            }
          break;
  default:  break;
  }
 
}

/***********************main函数*******************************/
void main( void )
{
    //stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  initSys();
  initPort();
  for(;;);
}

/**********************中断程序**********************/
#pragma vector=PORT2_VECTOR
__interrupt void Port2INTERRUPT()

{
  if(P2IFG & BIT1)
  {
    delayMs(5);         //去抖
    if(P2IFG & BIT1)
    {
      k= ~k;    
      if(k==1)        //光影棒向右摇显示
      {
        display();
      }
    }
    P1IFG &= ~(BIT1);      //清除中断标志位
    delayUs(10);
  }
  else if(P2IFG & BIT2)
  {
    delayMs(5);        //去抖
    if(P2IFG & BIT2)
    {
      num++;                  //计数
      if(num==6)num=0;
    }
    P1IFG &= ~(BIT2);      //清除中断标志位
    delayUs(10);
  } 
}

 

发表评论 评论 (3 个评论)
回复 lovedata 2009-1-19 21:10
还是没人过问?人都过年了啊!
回复 hanker510 2009-1-20 09:43
我刚看到 有时间帮你试试 快放假了 天天忙 :(
回复 lovedata 2009-1-20 15:13
谢了,有什么错误交流下哦!:handshake

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章