⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xgame1.c

📁 this is source file games use mcs51
💻 C
字号:
/*  Filename     XGAME1.C
    Description  START-C51 RUNNING-NUMBER GAME
    Hardware     START-C51 
    MCU,Clock    89C51RD2,11.0592Mhz (X2)
    Compiler     Keil CA51 v5.1
    Programmer   Kriangsak B.
    Company      Sila Research Co.,Ltd. 

    Compile      Option C51
                 Option BL51 
*/

#include <reg51.h>
#include <absacc.h>
#include <assert.h>
#include <ctype.h>
#include <intrins.h>
#include <math.h>
#include <setjmp.h>
#include <stdarg.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/********** I/O PORT **********/

#define LCDWRC XBYTE [0x8000]          // lcd port 
#define LCDRDC XBYTE [0x8001]
#define LCDWRD XBYTE [0x8002]
#define LCDRDD XBYTE [0x8003]

#define USRA   XBYTE [0x9000]          // 8255 user 
#define USRB   XBYTE [0x9001]
#define USRC   XBYTE [0x9002]
#define USRP   XBYTE [0x9003]

#define SEGM   XBYTE [0xd000]          // segment 
#define KEYI   XBYTE [0xe000]          // Key-input,Dip-sw
#define DIGT   XBYTE [0xf000]          // Digit,BL,485con,sound,user-led

sbit    IPSCL  = P1^5;                 // I2C I/O Bit 
sbit    IPSDA  = P1^6;

/********** INT-RAM WORKING AREA **********/

unsigned char    DIGMEM;
unsigned char    DISBUF[6];
bit              KEYFAG;
unsigned char    NUMBUF[5];
unsigned char    NUMUSR;
unsigned char    SCORE;

/********** BASIC FUNCTION **********/

void dmsec (unsigned int count) {      // mSec Delay
    unsigned int i;                    // Keil CA51 (x2) 
    while (count) {
        i = 230; while (i>0) i--;
        count--;
    }
}

void sound (unsigned char freq,int time) {       // Sound Generate
    unsigned char i;
    while (time>0) {
        DIGMEM = DIGMEM & 0xbf;                  // out signal low
        DIGT = DIGMEM;
        for (i=1;i<=freq;i++)
            time--;
        DIGMEM = DIGMEM | 0x40;                  // out signal high
        DIGT = DIGMEM;
        for (i=1;i<=freq;i++)
            time--;
    }
}

void beepk1 (void) {sound (80,1000);}            // beep key 0-f
void beepk2 (void) {sound (60,1000);}            // beep key 10-13

unsigned char code SEGTAB[16] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
                                 0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
                                 // standard segment code

unsigned char htosx (unsigned char hex) {        // change hex to segment
    return (SEGTAB[hex]);
}

unsigned char code KEYTAB[] = {0x70,0x71,0x72,0x73,
                               0xb0,0xb1,0xb2,0xb3,
                               0xd0,0xd1,0xd2,0xd3,
                               0xe0,0xe1,0xe2,0xe3,
                               0x74,0xb4,0xd4,0xe4};
                               // 20 key table

unsigned char scan (void) {            // scan display & get key
    unsigned char i,j,x;
    bit pressok;
    pressok = 0;
    for (i=0;i<=5;i++) {
        DIGMEM = (DIGMEM & 0xf0) | i;  // out digit
        DIGT = DIGMEM;  
        SEGM = DISBUF[i];              // out segment
        dmsec(1);
        SEGM = 0;
        x = KEYI & 0x0f;               // check key
        if (x!=0x0f) {
            pressok = 1;
            if (!KEYFAG) {             // new press
                x = (x << 4) | i;
                for (j=0;j<=19;j++) {
                    if (x==KEYTAB[j]) {
                        if (j>0xf) beepk2 (); else beepk1 ();
                        KEYFAG = 1;
                        return (j);
                    }
                } 
            }
        }
    }
    if (!pressok) KEYFAG = 0;          // No any key press , clear KEYFAG (release)
    return (0xff);
}

/********** SPECIAL FUNCTION **********/

void display (void) {                  // display number
    unsigned char i;
    for (i=0;i<=5;i++) DISBUF[i] = 0;
    for (i=0;i<=4;i++) {
        if (NUMBUF[i]!=0xff) {
            DISBUF[i] = htosx (NUMBUF[i]);
        }
    }
    DISBUF[4] = DISBUF[4] | 0x80;      // dot
    DISBUF[5] = htosx (NUMUSR);
}

void shoot (void) {                    // shoot & check correct-digit
    unsigned char i,j;
    bit f;
    f = 0;
    if (NUMBUF[4]==NUMUSR) {NUMBUF[4] = 0xff; f = 1;}
    else if (NUMBUF[3]==NUMUSR) {NUMBUF[3] = 0xff; f = 1;}
    else if (NUMBUF[2]==NUMUSR) {NUMBUF[2] = 0xff; f = 1;}
    else if (NUMBUF[1]==NUMUSR) {NUMBUF[1] = 0xff; f = 1;}
    else if (NUMBUF[0]==NUMUSR) {NUMBUF[0] = 0xff; f = 1;}
    if (f) {
        for (i=0;i<=3;i++) {
            if (NUMBUF[i]==0xff) {
                for (j=i;j<=3;j++) NUMBUF[j] = NUMBUF[j+1];  
            }
        }
        sound (20,10000);
        SCORE++;
    }    
}

/********** MAIN **********/

void start (void) {                    // power-up or reset start program
    unsigned char i;
    SEGM = 0;                          // clear segment
    DIGMEM = 0xff;                     // Digit buffer port (don't care rs485)
    DIGT = DIGMEM;
    KEYFAG = 1;
    NUMUSR = 0;   
    for (i=0;i<=4;i++) 
        NUMBUF[i] = 0xff;
    SCORE = 0;
    dmsec (500);
}

void main (void) {                     // main program 
    unsigned char x,d,m,r;
    unsigned int s,c;    
    start ();
    s = 50;
    c = 0; 
    d = 9;
    while (1) {
        display ();                         // display number
        x = scan ();
        if (x==0x10) {                      // dec key
            srand (c); 
            NUMUSR--; 
            NUMUSR = NUMUSR & 0xf;
        }
        else if (x==0x11) {                 // inc key 
            srand (c); 
            NUMUSR++; 
            NUMUSR = NUMUSR & 0xf;
        }
        else if (x==0x12) {                 // enter key 
            srand (c); 
            shoot ();
        }
        c++; 
        if (c==s) {                         // sound 
            c = 0;
            sound (200,300); 
            d++;
            if (d==10) { 
                if (NUMBUF[4]!=0xff) {      // check gameover    
                    for (x=10;x<=200;x++)
                        sound (x,500);
                    while (scan ()==0xff);  // latch display
                    dmsec (500); 
                    return;                 // exit  
                }
                if (s>15) s = s - 2;        // speed up (limit)
                d = 0;                      // shift digit   
                NUMBUF[4] = NUMBUF[3];
                NUMBUF[3] = NUMBUF[2];
                NUMBUF[2] = NUMBUF[1];
                NUMBUF[1] = NUMBUF[0];
                do {                        // ganerate ramdom number
                    r = rand ();
                    r = r & 0xf;
                } 
                while (r==m); 
                m = r;
                NUMBUF[0] = r;
            } 
        }
        if (SCORE==20) {                    // check win 
            sound (80,10000);
            sound (60,10000);
            sound (40,10000);
            sound (20,10000);
            DISBUF[0] = 0x6e;               // YouWin
            DISBUF[1] = 0x5c;
            DISBUF[2] = 0x1c;
            DISBUF[3] = 0x3e;
            DISBUF[4] = 0x10;
            DISBUF[5] = 0x54;
            while (scan ()==0xff);          // latch display
            dmsec (500); 
            return;                         // exit  
        }
    }
}












⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -