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

矩阵键盘 数码管

在没有数字显示的开始,顺序为矩阵键盘后,依次显示的数码管0~F,6同时数字控制静态展示。

 数字控制和矩阵式键盘

首先关闭全部的数码管的段选不让数码管显示不论什么数字。然后位选中全部的数码管,接下来仅仅须要选中全部的数码管,以后的操作的仅仅须要送段选数据即可了,接着进入while()大循环不停的扫描键盘是否有被按下

#include<reg52.h>
#define uchar unsigned char 
#define uint unsigned int 
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void display(uchar num)
{
P0=table[num];
dula=1;
dula=0;
}
void matrixkeyscan()
{
uchar temp,key;
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee:
key=0;
break;
case 0xde:
key=1;
break;
case 0xbe:
key=2;
break;
case 0x7e:
key=3;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed:
key=4;
break;
case 0xdd:
key=5;
break;
case 0xbd:
key=6;
break;
case 0x7d:
key=7;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb:
key=8;
break;
case 0xdb:
key=9;
break;
case 0xbb:
key=10;
break;
case 0x7b:
key=11;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7:
key=12;
break;
case 0xd7:
key=13;
break;
case 0xb7:
key=14;
break;
case 0x77:
key=15;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
}


void main()
{
P0=0;
dula=1;
dula=0;
P0=0;
wela=1;
wela=0;
while(1)
{
matrixkeyscan();
}
}


这里有几个

P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{  .........

P3=0xfe 将第1 行线置低电平,其余的行线所有为高电平

temp=P3 读取P3口当前的状态值赋值给暂时变量temp

temp=temp&0xf0 将temp与0xf0进行与运算 然后再将结果赋值给temp,主要是推断temp的高4位是否有0。假设temp的高4位没有0。那么他与0xf0“与”运算后的结果仍然等于0xf0.temp的高4位数据实际上就是矩阵键盘的4个列线,从而我们可通过推断temp与“0xf0运算后的结果是否为0xf0来推断出第一行按键是否有按键被按下。

if(temp!=0xf0) 表示temp是上面P3口数据与0xf0“与”运算后的结果,假设结果temp不等于0xf0来推断出有按键被按下。

另外

P3口全部引脚

其余的想复位引脚RES\VPD

还有EA\VPP

ALE\PROG

这是全部的了,我的是AT89S52(51系列)


版权声明:本文博主原创文章。博客,未经同意不得转载。

相关文章:

  • 使用U盘代替光盘来刻录ISO镜像文件的方法
  • linux 函数
  • MyBatis笔记——Mapper动态代理
  • python教程
  • C语言 实现 给定两个整形变量的值,将两个值的内容进行交换
  • 更为适合并发的极简易队列
  • 2016年一些面试题的整理和心情--1异或到100
  • WINDOW10下修正CHROME字体问题解决方案
  • 不能在 DropDownList 中选择多个项。其解决办法及补充
  • 如果使用得当,MySQL 也可以化身 NoSQL
  • 一些非常经典的awk小技巧
  • Tarjan 求强连通分量
  • css3 多行文本 溢出 省略号
  • Android 相关 AS 下载地址,源码下载地址
  • [LeetCode]: 145: Binary Tree Postorder Traversal
  • Android 控件背景颜色处理
  • Bytom交易说明(账户管理模式)
  • Consul Config 使用Git做版本控制的实现
  • docker容器内的网络抓包
  • ECMAScript入门(七)--Module语法
  • Java多线程(4):使用线程池执行定时任务
  • Joomla 2.x, 3.x useful code cheatsheet
  • js ES6 求数组的交集,并集,还有差集
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • vue的全局变量和全局拦截请求器
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 关于Flux,Vuex,Redux的思考
  • 好的网址,关于.net 4.0 ,vs 2010
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 前端工程化(Gulp、Webpack)-webpack
  • 前端面试之闭包
  • 前端面试总结(at, md)
  • 入门级的git使用指北
  • 跳前端坑前,先看看这个!!
  • 再谈express与koa的对比
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 正则与JS中的正则
  • k8s使用glusterfs实现动态持久化存储
  • 我们雇佣了一只大猴子...
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • $.ajax,axios,fetch三种ajax请求的区别
  • $GOPATH/go.mod exists but should not goland
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (接口封装)
  • (七)Knockout 创建自定义绑定
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .Net Core缓存组件(MemoryCache)源码解析
  • .net web项目 调用webService