当前位置: 首页 > news >正文

51单片机快速入门之按键应用拓展

51单片机快速入门之按键应用拓展

LED的点动控制:

循环检测,当key 为0 时 led 亮 反之为熄灭

while(1){

if(key!=1)

{

led=0;

}else

{

led=1;

}

}

LED的锁定控制:

当按钮按下,led取反值 

while(1)

{

if(key!=1)

{

led=!led;

}

}

LED的4路抢答控制: 

bz默认为0 !bz 取反值,循环启动  key默认为1 取反值 0 if不执行

按钮按下key变为0 反值为1 执行操作并退出检测循环

bit bz;

while(!bz)

{

if(!key)

{

 ...........//执行led点亮操作

bz=1;//跳出循环

}

else if(!key1){...}

else if(!key2){...}

else if(!key3){...}

}

while(bz){

if(!rekey)

{

bz=0;

}

}//复位

LED数码管控制:

数码管一般都是这样界定的

   

            搭建仿真电路     

 

这里使用的是共阳数码管,之所以用74HC和本次电路没什么大的关系! 

我们要显示数字1就需要点亮B C 

八位二进制应该为1001 1111 转换成十六进制 0x9F

这里要注意的是 单片机 最高位(MSB)(对应P2.7),最低位(LSB)(对应P2.0)

图片来源于STC官方数据手册:


在二进制表示中,最高位(MSB)位于最左边,最低位(LSB)位于最右边。

所以八位二进制会颠倒过来,为1111 1001 转换成十六进制 0xF9

小知识:在C、C++、Java等语言中,按位取反操作符是波浪线 ~

编写程序代码测试:

模拟效果:

下面是数码管通用表格:

(图片来源于网络)

这里的"H"是一个常见的习惯用法,用来表示后面的数是以十六进制表示的

实际程序编写中为了,兼容性推荐使用0x明确表示这是一个数值常量

所以我们可以通过一个字符型表格来操作

以下是详细代码:

#include <STC89C5xRC.H>int LED=0XF9;//声明一个变量unsigned char code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};void delay(unsigned int t);//延时函数声明void main()
{          int i;for(i=0;i<10;i++){P2=table[i];//P2已经在STC89C5xRC.H文件中被 声明delay(183);//延迟1sdelay(183);//延迟1sdelay(183);//延迟1s}}
void delay(unsigned int t){unsigned int x,y;
for(x=0;x<t;x++){ for(y=0;y<1000;y++);  } }

uchar就是unsigned char ,意思就是定义一个无符号字符型数据 8位数,,范围是 0-255 占用一个字节。
正解: code的作用就是告诉单片机,定义的数据要放在ROM(程序存储区)里面,写入后就不能再更改,

因为C语言中没办法详细描述存入的是ROM还是RAM(寄存器)

所以在软件中添加了这一个语句起到代替汇编指令的作用

对应的还有data是存入RAM的意思。

其他关键词的意思:
code :程序存储区(64KB),
data :可直接寻址的内部数据存储区(128B)
idata:不可直接寻址的内部数据存储区(256B)
bdata:可位寻址内部数据存储区(16B)
xdata:外部数据存储区(64KB)
pdata:分页的外部数据存储区                    
原文链接:icon-default.png?t=O83Ahttps://blog.csdn.net/qq_44419614/article/details/107002333

code:
通常用于表示程序存储区,这是用来存放程序代码的地方。
在某些微控制器中,比如8051,程序存储空间是64KB的地址空间,
这个区域的变量需要用code关键字修饰,表明这些数据是在程序存储器中,
而不是在数据存储器中。data:指的是可以直接寻址的内部数据存储区,
一般对应于微控制器内部的RAM(随机存取存储器),
大小通常为128字节(有些变体会更多)。
这个区域的数据访问速度最快,因为它们在CPU的内部。idata:间接寻址的内部数据存储区,
通常是指内部RAM中不能直接通过寄存器寻址的部分,
大小可能是256字节。这部分内存需要通过间接寻址的方式来访问。bdata:位寻址的内部数据存储区,
通常是内部RAM中的特定部分,允许对存储单元中的位进行单独操作。
在8051中,这个区域通常是可位寻址的16字节(即128位)。xdata:扩展数据存储区,通常指的是外部RAM(相对于内部RAM),
可以是64KB的地址空间。这个区域的数据访问速度比内部RAM慢,
因为需要通过外部总线访问。pdata:分页的外部数据存储区,
当系统的外部数据存储空间被组织成分页结构时使用。
pdata访问通常需要使用额外的寻址指令,以指定当前要访问的页面。这些关键字在标准C语言中并不标准,
而是针对特定嵌入式环境的扩展,比如在KEIL C51编译器中用于8051微控制器的编程。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 实时数据的处理一致性
  • 【JavaScript】算法之贪心算法(贪婪算法)
  • 10款超好用的文档加密软件|2024企业常用文档加密软件排行榜
  • 美食共享圈:Spring Boot校园周边美食平台
  • js笔记(第二章)
  • 软件测试技术之 GPU 单元测试是什么!
  • 标准C++(二)
  • 【Unity Shader】Special Effects(九)Vortex 旋涡(UI)
  • 如何在算家云搭建RVC-WebUI(语音转换)
  • 前端大屏自适应方案
  • DevOps在提升软件质量方面的作用
  • 配置docker的proxy指向
  • 计算机毕业设计推荐-基于python的白酒销售数据可视化分析
  • Spring Boot 从 2.7.x 升级到 3.3注意事项
  • git 如何基于某个分支rebase?
  • 5、React组件事件详解
  • Android Studio:GIT提交项目到远程仓库
  • CSS3 变换
  • FineReport中如何实现自动滚屏效果
  • iOS编译提示和导航提示
  • Js基础知识(一) - 变量
  • Spring Boot MyBatis配置多种数据库
  • Terraform入门 - 1. 安装Terraform
  • 笨办法学C 练习34:动态数组
  • 产品三维模型在线预览
  • 基于Android乐音识别(2)
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 精彩代码 vue.js
  • 前端攻城师
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 日剧·日综资源集合(建议收藏)
  • 微信小程序填坑清单
  • 终端用户监控:真实用户监控还是模拟监控?
  • 你对linux中grep命令知道多少?
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • ​​​【收录 Hello 算法】9.4 小结
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • #ubuntu# #git# repository git config --global --add safe.directory
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (备份) esp32 GPIO
  • (定时器/计数器)中断系统(详解与使用)
  • (篇九)MySQL常用内置函数
  • (十三)Maven插件解析运行机制
  • (四) Graphivz 颜色选择
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (杂交版)植物大战僵尸
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .mp4格式的视频为何不能通过video标签在chrome浏览器中播放?
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .Net Redis的秒杀Dome和异步执行
  • .NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 GC 垃圾回收掉