利用stc15f2k60s2设计一个0-99的猜数字游戏,4x4矩阵键盘设置0-9,将输入的值显示在数码管上,如果猜对了,就会发出声音,猜错了就在数码管上显示0-55,或者55-99
时间: 2024-04-02 16:36:07 浏览: 95
做一个猜数字的游戏,随机生成1~50之间的数字,然后有10次机会,供用户输入,判断是否猜中(使用for循环)
好的,这是一个利用STC15F2K60S2单片机设计的猜数字游戏。首先,需要配置4x4矩阵键盘,将其映射到单片机的相应引脚上,这样用户就可以通过键盘输入0-9的数字。然后,将输入的值显示在数码管上,可以通过数码管驱动芯片实现。
下面是代码实现的一些思路:
1. 初始化数码管和矩阵键盘的引脚;
2. 定义一个随机数,作为待猜的数字;
3. 循环读取键盘输入的值,直到用户猜对或者猜错5次;
4. 判断用户输入的值是否等于待猜的数字,如果相等,发出声音,并退出循环;
5. 如果猜错了,根据猜错的次数,在数码管上显示0-55或者55-99;
6. 如果猜错了5次,游戏结束。
下面是代码实现的一些关键部分:
```c
#include "reg51.h"
#include "intrins.h"
// 数码管位选引脚
sbit DIG1 = P2^2;
sbit DIG2 = P2^3;
sbit DIG3 = P2^4;
sbit DIG4 = P2^5;
// 数码管段选引脚
sbit LED_A = P1^0;
sbit LED_B = P1^1;
sbit LED_C = P1^2;
sbit LED_D = P1^3;
sbit LED_E = P1^4;
sbit LED_F = P1^5;
sbit LED_G = P1^6;
sbit LED_DP = P1^7;
// 矩阵键盘引脚
sbit ROW1 = P2^0;
sbit ROW2 = P2^1;
sbit ROW3 = P2^6;
sbit ROW4 = P2^7;
sbit COL1 = P3^0;
sbit COL2 = P3^1;
sbit COL3 = P3^2;
sbit COL4 = P3^3;
// 声音引脚
sbit SPEAKER = P2^6;
// 数码管显示表
unsigned char code LED_TBL[] = {
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
};
// 延时函数
void Delay(unsigned int n)
{
while(n--)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
// 数码管显示函数
void Display(unsigned char d1, unsigned char d2, unsigned char d3, unsigned char d4)
{
DIG1 = 0; P0 = LED_TBL[d1]; DIG1 = 1;
DIG2 = 0; P0 = LED_TBL[d2]; DIG2 = 1;
DIG3 = 0; P0 = LED_TBL[d3]; DIG3 = 1;
DIG4 = 0; P0 = LED_TBL[d4]; DIG4 = 1;
}
// 矩阵键盘扫描函数
unsigned char KeyScan()
{
unsigned char key = 0xff;
ROW1 = 0; if(COL1 == 0) {Delay(5); if(COL1 == 0) key = 1;}
if(COL2 == 0) {Delay(5); if(COL2 == 0) key = 2;}
if(COL3 == 0) {Delay(5); if(COL3 == 0) key = 3;}
if(COL4 == 0) {Delay(5); if(COL4 == 0) key = 10;}
ROW1 = 1;
ROW2 = 0; if(COL1 == 0) {Delay(5); if(COL1 == 0) key = 4;}
if(COL2 == 0) {Delay(5); if(COL2 == 0) key = 5;}
if(COL3 == 0) {Delay(5); if(COL3 == 0) key = 6;}
if(COL4 == 0) {Delay(5); if(COL4 == 0) key = 11;}
ROW2 = 1;
ROW3 = 0; if(COL1 == 0) {Delay(5); if(COL1 == 0) key = 7;}
if(COL2 == 0) {Delay(5); if(COL2 == 0) key = 8;}
if(COL3 == 0) {Delay(5); if(COL3 == 0) key = 9;}
if(COL4 == 0) {Delay(5); if(COL4 == 0) key = 12;}
ROW3 = 1;
ROW4 = 0; if(COL1 == 0) {Delay(5); if(COL1 == 0) key = 14;}
if(COL2 == 0) {Delay(5); if(COL2 == 0) key = 0;}
if(COL3 == 0) {Delay(5); if(COL3 == 0) key = 15;}
if(COL4 == 0) {Delay(5); if(COL4 == 0) key = 13;}
ROW4 = 1;
return key;
}
void main()
{
unsigned char num = 0, guess = 0, count = 0;
unsigned char d1 = 0, d2 = 0, d3 = 0, d4 = 0;
unsigned char flag = 0;
// 初始化数码管和矩阵键盘引脚
DIG1 = 1; DIG2 = 1; DIG3 = 1; DIG4 = 1;
P0 = 0xff;
ROW1 = 1; ROW2 = 1; ROW3 = 1; ROW4 = 1;
P3 = 0x0f;
while(1)
{
// 随机生成一个数字
if(flag == 0)
{
num = rand() % 100;
flag = 1;
}
// 显示当前猜测的数字
d1 = num / 100;
d2 = (num % 100) / 10;
d3 = num % 10;
d4 = guess;
Display(d1, d2, d3, d4);
// 读取键盘输入的值
if(count < 5)
{
unsigned char key = KeyScan();
if(key != 0xff)
{
if(key == 12) // 确认
{
if(guess == num)
{
// 猜对了,发出声音
SPEAKER = 0;
Delay(100);
SPEAKER = 1;
// 重新开始
flag = 0;
count = 0;
}
else
{
// 猜错了,显示0-55或者55-99
if(count < 2)
{
num = rand() % 56;
}
else
{
num = 55 + rand() % 45;
}
guess = 0;
count++;
}
}
else if(key == 13) // 取消
{
guess = 0;
}
else if(key == 14) // 退格
{
guess /= 10;
}
else // 数字键
{
if(guess == 0) guess = key;
else if(guess < 10) guess = guess * 10 + key;
}
}
}
else
{
// 猜错了5次,游戏结束
flag = 0;
count = 0;
}
}
}
```
注意事项:
1. 由于STC15F2K60S2单片机没有自带的随机数生成器,所以需要在程序中手动实现随机数的生成;
2. 在矩阵键盘扫描函数中,为了防止按键抖动,需要加上一些延时;
3. 由于数码管的显示是通过逐位扫描实现的,所以需要在显示函数中依次控制每个数码管的位选引脚,以及段选引脚的状态。
阅读全文