钻石会员
主题
回帖0
积分25819
阅读权限50
注册时间2010-7-10
最后登录1970-1-1
在线时间 小时
|
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
#define dat P0
sbit rs=P1^0;
sbit rw=P1^1;
sbit e=P1^2;
sbit psb=P1^3;
sbit reset=P2^4;
sbit button=P2^6;
sbit finish=P2^7;
sbit buzzer=P3^7;
uchar busy; //1602判忙標志//
void delay_1ms(void); //延時程序
void display(uchar *t0,uchar *t1,uchar *t2,uchar *t3); //顯示程序
void busy_1602(void); //液晶查忙程序
void shj_1602(uchar a); //液晶寫數據程序
void int_1602(void); //液晶初始化
void zhl_1602(uchar a); //液晶寫指令程序
void delay(uint i);
void beep();
void clearscr();
uchar mode;
uchar n;
uchar comsum,comnow;
uchar usersum,usernow;
uchar rand0,rand1;
// " "
uchar code table0[16]={"====21翴村栏===="};
uchar code table1[16]={"?乃筿??舦┮Τ"};
uchar code table2[16]={"膀?LCD12864 "};
uchar code table3[16]={"?S21 秨﹍祇礟 "};
uchar code table4[16]={"筿福璶礟:S19秨﹍"};
uchar code table9[16]={"?S22 ?程沧秤璽"};
uchar code table5[16]={"?產璶礟: "};
uchar code table7[16]={"?S21 膥尿璶礟 "};
uchar code table8[16]={"?S22 挡?璶礟 "};
uchar code win[16]={"?尺眤 眤墓? "};
uchar code draw[16]={"叫?猳 琌キЫ "};
uchar code lose[16]={"?框狙 眤块? "};
uchar code restart[16]={"?RESET 龄?穝?"};
uchar code table6[16]={" "};
uchar code type[4]={0x03,0x04,0x05,0x06};
uchar code puke[13]={"1234567890JQK"};
uchar code num[10]={"0123456789"};
uchar tablecom[16]={" "};
uchar tableuser[16]={" "};
uchar comfen[16]={"筿福眔だ "};
uchar userfen[16]={"?產眔だ "};
//主程序//
void main(void)
{
int i=0;
mode=0;
psb=1;
reset=1;
n=0;
//m=1; //顯示順序輔助
TMOD=0x10; //設置為T1定時器
TH1=0xdd; //裝定時器初值
TL1=0xff;
TR1=1; //開中斷
ET1=1;
EA=1;
display(table0,table1,table2,table3);
for(;;)
{
if(!button && mode==0)
{
delay(4000);
if(!button)
{
//table0[15]=puke[n%13];
beep();
display(table5,table6,table7,table8);
mode=10;
}
}
if(!button && mode==10)//玩家要牌
{
delay(4000);
i=0;
usernow=0;usersum=0;
while(finish && mode==10)
{
if(!button)
{
delay(6000);
beep();
rand0=usernow;
usernow=n;
usernow=usernow%13;
usersum+=(usernow+1);
if(usersum>=21)
{
mode=11;
}
rand1=rand0+usernow;
rand1%=4;
tableuser[i]=type[rand1];
tableuser[i+1]=puke[usernow];
tableuser[14]=num[usersum/10];
tableuser[15]=num[usersum%10];
i+=2;
display(table5,tableuser,table7,table8);
}
}
mode=11;
display(table5,tableuser,table4,tablecom);
}
if(!button && mode==11)
{
delay(4000);
if(!button)
{
i=0;
comnow=0;comsum=0;
beep();
while(comsum>=0 && comsum<15)
{
rand0=comnow;
comnow=n;
comnow=comnow%13;
comsum+=(comnow+1);
rand1=rand0+comnow;
rand1%=4;
tablecom[i]=type[rand1];
tablecom[i+1]=puke[comnow];
tablecom[14]=num[comsum/10];
tablecom[15]=num[comsum%10];
display(table5,tableuser,table4,tablecom);
i+=2;
mode=21;
//table6[14]=puke[
}
display(table9,tableuser,table4,tablecom);
}
}
if(!finish && mode==21)
{
delay(4000);
if(!finish)
{
beep();
comfen[10]=num[comsum/10];
comfen[11]=num[comsum%10];
userfen[10]=num[usersum/10];
userfen[11]=num[usersum%10];
if(usersum>21 && comsum>21)
{
display(userfen,comfen,draw,restart);
}
if((usersum>0 && usersum<=21) && (comsum>0)&&(comsum<=21))
{
if(usersum>comsum)
display(userfen,comfen,win,restart);
if(usersum<comsum)
display(userfen,comfen,lose,restart);
if(usersum==comsum)
display(userfen,comfen,draw,restart);
}
if((usersum>0 && usersum<=21) && comsum>21)
display(userfen,comfen,win,restart);
if((comsum>0)&&(comsum<=21) && usersum>21)
display(userfen,comfen,lose,restart);
}
}
}
}
void clearscr()
{
display(table6,table6,table6,table6);
}
void beep()
{
unsigned int i;
//i=200;
//while(i--);
buzzer=0;
i=2000;
while(i--);
buzzer=1;
}
void delay(uint i)
{
while(i--);
}
//延時程序//
void delay_1ms(void)
{
uchar i,j;
for(i=0;i<10;i++)
for(j=0;j<20;j++);
}
//液晶顯示程序//
void display(uchar *t0,uchar *t1,uchar *t2,uchar *t3)
{
uchar i;
int_1602();
zhl_1602(0x80);
for(i=0;i<16;i++)
{
shj_1602(*(t0+i));
}
zhl_1602(0x90);
for(i=0;i<16;i++)
{
shj_1602(*(t1+i));
}
zhl_1602(0x88);
for(i=0;i<16;i++)
{
shj_1602(*(t2+i));
}
zhl_1602(0x98);
for(i=0;i<16;i++)
{
shj_1602(*(t3+i));
}
}
//查詢忙碌標志信號程序//
void busy_1602(void)
{
do
{
e=0;
rw=1;
rs=0;
e=1;
busy=dat;
e=0;
delay_1ms();
} while(busy&&0x80==1);
}
//寫指令到LCM程序//
void zhl_1602(uchar a)
{
busy_1602();
e=0;
rw=0;
rs=0;
e=1;
dat=a;
e=0;
}
//寫數據到LCM程序//
void shj_1602(uchar a)
{
busy_1602();
e=0;
rw=0;
rs=1;
e=1;
dat=a;
e=0;
}
//啓動LCM程序//
void int_1602(void)
{
zhl_1602(0x38); //8線控制模式
zhl_1602(0x0e);
zhl_1602(0x06);
}
void int1() interrupt 3 //T1中斷,時間是5ms
{
TR1=0; //關中斷
TH1=0xfd; //裝定時器初值實現5ms定時
TL1=0xff;
ET1=1; //開中斷
TR1=1;
n++;
//display1(1,2,3,4);
//display2(10,11,12,13);
} |
|