|
俺写的光影棒程序,因电脑上没并口,没法调试,请焊好的朋友们帮忙调试下,高手批评指正!
/****************************************************************************
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);
}
}