数码管

数码管是由多个发光二极管封装在一起组成8字型的器件。
led数码管(LED Segment Displays)由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,只需引出它们的各个笔划,公共电极。数码管实际上是由七个发光管组成8字形构成的,加上小数点就是8个。这些段分别由字母a,b,c,d,e,f,g,dp来表示。

数码管模块原理图

如图,这是一个8位共阴极数码管,其引脚多达24只。而单片机IO口有限,假如数码管所有引脚都接入单片机的IO口那么其他IO设备就无口可用了。所以,我们常常用多个锁存器来辅助单片机驱动数码管。
74HC573锁存器模块原理图

关键引脚说明:
LE:锁存使能。LE处于高电平时,输出口电平随输入口改变。LE处于低电平时,输出口保持原先的值。无论输出口电 平如何变化。
OE:一般情况接地,可以认为时一个开关。

我们将两颗74HC573串联使用。U8作为位选锁存器,U9作为段选锁存器。
这是74HC573的真值表

当OE脚处于低电平时:
LE为高电平时,输出脚Q随输入脚D改变。
LE为低电平时,输出脚Q不随输入脚D改变。且输出脚Q为原来的值。
当OE处于高电平时:
74HC573将会处于高阻抗状态。

示例程序:

#include <reg52.h>
#include <intrins.h>sbit WE = P2^7;
sbit DU = P2^6;//数码管段选
unsigned char code SMGduan[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
//数码管位选
unsigned char code SMGwei[] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef};//延时函数
void delay(unsigned char z) {unsigned char x, y;for (x = z; x > 0; x--){for (y = 114; y > 0; y--);}
}//数码管驱动函数
void display(unsigned char i)
{static unsigned char wei;P0 = 0xff;  //清除断码WE = 1;     //打开位选P0 = SMGwei[wei];WE = 0;     //锁存位选switch(wei){case 0: DU = 1; P0 = SMGduan[i/10000]; DU = 0;          break;case 1: DU = 1; P0 = SMGduan[i % 10000 / 1000]; DU = 0; break;  case 2: DU = 1; P0 = SMGduan[i % 1000 / 100]; DU = 0;   break;case 3: DU = 1; P0 = SMGduan[i % 100 / 10]; DU = 0;     break;case 4: DU = 1; P0 = SMGduan[i % 10]; DU = 0;           break; }wei++;  //wei自增扫描下一位if(wei == 5)//位数上限wei = 0;
}int main()
{while(1){delay(3);   //延迟刷新,消除余辉影响。后期可用定时器保持显示display(1); //显示内容}return 0;
}

独立按键

独立按键原理图

如图,以S2为例。S2的1脚接地,2脚接入IO口P30。当S2按下,P30接地。此时,通过程序检测到P30为低电平从而判断出S2被按下。
示例程序:

#include <reg52.h>sbit led = P1^0;    //led定义在P10
sbit keyS2 = P3^0;  //键盘定义在P30//延时函数
void delay(unsigned int z) {unsigned int x, y;for(x = z; x>0; x--)for(y = 114; y > 0;y--);
}int main()
{while(1){if(!keyS2){delay(50);  //软件防抖if(!keyS2) led = ~led;}while(!keyS2);  //松手检测}return 0;
}

关于按键抖动
在机械按键的触点闭合和断开时,都会产生抖动,为了保证系统能正确识别按键的开关,就必须对按键的抖动进行处理。按键的抖动对于人类来说是感觉不到的,但对单片机来说,则是完全可以感应到的,而且还是一个很“漫长”的过程,因为单片机处理的速度在“微秒”级,而按键抖动的时间至少在“毫秒”级。单片机如果在触点抖动期间检测按键的通断状态,则可能导致判断出错,即按键一次按下或释放被错误地认为是多次操作,从而引起误处理。因此,为了确保单片机对一次按键动作只作一次响应,就必须考虑如何消除按键抖动的影响。

我们通过延时双重判断按键状态来为按键消除抖动。

矩阵键盘

矩阵键盘模块原理图

为每个键盘都单独配备一个IO口是不合理的。因此,矩阵键盘常用行列扫描来确定某个按键是否被按下。
示例程序:

#include <reg52.h>sbit DU = P2^6; //数码管段选
sbit WE = P2^7; //数码管位选//共阴极数码管段选表
unsigned char code table[] = {//0-90x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f,//A   B     C     D     E     F     H     L     n     u   0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x71, 0x76, 0x37, 0x3e,//-   熄灭0x40, 0x00};
unsigned int num = 0;   //数码管显示的值
unsigned char KeyValue = 20; //按键值void delay(unsigned int z) {unsigned int x, y;for(x = z; x>0; x--)for(y = 114; y > 0;y--);
}void KeyScan() {//4*4矩阵键盘扫描P3 = 0xf0; //列扫描if(P3 != 0xf0) {delay(100);if(P3 != 0xf0) {switch(P3) {case 0xe0: KeyValue = 0;    break;case 0xd0: KeyValue = 1;    break;case 0xb0: KeyValue = 2;    break;case 0x70: KeyValue = 3;    break;}P3 = 0x0f; //行扫描switch(P3) {case 0x0e: ;                 break;case 0x0d: KeyValue += 4;    break;case 0x0b: KeyValue += 8;    break;case 0x07: KeyValue += 12;   break;}while(P3 != 0x0f) ; //松手检测}}P3 = 0xff;if(P3 != 0xff) {delay(100);if(P3 != 0xff) {switch(P3) {case 0xfe: KeyValue = 16;    break;case 0xfd: KeyValue = 17;    break;case 0xfb: KeyValue = 18;    break;case 0xf7: KeyValue = 19;    break;}while(P3 != 0xff) ; //松手检测}}}int main () {WE = 1;P0 = 0xfe;WE = 0;DU = 1;while(1) {KeyScan(); //4*4矩阵键盘扫描P0 = table[KeyValue];   //在数码管上显示按键值}
}

51单片机学习 - 02相关推荐

  1. [51单片机学习笔记TWO]----蜂鸣器

    蜂鸣器音乐播放实验 首先应该了解一下蜂鸣器音乐播放的原理,在这里我只讲一下电磁式蜂鸣器驱动原理(还有一种是压电式蜂鸣器): 电磁式蜂鸣器驱动原理: 蜂鸣器发声原理是电流通过电磁线圈,使电磁圈产生磁场来 ...

  2. 51单片机学习笔记-1简介及点灯

    51单片机学习笔记 文章目录 51单片机学习笔记 1. 51单片机简介 1.1 安装软件 1.2 单片机简介 2. LED灯 2.1点亮一个LED 2.1.1原理分析 2.1.2 创建工程 2.2LE ...

  3. AutoLeaders控制组—51单片机学习笔记

    文章目录 AutoLeaders控制组-51单片机学习笔记 1.1单片机及开发板介绍 单片机介绍 单片机应用领域 STC89C52单片机 内部结构 开发板介绍 2.1点亮一个Led 新建工程 编程 认 ...

  4. 【51单片机】51单片机学习资料合集

    [51单片机]51单片机学习资料合集 资源文件架构 一次全部保存是保存不了的,超过了文件上限,需要分批保存,对于爱好学习和感兴趣学习51单片机的人来说是一波很不错的福利,希望大家多多支持. 51程序 ...

  5. 单片机c语言北航,【下载资料】《51单片机学习笔记》北航版

    原标题:[下载资料]<51单片机学习笔记>北航版 如果手机下载有问题,请移步至电脑端,链接:https://forum.mianbaoban.cn/t/topic/36906 内容简介 本 ...

  6. 51单片机学习日记 | LCD1602黑块和闪烁问题的处理

    51单片机学习日记 芯片:STM89C516RD+ 开发板:普中A4 学习:By 江科大自化协 LCD1602模块问题的处理办法: 第一行黑块 原因是初始化有问题:LCD1602如果没有初始化就会出现 ...

  7. 51单片机学习之智能小车(1)

    说明 这是我学习一段时间51之后自己动手做的,比较简陋.此篇作为总结和复习,如有问题,请评论指出. 下篇:51单片机学习之智能小车(2) 小车概述(功能,所用模块) (1)蓝牙控制 通过手机上蓝牙串口 ...

  8. 51单片机学习笔记2 仿真器的使用及STC89Cxx简介

    51单片机学习笔记2 仿真器的使用及STC89Cxx简介) 一.连接步骤 1. 硬件连接 2. 安装软件驱动 3. 检查是否安装成功 二.仿真步骤 1. 打开一个51工程 2. 选择仿真设备 3. S ...

  9. 51单片机学习杂记——基于STC89C52RC

    51单片机学习杂记--基于STC89C52RC 我是看的b站郭天祥老师的课,说实话,我觉得我能力不是很够,所以记得很杂.废物了属于是. 接下来就是正文了 基本的元器件以及字母符号含义: 电容:帮助晶振 ...

最新文章

  1. Spark累加器(Accumulator)陷阱及解决办法
  2. 第二个mysql怎么装_Linux下安装两个MySQL的方法
  3. java,jdk安装,配置环境变量,window10系统
  4. Linux Shell 操作命令 ls
  5. python语言的三种数字类型_Python语言中的类型之数字类型--Python(10)
  6. JLOI2015 城池攻占
  7. 关于memcpy和 strcpy的区别 以及memset
  8. 光伏发电极其并网控制技术 最大功率点跟踪
  9. UNet多类别分割的keras实现
  10. 撂荒耕地变“希望良田” 国稻种芯:平远县热柘镇以企带村
  11. Elasticsearch提高查询性能的方法
  12. 恐怖的ChatGPT!
  13. Java图像处理(后面会补充PS啥的)
  14. 支付宝,百度,头条集卡群,过年一起玩
  15. 【认知实习】虚拟现实体验
  16. scrollView 横向
  17. 【转】关于提示can't load package 'xxx.bpl.' 错误问题的解决方法
  18. 高一女孩成 AI 赛事奖项收割机,05 后新星如何踏上 CV 之路?
  19. 软件自动化测试订飞机票,用 Selenium 搞定自动化测试项目,途牛搜机票。
  20. 谷歌WayMo提出R4D:采用参考目标做远程距离估计

热门文章

  1. Catfishcms漏洞复现
  2. 区块链的分类与地址长度
  3. 从计算机向外接硬盘传输照片,请各位老师指点:今天在往移动硬盘传输数据(修改的照片),最后剩1? 爱问知识人...
  4. 元宇宙应用开发实例——以太坊里的智能合约和Decentraland里的3D前端交互组件
  5. PostgreSQL设置主键
  6. 支持BLE 5.1 AoA/AoD,EFR32BG22参数对比nRF52833和nRF52811
  7. 栈和队列-第3章-《数据结构习题集》答案解析-严蔚敏吴伟民版
  8. W7编程作业——Support Vector Machines
  9. android 圆角颜色背景,android自定义控件之可自定义背景颜色的圆角textview
  10. html 酷狗音乐教程,酷狗音乐使用基础教程|酷狗音乐使用教程_好特教程