当前位置:文档之家› msp430单片机实现猜数字游戏

msp430单片机实现猜数字游戏

Msp430猜数字游戏设计设计任务:1.先以一组四位数字为原版;2.游戏参与者依次输入所猜测的四位数字,单片机根据所说入的四位数字,进行提示xAyb,x为数字位置都正确的个数,y为数字正确位置不正确的个数;3.设置按键显示正确结果。

设计方案:根据第一个实验设计进行改变,在其基础上添加比较compare()子函数,运行时调用次子函数进行比较。

之后显示结果。

设计目的:体验单片机的趣味性。

程序代码:#include <msp430x14x.h>#define uchar unsigned char#define uint unsigned intunsigned char yuanshu[4]={9,4,7,3}; //设置原数组//unsigned char leddata[27] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x8f,0xbf,0x89,0xb9 ,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<asdf;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; //显示silly pig time[1] = 1;time[2] = 24;time[3] = 24;time[4] = 25;time[5] = 26;time[6] = 1;time[7] = 9;break;case 11:{q=compare(); //调用compare函数 p=q/10%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 mainlong 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+tim 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]=r/10%10;time[5]=r/100%10;time[4]=r/1000%10; time[3]=r/10000%10; time[2]=r/100000%10; }long factorial(long a) {long x,i;x=a;for(i=1;i<a;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((!(P1IN&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))P1OUT=~BIT0;if(!(P1IN&BIT5)) {x=11;break;}P1OUT=~BIT0;if(!(P1IN&BIT4)) {x=15;break;}//line 1P1OUT=~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;}//line3if(!(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 2P1OUT=~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))||(!(P1IN&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&BIT5))||(!(P1 IN&BIT4)))for(uchar j=0;j<=7;j++){P4OUT=0x80>>j;P2OUT=leddata[time[j]];delay(500); }delay(20000);}}return (x);}。

相关主题