[原创] msp430 作为游戏把柄玩俄罗斯方块 俄罗斯方块visual basic做的 源码

chouchick   2012-6-1 22:50 楼主
之前做课程设计vb做的俄罗斯方块电脑运行俄罗斯方块下位机msp430的四个按键操作上下左右

[ 本帖最后由 chouchick 于 2012-6-1 23:09 编辑 ]

回复评论 (9)

俄罗斯方块上位机vb部分

俄罗斯方块上位机vb部分
点赞  2012-6-1 23:00

msp430 下位机部分

//使用单片机的串口0
//P10~P13输入模式,接四个按键
//
#include <msp430x14x.h>

#define CPU_F ((double)8000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))

#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long

/*当BRCLK=CPU_F时用下面的公式可以计算,否则要根据设置加入分频系数*/
#define baud           9600                                //设置波特率的大小
#define baud_setting   (uint)((ulong)CPU_F/((ulong)baud))  //波特率计算公式
#define baud_h         (uchar)(baud_setting>>8)            //提取高位
#define baud_l         (uchar)(baud_setting)               //低位
#define KeyPort         P1IN   
//*************************************************************************
//                    系统时钟初始化
//*************************************************************************
void Clock_Init()
{
  uchar i;
  BCSCTL1&=~XT2OFF;                 //打开XT振荡器
  BCSCTL2|=SELM1+SELS;              //MCLK为8MHZ,SMCLK为8MHZ
  do{
    IFG1&=~OFIFG;                   //清除震荡标志
    for(i=0;i<100;i++)
       _NOP();                      //延时等待
  }
  while((IFG1&OFIFG)!=0);           //如果标志为1,则继续循环等待
  IFG1&=~OFIFG;
}
//*************************************************************************
//              MSP430内部看门狗初始化
//*************************************************************************
void WDT_Init()
{
   WDTCTL = WDTPW + WDTHOLD;       //关闭看门狗
}

//*************************************************************************
//               MSP430串口初始化
//*************************************************************************
void UART_Init()
{
  U0CTL|=SWRST;               //复位SWRST
  U0CTL|=CHAR;                //8位数据模式
  U0TCTL|=SSEL1;              //SMCLK为串口时钟
  U0BR1=baud_h;               //BRCLK=8MHZ,Baud=BRCLK/N
  U0BR0=baud_l;               //N=UBR+(UxMCTL)/8
  U0MCTL=0x00;                //微调寄存器为0,波特率9600bps
  ME1|=UTXE0;                 //UART1发送使能
  ME1|=URXE0;                 //UART1接收使能
  U0CTL&=~SWRST;
  IE1|=URXIE0;                //接收中断使能位
 
  P3SEL|= BIT4;               //设置IO口为普通I/O模式
  P3DIR|= BIT4;               //设置IO口方向为输出
  P3SEL|= BIT5;
}

//*************************************************************************
//              串口0发送数据函数
//*************************************************************************

void Send_Byte(uchar data)
{
  while((IFG1&UTXIFG0)==0);          //发送寄存器空的时候发送数据
    U0TXBUF=data;
}

//*************************************************************************
//               处理来自串口 0 的接收中断
//*************************************************************************

#pragma vector=UART0RX_VECTOR
__interrupt void UART0_RX_ISR(void)
{

}
//*************************************************************************
//            处理来自串口 0 的发送中断,预留
//*************************************************************************

#pragma vector=UART0TX_VECTOR
__interrupt void UART0_TX_ISR(void) Send_Byte(data);
{

}


/*************************************************************************
// 初始化IO口子程序
//*************************************************************************
void Port_init()
{

  P1SEL = 0x00;                   //P1普通IO功能
  P1DIR = 0xF0;                   //P10~P13输入模式,外部电路已接上拉电阻
}

//**********************************************************************
// 键盘扫描子程序,采用逐键扫描的方式
//**********************************************************************

uchar Key_Scan(void)
{
  uchar key_check;
  uchar key_checkin;
  key_checkin=KeyPort;           //读取IO口状态,判断是否有键按下
  key_checkin&= 0x0F;            //读取IO口状态,判断是否有键按下
  if(key_checkin!=0x0F)             //IO口值发生变化则表示有键按下
    {
      delay_ms(20);                   //键盘消抖,延时20MS
      key_checkin=KeyPort;
      if(key_checkin!=0x1F)
        { 
          key_check=KeyPort;
          switch (key_check & 0x0F)
            {
              case 0x0E:key=1;Send_Byte(key);break;
              case 0x0D:key=2;Send_Byte(key);break;
              case 0x0B:key=3;Send_Byte(key);break;
              case 0x07:key=4;Send_Byte(key);break;

            }
         
        }
     
   }
  else
   {
     key=0xFF;       
   }
  return key;
}

//*************************************************************************
//           主函数
//*************************************************************************
void main(void)
{
  WDT_Init();                         //看门狗设置
  Clock_Init();                       //系统时钟设置
  UART_Init();                        //串口设置初始化
  _EINT();                            //开中断
  while(1)                            //无限循环
    {Key_Scan();
    }
}

点赞  2012-6-1 23:02

vb上位机图片

vb上位机图片
  • eluosifangkuai.png
点赞  2012-6-1 23:06
很给力啊
点赞  2012-6-1 23:11

要是有个 ti的touchpad 触摸板代替按键

要是有一个ti的 touchpad 电容触摸板控制就给力了
ti是不是能给申请一个呢
点赞  2012-6-1 23:14

键盘poteus 的仿真 (51)

用51仿真 

由于我的msp430只有四个按键 所以就只能上下左右了

原来有51仿真的是有按键不限  所以启动暂停继续 停止就都上了键盘 

把proteus仿真也传上来

  • eluosifangkaui keyboard.png
点赞  2012-6-1 23:20

太赞了

点赞  2012-6-1 23:23
很牛啊楼主!!!有触摸键就更给力咯!
点赞  2012-6-2 10:36

回复 9楼 千里千寻 的帖子

其实很简单的你看看就懂了

希望eeworld能给个touchpad
点赞  2012-6-2 11:26
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复