-
-
Save myguaguagua/a8842b05f6586c1acf4acece0dbc0be9 to your computer and use it in GitHub Desktop.
ssss
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "STC15F2K60S2.H" | |
#include <intrins.h> | |
#define uchar unsigned char | |
#define uint unsigned int | |
#define ADC_POWER 0x80 // adc总开关 | |
#define ADC_FLAG 0x10 | |
#define ADC_START 0x08 | |
#define ADC_SPEED_90 0x60 | |
#define ADC_CHS1_7 0x07 | |
void init(); | |
void game_ready_state(); | |
void game_process_state(); | |
void game_result_state(); | |
void nav_event1(); | |
void nav_event2(); | |
void do_500ms(); | |
void delay_ms(uint ); | |
uchar duanxuan[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //显示0-9 | |
uchar weixuan[] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07}; //数码管0-7 | |
uchar direction[] = {0x61,0x23,0x43,0x62,0x58,0x54,0x4c,0x1c}; // 左上右下 | |
sbit led_sel = P2^3; | |
sbit key1 = P3^2; | |
sbit key2 = P3^3; | |
uint flag_key3 = 0; | |
uint timer = 0; | |
uint seed = 218; // 随机数种子 | |
uint game_state = 0; // 0代表未开始,1代表正在游戏,2代表游戏结束 | |
uint score = 0; | |
uint time = 0; | |
uint keys[8]; | |
uint now_key; | |
uint life = 5; | |
uint isPress = 0; | |
void main() { | |
init(); | |
while(1) { | |
switch(game_state) { | |
case 0: | |
game_ready_state();break; | |
case 1: | |
TR0 = 1; | |
game_process_state();break; | |
case 2: | |
game_result_state();break; | |
} | |
} | |
} | |
void init() | |
{ | |
//设置为推挽输出 | |
P0M1 = 0x00; | |
P0M0 = 0xff; | |
P2M1 = 0x00; | |
P2M0 = 0xff; | |
led_sel = 0; //选择数码管作为输出 | |
P1ASF = 0x80; //P1.7作为模拟功能A/D使用 | |
ADC_RES = 0; //转换结果清零 | |
ADC_CONTR = 0x8F; //ADC_POWER = 1 | |
CLK_DIV=0X00; //ADRJ = 0 ADC_RES存放高八位结果 | |
flag_key3 = 0; | |
IT0 = 0; //设置IT0上升沿触发 | |
IT1 = 0; | |
EA = 1; //CPU开放中断 | |
ET0 = 1; | |
TMOD = 0x00; | |
TH0 = (65535-1000)/256; | |
TL0 = (65535-1000)%256; | |
} | |
uint getRand(int t) // 获得0~7的随机整数 | |
{ | |
uint temp1 = seed + seed * seed; | |
uint temp2 = t + t * t; | |
seed = temp1; | |
return (temp1 * temp2) % 7; | |
} | |
void timer_count() interrupt 1 | |
{ | |
TR0 = 0; | |
timer++; | |
if(timer == 1000) | |
timer = 0; | |
if(timer%500 == 0) | |
do_500ms(); | |
TR0 = 1; | |
} | |
void delay_ms(uint n) { | |
uint i; | |
while(n) { | |
i = 114; | |
while(i--); | |
n--; | |
} | |
} | |
uint wei_ready_flag = 0x05; | |
void game_ready_state() { | |
// 数码管显示 | |
uint bai, shi, ge; | |
uint duan; | |
uint i; | |
bai = seed / 100; | |
shi = seed / 10 % 10; | |
ge = seed % 10; | |
P0 = 0; | |
P2 = wei_ready_flag; | |
switch(wei_ready_flag) { | |
case 0x05: wei_ready_flag=0x06; duan=bai;break; | |
case 0x06: wei_ready_flag=0x07; duan=shi;break; | |
case 0x07: wei_ready_flag=0x05; duan=ge;break; | |
} | |
P0 = duanxuan[duan]; | |
// 导航键事件 | |
nav_event1(); | |
if(key1 == 0) { | |
for(i = 0; i < 8; i++) | |
keys[i] = -1; | |
game_state = 1; | |
} | |
} | |
unsigned char GetADC() | |
{ | |
uchar adc_res; | |
ADC_CONTR = ADC_POWER | ADC_START | ADC_SPEED_90 | ADC_CHS1_7; | |
_nop_(); | |
_nop_(); | |
_nop_(); | |
_nop_(); | |
while(!(ADC_CONTR&ADC_FLAG)); | |
ADC_CONTR &= ~ADC_FLAG; | |
adc_res = ADC_RES; | |
return adc_res; | |
} | |
uchar Keycheck() | |
{ | |
unsigned char key; | |
key=GetADC(); | |
if(key!=255) | |
{ | |
delay_ms(5); | |
key=GetADC(); | |
if(key!=255) | |
{ | |
key=key&0xE0; | |
key=_cror_(key,5); | |
return key; | |
} | |
} | |
return 0x07; | |
} | |
void nav_event1() | |
{ | |
uchar KEY_C; | |
uchar KEY_P; | |
KEY_C = Keycheck(); | |
if(KEY_C != 0x07){ | |
KEY_P = KEY_C; | |
while(KEY_C!=0x07) | |
KEY_C = Keycheck(); | |
switch(KEY_P){ | |
case 0x00 : | |
if(flag_key3 == 0) { | |
flag_key3 = 1; | |
} | |
else { | |
flag_key3 = 0; | |
} | |
break; | |
case 0x05 : | |
if(seed == 999){ | |
seed = 0; | |
} | |
else | |
seed++; | |
break; | |
case 0x02 : | |
if(seed == 0) | |
seed = 999; | |
else | |
seed--; | |
break; | |
} | |
} | |
} | |
uint gaming_wei_flag = 0; | |
void game_process_state() | |
{ | |
if(keys[0] == -1) | |
return; | |
P0 = 0; | |
led_sel = 0; | |
P2 = weixuan[gaming_wei_flag]; | |
P0 = direction[keys[gaming_wei_flag]]; | |
gaming_wei_flag++; | |
if(gaming_wei_flag == 8) | |
gaming_wei_flag = 0; | |
now_key = keys[0]; | |
if(isPress == 0) { | |
nav_event2(); | |
} | |
if(life <= 0 || score == 999) { | |
TR0 = 0; | |
game_state = 2; | |
} | |
P0 = 0; | |
led_sel = 1; | |
switch(life) { | |
case 5: | |
P0 = 0x1f;break; | |
case 4: | |
P0 = 0x0f;break; | |
case 3: | |
P0 = 0x07;break; | |
case 2: | |
P0 = 0x03;break; | |
case 1: | |
P0 = 0x01;break; | |
case 0: | |
P0 = 0x00;break; | |
} | |
} | |
void nav_event2() | |
{ | |
uchar KEY_C; | |
uchar KEY_P; | |
TR0 = 0; | |
KEY_C = Keycheck(); | |
if(KEY_C != 0x07){ | |
KEY_P = KEY_C; | |
//while(KEY_C!=0x07) | |
// KEY_C = Keycheck(); | |
isPress = 1; | |
switch(KEY_P){ | |
case 0x00 : | |
if(flag_key3 == 0) { | |
flag_key3 = 1; | |
} | |
else { | |
flag_key3 = 0; | |
} | |
break; | |
case 0x05 : // 向上 | |
if(now_key == 1 || now_key == 5) | |
score++; | |
else | |
life--; | |
break; | |
case 0x02 : // 向下 | |
if(now_key == 3 || now_key == 7) | |
score++; | |
else | |
life--; | |
break; | |
case 0x01: // 向右 | |
if(now_key == 2 || now_key == 6) | |
score++; | |
else | |
life--; | |
break; | |
case 0x04: // 向左 | |
if(now_key == 0 || now_key == 4) | |
score++; | |
else | |
life--; | |
break; | |
} | |
} | |
TR0 = 1; | |
} | |
void do_500ms() | |
{ | |
uint i; | |
time++; | |
if(keys[0]==-1) { | |
for(i = 0; i < 8; i++) { | |
keys[i] = getRand(time + i); | |
} | |
} else { | |
for(i = 0; i < 7; i++) { | |
keys[i] = keys[i+1]; | |
} | |
keys[7] = getRand(time+7); | |
} | |
if(isPress == 0) { | |
life--; | |
} | |
isPress = 0; | |
} | |
uint result_wei_flag = 0x05; | |
void game_result_state() | |
{ | |
uint bai, shi, ge; | |
uint duan; | |
led_sel = 0; | |
P0 = 0; | |
bai = score / 100; | |
shi = score /10 %10; | |
ge = score % 10; | |
P2 = result_wei_flag; | |
switch(result_wei_flag) { | |
case 0x05: result_wei_flag=0x06; duan=bai;break; | |
case 0x06: result_wei_flag=0x07; duan=shi;break; | |
case 0x07: result_wei_flag=0x05; duan=ge;break; | |
} | |
P0 = duanxuan[duan]; | |
if(key1 == 0) { | |
score = 0; | |
life = 5; | |
seed = 218; | |
time = 0; | |
game_state = 0; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment