msp430单片机实现猜数字游戏
七夕图片浪漫-高三数学教学计划
Msp430猜数字游戏设计
设计任务:
1. 先以一组四位数字为原版;
2. 游戏参与者依次输入所猜测的四位数字,单片机根据
所说入的四
位数字,进行提示xAyb,x为数字位置都正确的个数,y为数字正
确位置不正确
的个数;
3. 设置按键显示正确结果。
设计方案:
根据第一个实验
设计进行改变,在其基础上添加比较compare()
子函数,运行时调用次子函数进行比较。之后显
示结果。
设计目的:
体验单片机的趣味性。
程序代码:
#include
#define uchar unsigned char
#define uint
unsigned int
unsigned char
yuanshu[4]={9,4,7,3}; 设置原数组
unsigned char leddata[27]
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
=
0x80,0x
90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x8f,0xbf,0x89,0x
b9
,0xff,0x86,0xaf,0xcf,0xc7,0x91,0x8c};
unsigned char time[8] =
{0,10,0,11,0,0,0,0};初始数码管
unsigned
char getkey(void);
unsigned int
qiushu();
long compare();
void
qingping(void);
void fenjie();
void delay(unsigned int asdf)
{
for(uint asd=0;asd
;
*************************
主函数************************
void main(void)
{
uchar flag=0,i=9;
WDTCTL =
WDTPW + WDTHOLD; 关闭看门狗
P5DIR|=BIT7;
P5OUT&=~BIT7;
P4DIR=0xff;
P2DIR=0xff;
P1DIR=0x0F;
P1OUT=0xff;
while(1)
{ long p,q,r;
i=getkey();
if(i<10)
{
time[4]=time[5];
time[5]=time[6];
time[6]=time[7];
time[7]=i;
}
else {
switch(i)
{
case 12:
time[4]=yuanshu[0];
time[5]=yuanshu[1];
time[6]=yuanshu[2];
time[7]=yuanshu[3];
break;
case 13:time[0]=17;
p=qiushu();
qingping();
flag=13;
显示原数
break;
case 14:time[0]=18;
p=qiushu();
qingping();
flag=14;
break;
case
15:time[0]=19;
p=qiushu();
qingping();
flag=15;
break;
case 10: time[0] = 5;
time[1] = 1;
time[2] = 24;
time[3] = 24;
time[4] = 25;
time[5] = 26;
time[6] = 1;
time[7] = 9;
break;
显示silly pig
case 11:{q=compare();
调用compare函数
p=q10%10;
r=q%10;
time[0]=p;
time[2]=r;break;
if((r>9999)||(r<0)) {
qingping();
time[5]=21;
time[6]=21;
time[7]=22;
}
else fenjie(r);}
break;
}}
for(uchar j=0;j<=7;j++)
{
P4OUT=0x80>>j;
P2OUT=leddata[time[j]];
显示
delay(200);
}
}
}end of main
long compare()
添加比较compare()子函数
{
uchar
i,j,a=0,b=0,x,s;
for(i=4;i<=7;i++)
{
if(yuanshu[i-4]==time[i])
a++;
}
for(i=0;i<=4;i++)
{
for(j=4;j<=7;j++)
if(yuanshu[i]==time[j])
b++;
}
s=b-a;
x=a*10+s;
return(x);
}
unsigned int qiushu()
转化成相应的十进制整数
{unsigned int y;
y=time[2
]*100000+time[3]*10000+time[4]*1000+time[5]*100+ti
m
e[6]*10+time[7];
return y;
}
void qingping(void) 清除屏幕
{unsigned int
a;
for(a=7;a>1;a--)
time[a]=0;
}
void fenjie(long r) 提取十进制整数各位数值,并显示
{
time[7]=r%10;
time[6]=r10%10;
time[5]=r100%10;
time[4]=r1000%10;
time[3]=r10000%10;
time[2]=r100000%10;
}
long
factorial(long a)
{
long x,i;
x=a;
for(i=1;i {
x=x*(a-i);
}
return(x);
}
uchar getkey(void)
获取键值
{
uchar z,x=16;
P1OUT=0x00;
if((!(P1IN&BIT6))||(!(P1IN&
BIT7))||(!(P1IN&BIT5))||(!(P1IN&
BIT4)))
{
delay(10000);
if((!(P1
IN&BIT6))||(!(P1IN&BIT7))||(!(P1IN&BIT5))||(!(P1IN
&
BIT4)))
{
for(z=0;z<=1;z++)
{
P1OUT=~BIT0;
if(!(P1IN&BIT7))
{x=3;break;}
P1OUT=~BIT0;
if(!(P1IN&BIT6))
{x=7;break;}
P1OUT=~BIT0;
if(!(P1IN&BIT5))
{x=11;break;}
P1OUT=~BIT0;
if(!(P1IN&BIT4))
{x=15;break;}
line 1
P1OUT=~BIT1;
if(!(P1IN&BIT7))
{x=2;break;}
P1OUT=~BIT1;
if(!(P1IN&BIT6))
{x=6;break;}
P1OUT=~BIT1;
if(!(P1IN&BIT5))
{x=10;break;}
if(!(P1IN&BIT4))
{x=14;break;}
line3
P1OUT=~BIT3;
if(!(P1IN&BIT6))
{x=4; break;}
P1OUT=~BIT3;
if(!(P1IN&BIT7))
{x=0; break;}
P1OUT=~BIT3;
if(!(P1IN&BIT5))
{x=8; break;}
P1OUT=~BIT3;
if(!(P1IN&BIT4))
{x=12; break;}
line 2
P1OUT=~BIT2;
if(!(P1IN&BIT6))
{x=5; break;}
P1OUT=~BIT2;
if(!(P1IN&BIT7))
{x=1; break;}
P1OUT=~BIT2;
if(!(P1IN&BIT5))
{x=9; break;}
P1OUT=~BIT2;
if(!(P1IN&BIT4))
{x=13; break;}}
while((!(P1IN&BIT6))||(!(P1I
N&BIT7))||(!(P1IN&BIT5))||(!(P1
IN&BIT4)))
for(uchar j=0;j<=7;j++)
{
P4OUT=0x80>>j;
P2OUT=leddata[time[j]];
delay(500);
}
delay(20000);
while((!(P1IN&BIT6))||(!(P1IN&BIT7))||(!(P1IN&BI
T5))||(!(P1
IN&BIT4)))
for(uchar j=0;j<=7;j++)
{
P4OUT=0x80>>j;
P2OUT=leddata[time[j]];
delay(500);
}
delay(20000);
}
}
return (x);
}