keil单片机篮球计时计分1602液晶屏
时间: 2024-01-05 22:03:57 浏览: 88
单片机 1602 液晶显示
5星 · 资源好评率100%
以下是基于STC89C52单片机和1602液晶屏的篮球计时计分器的设计方法:
1. 首先,需要连接硬件。将1602液晶屏和按键连接到单片机上,并根据硬件原理图正确接线。
2. 然后,需要编写C代码。使用KEIL C语言编写代码,实现A、B队的分数统计,倒计时,比赛回合统计等功能。具体实现方法如下:
- 使用定时器中断实现计时器功能。在定时器中断服务函数中,更新计时器的值,并将其显示在液晶屏上。
- 使用外部中断实现按键功能。在外部中断服务函数中,根据按键的不同,更新分数、计时器等值,并将其显示在液晶屏上。
- 使用EEPROM存储数据。在比赛结束后,将比赛结果存储在EEPROM中,以便下次使用时读取。
3. 最后,将代码下载到单片机中,并进行测试。
```c
//头文件
#include <reg52.h>
#include <intrins.h>
//定义1602液晶屏的端口
#define LCD1602_DB P0
sbit LCD1602_RS = P2^6;
sbit LCD1602_RW = P2^5;
sbit LCD1602_E = P2^7;
//定义按键的端口
sbit KEY1 = P3^2;
sbit KEY2 = P3^3;
sbit KEY3 = P3^4;
sbit KEY4 = P3^5;
//定义计时器的变量
unsigned char second = 0; //秒
unsigned char minute = 10; //分
unsigned char attack_time = 24; //进攻时间
unsigned char round = 1; //回合数
//定义分数的变量
unsigned char score_A = 0; //A队分数
unsigned char score_B = 0; //B队分数
//函数声明
void init(); //初始化函数
void delay(unsigned int i); //延时函数
void write_com(unsigned char com); //写命令函数
void write_data(unsigned char dat); //写数据函数
void display(unsigned char *p); //显示函数
void timer0_init(); //定时器初始化函数
void key_scan(); //按键扫描函数
//主函数
void main()
{
init(); //初始化
timer0_init(); //定时器初始化
while(1)
{
key_scan(); //按键扫描
}
}
//初始化函数
void init()
{
write_com(0x38); //设置16*2显示,5*7点阵,8位数据接口
write_com(0x0c); //开显示,不显示光标
write_com(0x06); //写一个字符后指针加1,不移动屏幕
write_com(0x01); //清屏
}
//延时函数
void delay(unsigned int i)
{
while(i--);
}
//写命令函数
void write_com(unsigned char com)
{
LCD1602_RS = 0;
LCD1602_RW = 0;
LCD1602_E = 0;
_nop_();
LCD1602_DB = com;
delay(5);
LCD1602_E = 1;
_nop_();
LCD1602_E = 0;
}
//写数据函数
void write_data(unsigned char dat)
{
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_E = 0;
_nop_();
LCD1602_DB = dat;
delay(5);
LCD1602_E = 1;
_nop_();
LCD1602_E = 0;
}
//显示函数
void display(unsigned char *p)
{
while(*p != '\0')
{
write_data(*p++);
}
}
//定时器初始化函数
void timer0_init()
{
TMOD |= 0x01; //定时器0工作在模式1
TH0 = 0xfc; //定时器初值,1ms
TL0 = 0x18;
ET0 = 1; //开定时器0中断
TR0 = 1; //启动定时器0
EA = 1; //开总中断
}
//按键扫描函数
void key_scan()
{
if(KEY1 == 0) //按下KEY1,A队加一分
{
delay(1000); //延时去抖
if(KEY1 == 0)
{
score_A++;
write_com(0x01); //清屏
display("A:");
write_data(score_A + '0');
write_data(' ');
display("B:");
write_data(score_B + '0');
}
}
if(KEY2 == 0) //按下KEY2,B队加一分
{
delay(1000); //延时去抖
if(KEY2 == 0)
{
score_B++;
write_com(0x01); //清屏
display("A:");
write_data(score_A + '0');
write_data(' ');
display("B:");
write_data(score_B + '0');
}
}
if(KEY3 == 0) //按下KEY3,进攻时间减一秒
{
delay(1000); //延时去抖
if(KEY3 == 0)
{
attack_time--;
write_com(0x01); //清屏
display("Attack:");
write_data(attack_time / 10 + '0');
write_data(attack_time % 10 + '0');
write_data(' ');
display("Round:");
write_data(round + '0');
}
}
if(KEY4 == 0) //按下KEY4,回合数加一
{
delay(1000); //延时去抖
if(KEY4 == 0)
{
round++;
write_com(0x01); //清屏
display("Attack:");
write_data(attack_time / 10 + '0');
write_data(attack_time % 10 + '0');
write_data(' ');
display("Round:");
write_data(round + '0');
}
}
}
//定时器0中断服务函数
void timer0() interrupt 1
{
TH0 = 0xfc; //重新赋值
TL0 = 0x18;
second--; //秒数减一
if(second == 0xff) //如果秒数减到0,分数减一
{
second = 59;
minute--;
if(minute == 0xff) //如果分数减到0,比赛结束
{
minute = 10;
second = 0;
write_com(0x01); //清屏
display("Game Over!");
write_com(0xc0); //第二行
display("A:");
write_data(score_A + '0');
write_data(' ');
display("B:");
write_data(score_B + '0');
//将比赛结果存储在EEPROM中
//...
}
}
write_com(0x01); //清屏
display("Time:");
write_data(minute / 10 + '0');
write_data(minute % 10 + '0');
write_data(':');
write_data(second / 10 + '0');
write_data(second % 10 + '0');
write_data(' ');
display("Attack:");
write_data(attack_time / 10 + '0');
write_data(attack_time % 10 + '0');
write_data(' ');
display("Round:");
write_data(round + '0');
}
--相关问题--:
阅读全文