篮球计分板课设,模块化LCD1602,数码管,矩阵按键,方便移植,使得主函数简洁明了
适合普中的51开发板,也可以用与自己的课设,工程链接失效了记得1185956143@qq.com
代码,原理图PCB链接
http://链接:https://pan.baidu.com/s/1wlO2PWfKxHYvJptkxQI93w 提取码:2uhq --来自百度网盘超级会员V3的分享
篮球场计分板
要求:
开机1602显示:
两个按键实现A队的分数加减
两个按键实现B队的分数加减
一个启动键一个暂停键一个按键控制节数一个复位键
(1)开机数码管显示单节比赛时间12分00秒;
(2)矩阵键盘,sw1负责启动,倒计时开始; sw2暂停,sw3清零,清零后显示比赛时间12分00秒,LED显示也清零。
(3)设定每队每次进攻时间为24秒时间,当24秒时间到,进攻方违例,报警LED1~LED3闪烁三次,比赛时间暂停,换方开球进攻并启动计时时间;
(4)单节比赛结束4位数码管闪烁。
(5)进球:分A、B两队进球,两个按键分别表示得分,例如当A队进分球则按下A-SW三下分数加3分,当B队进分球则按下B-SW两下分数加2分 有问题可以加Q3492181286
主函数
#include <REGX52.H>
#include "Delay.h" //包含Delay头文件
#include "Nixie.h" //包含数码管头文件
#include "MatrixKey.h" //矩阵按键头文件
#include "LCD1602.h" //液晶屏头文件
#define NixieTable //定义数码管unsigned int a=0,i,b=0; //a,b分别为A,B队分数,i为节数
unsigned char KeyNum; //键盘
int min=12;sec=0;sec_24=24; //开机显示void Timer1Init() //定时器方式1
{TMOD|=0X10;TH1=0XFC;TL1=0X18; ET1=1;EA=1;TR1=1;
}
void main()
{Timer1Init(); //定时器初始化LCD_Init(); //LCD初始化LCD_ShowChar(1,2,'A'); //在1行1列显示字符ALCD_ShowString(1,8,"VS"); //在1行8列显示字符串VSLCD_ShowChar(1,15,'B'); //在1行14列显示字符BLCD_ShowNum(2,14,b,3); //在LCD的2行14列显示b,长度为3位LCD_ShowNum(2,1,a,3); //在LCD的2行14列显示a,长度为3位LCD_ShowNum(2,8,i,1); //在LCD的2行8列显示i,长度为1位TR1=0;while(1){ Nixie(1,min/10); //在数码管的第1位置显示1Nixie(2,min%10); //在数码管的第2位置显示2 Nixie(3,sec/10); //在数码管的第3位置显示0Nixie(4,sec%10); //在数码管的第4位置显示0 Nixie(5,sec_24/10); //在数码管的第5位置显示2Nixie(6,sec_24%10); //在数码管的第6位置显示4KeyNum=MatrixKey();if(KeyNum){if(KeyNum==1) //启动{TR1=1;}if(KeyNum==2) //按键2按下比赛时间暂停{TR1=0; }if(KeyNum==3) //按键3按下比赛时间复位{min=12;sec=0;sec_24=24;}if(KeyNum==5) //按键5按下A队分数加1{LCD_ShowNum(2,1,a=a+1,3);}while(KeyNum==5);if(KeyNum==6) //按键6按下B队分数加1{LCD_ShowNum(2,14,b=b+1,3);}while(KeyNum==6);if(KeyNum==4) //按键4按下节数1{LCD_ShowNum(2,8,i=i+1,1);}while(KeyNum==4); }if(sec_24==0) //24秒违规后led闪烁三次{TR1=0;sec_24=24;P2_3=1;P2_1=1;P2_2=1;Delay(500);P2_3=0;P2_1=0;P2_2=0;Delay(500);P2_3=1;P2_1=1;P2_2=1;Delay(500);P2_3=0;P2_1=0;P2_2=0;Delay(500);P2_3=1;P2_1=1;P2_2=1;Delay(500);P2_3=0;P2_1=0;P2_2=0;Delay(500);} if(min==0) //12分钟后lcd清零{LCD_ShowNum(2,1,0,3);LCD_ShowNum(2,14,0,3);LCD_ShowNum(2,8,0,1);P0=0;P0=1;Delay(500);P0=0;P0=1;Delay(500);}}
}void Timer1() interrupt 3 //实现数码管时间变化
{ unsigned int i;TH1=0XFC; TL1=0X18;i++; //以上四行为一秒的函数if(i==1000) //1000次计次时间为1秒{i=0;sec--;sec_24--; //秒自减} if(sec==0) {sec=59;min--; //分自减}
}
延时函数<Delay.c>
//延时子函数
void Delay(unsigned int xms)
{unsigned char i, j;while(xms--){i = 2;j = 239;do{while (--j);} while (--i);}
}
<Delay.h>
#ifndef __DELAY_H__
#define __DELAY_H__void Delay(unsigned int xms);#endif
数码管配置函数<Nixie.c>
#include <REGX52.H>
#include "Delay.h" //包含Delay头文件//数码管段码表
unsigned char NixieTable[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//数码管显示子函数
void Nixie(unsigned char Location,Number)
{switch(Location) //位码输出{case 1:P2_4=1;P2_3=1;P2_2=1;break;case 2:P2_4=1;P2_3=1;P2_2=0;break;case 3:P2_4=1;P2_3=0;P2_2=1;break;case 4:P2_4=1;P2_3=0;P2_2=0;break;case 5:P2_4=0;P2_3=1;P2_2=1;break;case 6:P2_4=0;P2_3=1;P2_2=0;break;case 7:P2_4=0;P2_3=0;P2_2=1;break;case 8:P2_4=0;P2_3=0;P2_2=0;break;}P0=NixieTable[Number]; //段码输出Delay(1); //显示一段时间P0=0x00; //段码清0,消影
}
<Nixie.h>
#ifndef __NIXIE_H__
#define __NIXIE_H__void Nixie(unsigned char Location,Number);#endif
矩阵按键<Key.c>
#include <REGX52.H>
#include "Delay.h"/*** @brief 矩阵键盘读取按键键码* @param 无* @retval KeyNumber 按下按键的键码值如果按键按下不放,程序会停留在此函数,松手的一瞬间,返回按键键码,没有按键按下时,返回0*/
unsigned char MatrixKey()
{unsigned char KeyNumber=0;P1=0xFF;P1_3=0;if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=1;}if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=5;}if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=9;}if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=13;}P1=0xFF;P1_2=0;if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=2;}if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=6;}if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=10;}if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=14;}P1=0xFF;P1_1=0;if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=3;}if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=7;}if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=11;}if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=15;}P1=0xFF;P1_0=0;if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=4;}if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=8;}if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=12;}if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=16;}return KeyNumber;
}
<Key.h>
#ifndef __MATRIXKEY_H__
#define __MATRIXKEY_H__unsigned char MatrixKey();#endif
LCD1602.c
#include <REGX52.H>//引脚定义
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_E=P2^7;
#define LCD_DataPort P0/*** @brief LCD1602延时函数,12MHz调用可延时1ms* @param 无* @retval 无*/
void LCD_Delay() //@12.000MHz 1ms
{unsigned char i, j;i = 2;j = 239;do{while (--j);} while (--i);
}/*** @brief LCD1602写命令* @param Command 要写入的命令* @retval 无*/
void LCD_WriteCommand(unsigned char Command)
{LCD_RS=0;LCD_RW=0;LCD_DataPort=Command;LCD_E=1;LCD_Delay();LCD_E=0;LCD_Delay();
}/*** @brief LCD1602写数据* @param Data 要写入的数据* @retval 无*/
void LCD_WriteData(unsigned char Data)
{LCD_RS=1;LCD_RW=0;LCD_DataPort=Data;LCD_E=1;LCD_Delay();LCD_E=0;LCD_Delay();
}/*** @brief LCD1602初始化函数* @param 无* @retval 无*/
void LCD_Init(void)
{LCD_WriteCommand(0x38);LCD_WriteCommand(0x0C);LCD_WriteCommand(0x06);LCD_WriteCommand(0x01);
}/*** @brief LCD1602设置光标位置* @param Line 行位置,范围:1~2* @param Column 列位置,范围:1~16* @retval 无*/
void LCD_SetCursor(unsigned char Line,unsigned char Column)
{if(Line==1){LCD_WriteCommand(0x80|(Column-1));}else{LCD_WriteCommand(0x80|(Column-1)+0x40);}
}/*** @brief 在LCD1602指定位置上显示一个字符* @param Line 行位置,范围:1~2* @param Column 列位置,范围:1~16* @param Char 要显示的字符* @retval 无*/
void LCD_ShowChar(unsigned char Line,unsigned char Column,unsigned char Char)
{LCD_SetCursor(Line,Column);LCD_WriteData(Char);
}/*** @brief 在LCD1602指定位置开始显示所给字符串* @param Line 起始行位置,范围:1~2* @param Column 起始列位置,范围:1~16* @param String 要显示的字符串* @retval 无*/
void LCD_ShowString(unsigned char Line,unsigned char Column,unsigned char *String)
{unsigned char i;LCD_SetCursor(Line,Column);for(i=0;String[i]!='\0';i++){LCD_WriteData(String[i]);}
}/*** @brief 返回值=X的Y次方*/
int LCD_Pow(int X,int Y)
{unsigned char i;int Result=1;for(i=0;i<Y;i++){Result*=X;}return Result;
}/*** @brief 在LCD1602指定位置开始显示所给数字* @param Line 起始行位置,范围:1~2* @param Column 起始列位置,范围:1~16* @param Number 要显示的数字,范围:0~65535* @param Length 要显示数字的长度,范围:1~5* @retval 无*/
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{unsigned char i;LCD_SetCursor(Line,Column);for(i=Length;i>0;i--){LCD_WriteData('0'+Number/LCD_Pow(10,i-1)%10);}
}/*** @brief 在LCD1602指定位置开始以有符号十进制显示所给数字* @param Line 起始行位置,范围:1~2* @param Column 起始列位置,范围:1~16* @param Number 要显示的数字,范围:-32768~32767* @param Length 要显示数字的长度,范围:1~5* @retval 无*/
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length)
{unsigned char i;unsigned int Number1;LCD_SetCursor(Line,Column);if(Number>=0){LCD_WriteData('+');Number1=Number;}else{LCD_WriteData('-');Number1=-Number;}for(i=Length;i>0;i--){LCD_WriteData('0'+Number1/LCD_Pow(10,i-1)%10);}
}/*** @brief 在LCD1602指定位置开始以十六进制显示所给数字* @param Line 起始行位置,范围:1~2* @param Column 起始列位置,范围:1~16* @param Number 要显示的数字,范围:0~0xFFFF* @param Length 要显示数字的长度,范围:1~4* @retval 无*/
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{unsigned char i;unsigned char SingleNumber;LCD_SetCursor(Line,Column);for(i=Length;i>0;i--){SingleNumber=Number/LCD_Pow(16,i-1)%16;if(SingleNumber<10){LCD_WriteData('0'+SingleNumber);}else{LCD_WriteData('A'+SingleNumber-10);}}
}/*** @brief 在LCD1602指定位置开始以二进制显示所给数字* @param Line 起始行位置,范围:1~2* @param Column 起始列位置,范围:1~16* @param Number 要显示的数字,范围:0~1111 1111 1111 1111* @param Length 要显示数字的长度,范围:1~16* @retval 无*/
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{unsigned char i;LCD_SetCursor(Line,Column);for(i=Length;i>0;i--){LCD_WriteData('0'+Number/LCD_Pow(2,i-1)%2);}
}
LCD1602.h
#ifndef __LCD1602_H__
#define __LCD1602_H__void LCD_Init(void);
void LCD_ShowChar(unsigned char Line,unsigned char Column,unsigned char Char);
void LCD_ShowString(unsigned char Line,unsigned char Column,unsigned char *String);
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length);
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);#endif
篮球计分板课设,模块化LCD1602,数码管,矩阵按键,方便移植,使得主函数简洁明了相关推荐
- 计组课设:单周期31条MIPS指令CPU设计(含代码)
多周期54条CPU:计组课设:多周期54条MIPS指令CPU设计(含代码)_孔艺菲的博客-CSDN博客 单周期CPU源码:while-TuRe/Single-cycle-CPU31 (github.c ...
- 记大学计网课设——基于B/S架构的视频点播系统设计
中南大学 计算机网络课程设计报告 题 目 基于WEB的视频点播系统设计 学生姓名 指导教师 学 院 信息科学与工程学院 专业班级 二○一七 年 九 月 目录 一.需求分析...5 1.题目 ...
- 电子邮件客户端程序设计与实现 c++ 计网课设
电子邮件客户端程序设计与实现 C++实现 telnet功能启用 用telnet发送电子邮件 总结一下这次课设,内附代码. 这次课设尝试过一些别人的代码,一些是不能自定义标题和内容, 有一些更直接,连发 ...
- 计网课设 模拟实验拓扑
一:前言 幸福的是考完两科了,抽出时间赶紧赶赶课设,两周遇到了好多事,开心的,烦心的,一堆堆的压过来,但庆幸自己迷失不太久,又能继续学习了 二:实验概览 1:实验拓扑图 2:实验要求 要求:route ...
- 【计网课设】---网络工程方向---医院局域网规划方案
前言: 自己大二做的课程设计,用了Cisco Packet Tracer画拓扑图,用画图工具亿图绘制网络地图,excel记录了一些IP地址等信息,word记录课设总结.一些地方也不是很完善,不能符合实 ...
- 2022山东大学软件学院计算机组成与课程设计(计组课设)分享防踩坑
目录 课程主要内容 课程时间: 学分: 小Tips: 经验分享: 关于地址写入的简单介绍 关于脉冲速度调节 关于清零端的问题 踩坑注意事项: 一些具体实验器件的介绍: 总图的介绍: 选择器: IR指令 ...
- Android jetpack 篮球计分板的实现
使用到了DataBinding+ViewModel+LiveData 这里是分数 小小遗憾就是撤回也只能撤回上一次的数据 但是完善这个功能不是重点 重点是..jetpack的使用 package co ...
- 超超超超超详细的计网课设报告-简单电子邮件客户端的设计与实现
简单电子邮件客户端的设计与实现 目录 题 目: 简单电子邮件客户端的设计与实现- 1 一. 设计背景- 1 二. 设计内容及目的- 1 三. 设计环境- 2 四. 预备知识- 2 五. 设计思路- 6 ...
- 计网课设(智能酒店客房)
网盘源码超链接,提取码:jw67 题目要求: 实现一个基于socket的物联网服务器,接收来自客户端的数据.实现一个物联网客户 端,模拟设备.客户端产生数据,发送至服务器, 服务器根据协议对数据作出处 ...
最新文章
- 优秀的数据分析师应该具备哪些技能和特质?
- java set第n位_Java学习路线:float在内存中的存储
- redis主从复制部署策略+jedis设置主从
- 数据结构 —— 树状数组
- 模块(module)
- Go实现简单负载均衡
- 万字长文,SpringSecurity
- ajax中data传参报错
- 【es】es 写入流程
- OC高效率52之提供“全能初始化”方法
- Linux内核中的信号量解析
- Java前端如何发送date类型的参数给后端
- 在Android的Termux超级终端下进行内网穿透
- AndroidSDK和ADT下载地址
- 烽火服务器查询服务器型号,烽火服务器应该起的进程
- 静态路由配置(目的下一跳)
- openbsd mysql_在OpenBSD上运行MyDNSNameservers(MySQL / PHP + MyDNS + MyDNSConfig)
- JavaScript 之 学习网站推荐 强推【javascript.info】
- 这是一份优秀的餐饮行业微信营销解决方案
- 补天漏洞响应平台基本介绍
热门文章
- 云米冰箱能控制扫地机器人_在云米的大屏冰箱就能操控其他智能家电?一起到京东618了解更多...
- isis-概述及实验
- 数字电路实验怎么接线视频讲解_时间继电器怎么看图接线?这可是星三角接触器接线必备元件...
- VS Code-SynthWave '84主题与字体霓虹灯(发光)效果 小白安装教程
- MDK5 Kil5中STM32工程的建立过程
- mysql中ddl和ddm_对话DDM:分布式数据库中间件全解析
- PHP正则中的i,m,s,x,e分别表示什么
- java zip 压缩工具类
- 零点城市社交电商v2.1.8.0
- 论文写作步骤和技巧梳理