Skip to content

Instantly share code, notes, and snippets.

@myguaguagua
Created September 13, 2017 07:59
Show Gist options
  • Save myguaguagua/a8842b05f6586c1acf4acece0dbc0be9 to your computer and use it in GitHub Desktop.
Save myguaguagua/a8842b05f6586c1acf4acece0dbc0be9 to your computer and use it in GitHub Desktop.
ssss
#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