原创 科技节作品

2007-12-10 00:08 4950 7 7 分类: MCU/ 嵌入式

一年一次的科技节快到了,想想也没什么好做的,后来想做个模拟街机的一种小游戏吧,一个按键来定位三个数字,在1602中显示,如果三个数字相等,刚显示一段多样流水灯


/********************************************************************************
* 描述: *
* 1602三个数字游戏 *
   有彩灯和音乐衔接
 相关接口如下:
 1602的4~14脚分别接P2^7,P2^6,P2^5,P0.0~P0.7
   按键位P2.4
 流水灯接P1口
********************************************************************************/
#include
#include
#define uchar unsigned char
#define uint unsigned int
int i1,i2,i3;
sbit P2_4 = P2 ^ 4;//按键位
uchar dis_buf; //显示缓存
uchar temp;
sbit LCD_RS = P2^7;
sbit LCD_RW = P2^6;
sbit LCD_EN = P2^5;
uchar code cdis1[ ] = {"GOOD LUCK"};
uchar code cdis2[ ] = {"K:"};
uchar code cdis3[ ] = {"you lose"};
uchar code cdis4[ ] = {"try again !"};
int d01,d02,d03;
uchar m;
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
void delay(uchar x);
void delay2(uchar x);
void delay3(uchar x);
void delay4(uchar x);
void lcd_wcmd(uchar cmd);
void lcd_wdat(uchar dat);
void lcd_init();
void lcd_pos(uchar pos);
void chushihua();
void ky0();
void ky1();
void ky2();
void liushui();
void shibai();
/*************************************************************/
/* */
/* 花样流水灯程序 */
/* */
/*************************************************************/
void liushui()
{
const unsigned char design[33]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,
               0xff,0xff,0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x18,0x3C,
      0x7e,0xff,0x81,0xc3,0xe7,0xff, 0xff,0xef,0xc3,0x81,0xff,
      0x7e,0x3c,0x18};
unsigned  int a;
unsigned  char b;
  for(b=0;b<34;b++)
    { 
     for(a=0;a<30000;a++)
P1=design;
 }
}
/*************************************************************/
/* */
/* 延时子程序 (快速)*/
/* */
/*************************************************************/
void delay(uchar x)
{ uchar j;
while((x--)!=0)
{ for(j=0;j<125;j++) 
{;}
}
}
/*************************************************************/
/* */
/* 延时子程序2(中速) */
/* */
/*************************************************************/
void delay2(uchar x)
{ uchar j;
while((x--)!=0)
{ for(j=0;j<150;j++) 
{;}
}
}
/*************************************************************/
/* */
/* 延时子程序3*(慢速)/
/* */
/*************************************************************/
void delay3(uchar x)
{ uchar j;
while((x--)!=0)
{ for(j=0;j<200;j++) 
{;}
}
}
/*************************************************************/
/* */
/* 延时子程序4*(很慢速)/
/* */
/*************************************************************/
void delay4(uchar x)
{ uchar j,k;
while((x--)!=0)
{ for(j=0;j<100;j++) 
{for(k=0;k<100;k++);
}
}
}
/*************************************************************/
/* */
/*检查LCD 忙状态 */
/*lcd_busy 为1 时,忙,等待。lcd-busy 为0 时,闲,可写指令与数据 */
/* */
/*************************************************************/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P0&0x80);
LCD_EN = 0;
return(result);
}
/*******************************************************************/
/* */
/*写指令数据到LCD */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
/* */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/*******************************************************************/
/* */
/*写显示数据到LCD */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
/* */
/*******************************************************************/
void lcd_wdat(uchar dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/*************************************************************/
/* */
/* LCD 初始化设定 */
/* */
/*************************************************************/
void lcd_init()
{
delay(15);
lcd_wcmd(0x38); //16*2 显示,5*7 点阵,8 位数据
delay(5);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x0c); //显示开,关光标
delay(5);
lcd_wcmd(0x06); //移动光标
delay(5);
lcd_wcmd(0x01); //清除LCD 的显示内容
delay(5);
}
/*************************************************************/
/* */
/* 设定显示位置 */
/* */
/*************************************************************/
void lcd_pos(uchar pos)
{
lcd_wcmd(pos | (0x80)); //数据指针=80+地址变量
}
/*************************************************************/
/* */
/* 初始化 */
/* */
/*************************************************************/
void chushihua()//初始化,显示 good luck    k:
{
delay(10); //延时
lcd_init(); //初始化LCD
lcd_pos(0); //设置显示位置为第一行的第1个字符
m = 0;
while(cdis1[m] != '\0')
{ //显示字符
lcd_wdat(cdis1[m]);
m++;
}
lcd_pos(0x40); //设置显示位置为第二行第1 个字符
m = 0;
while(cdis2[m] != '\0')
{
lcd_wdat(cdis2[m]); //显示字符
m++;
}
}
/*************************************************************/
/* */
/* 三个数值不一样时 */
/* */
/*************************************************************/
void shibai()//三个数字不一样时,显示you lose, try again please维持三秒左右
{
delay(10); //延时
lcd_init(); //初始化LCD
lcd_pos(0); //设置显示位置为第一行的第1个字符
m = 0;
while(cdis3[m] != '\0')
{ //显示字符
lcd_wdat(cdis3[m]);
m++;
}
lcd_pos(0x40); //设置显示位置为第二行第1 个字符
m = 0;
while(cdis4[m] != '\0')
{
lcd_wdat(cdis4[m]); //显示字符
m++;
}
}
/************************************************************/
/* */
/* 0~9循环等待第一次按键 */
/* */
/*************************************************************/


void ky0()//无按键按下
{
i1=0;
P2_4=1;
for(i1=0;i1<10;i1++)
{
dis_buf = i1;//键值入显示缓存
dis_buf = dis_buf & 0x0f;
dis_buf = dis_buf+0x30;
lcd_wcmd(0xc3);
lcd_wdat(dis_buf);
delay3(250);//慢速循环
d01=i1;
if(P2_4!=1)//有一次按键按下
{
delay(5);
if(P2_4!=1)
ky1();
}
}
ky0();
}
/************************************************************/
/* */
/* 9~0循环等待第二次按键按下 */
/* */
/*************************************************************/
void ky1()//一次按键情况
{
i2=0;
P2_4=1;
for(i2=9;i2>=0;i2--)
{
dis_buf = i2;//键值入显示缓存
dis_buf = dis_buf & 0x0f;
dis_buf = dis_buf+0x30;
lcd_wcmd(0xc4);
lcd_wdat(dis_buf);
delay2(250);//中速循环
d02=i2;
if(P2_4!=1)//第二次按键按下
{
delay(5);
if(P2_4!=1)
ky2();
}
}
ky1();
}
/************************************************************/
/* */
/* 0~9循环等待第三次按键按下,如果有第三次按键按下,处理显示的数值是否相等的问题 */
/* */
/*************************************************************/
void ky2()//二次按键情况
{
i3=0;
P2_4=1;
for(i3=0;i3<10;i3++)
{
dis_buf = i3;//键值入显示缓存
dis_buf = dis_buf & 0x0f;
dis_buf = dis_buf+0x30;
lcd_wcmd(0xc5);
lcd_wdat(dis_buf);
delay(250);//快速循环
d03=i3;


if(P2_4!=1)//第三次按键按下
{
delay(5);
if(P2_4!=1)
{


if(d01==d02&&d02==d03&&d03==d01)//判断三个数值是否相等
{
liushui();//花样流水灯程序
P1=0xFF;
delay(5);
chushihua();//初始化
d01=d02=d03=0;
delay(5);
ky0();
}


else
{
shibai();
delay4(80);
chushihua();
d01=d02=d03=0;
ky0();
}


}


}


}
ky2();
}
/*************************************************************/
/* */
/*判断键是否按下 */
/* */
/*************************************************************/
main()
{
P0=0xFF; //置P0 口
P2=0xFF; //置P2 口
chushihua();//初始化
while(1)
{
ky0();
}
}
/************************************************************/

文章评论0条评论)

登录后参与讨论
我要评论
0
7
关闭 站长推荐上一条 /2 下一条