📄 xgame1.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 + -