蓝桥杯单片机矩阵按键扫描编程

蓝桥杯单片机矩阵按键扫描编程

蓝桥杯的矩阵按键的扫描,使用reg52.h头文件的时候需要自定义P4接口,因为在该头文件中并没有定义P4接口。

#include "reg52.h"
#include "intrins.h"
typedef unsigned char u8;
typedef unsigned int u16;
sfr P4 = 0xc0;        // 自定义P4接口,P4^4代替P3^7,P4^2代替P3^6
sbit R1 = P3^0;      // 行
sbit R2 = P3^1;
sbit R3 = P3^2;
sbit R4 = P3^3;
sbit C1 = P4^4;       // 列
sbit C2 = P4^2;
sbit C3 = P3^5;
sbit C4 = P3^4;
u8 temp_keys = 0;             // 按键的位数
u8 code shuma[12] = {
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xbf};
// 外设初始化函数
void init_system()
{

P2 = (P2 & 0x1f) | 0x80;
P0 = 0xff;
P2 = (P2 & 0x1f);
P2 = (P2 & 0x1f) | 0xa0;
P0 = 0x00;
P2 = (P2 & 0x1f);
P2 = (P2 & 0x1f) | 0xc0;
P0 = 0x00;
P2 = (P2 & 0x1f);
}
// 外设选通函数
void select(u8 local)
{

switch(local)
{

case(4): P2 = (P2 & 0x1f) | 0x80; break;
case(5): P2 = (P2 & 0x1f) | 0xa0; break;
case(6): P2 = (P2 & 0x1f) | 0xc0; break;
case(7): P2 = (P2 & 0x1f) | 0xe0; break;
}
}
// 简单延时函数
void delay()
{

u8 t = 200;
while(t--);
}
// 数码管点亮函数,单个数码管
void display(u8 local, u8 num)
{

select(6);
P0 = 0x80 >> (local - 1);
P2 = P2 & 0x1f;
select(7);
P0 = num;
P2 = P2 & 0x1f;
delay();
}
// 数码管消隐函数
void close_display()
{

// 消隐
select(6);
P0 = 0x00;
P2 = P2 & 0x1f;
}
// 按键扫描函数
void scan_keys()
{

R1 = 0;
R2 = R3 = R4 = 1;
C1 = C2 = C3 = C4 = 1;
if(C1 == 0)
{

delay();
if(C1 == 0)
{

temp_keys = 7;
}
while(!C1);
}
else if(C2 == 0)
{

delay();
if(C2 == 0)
{

temp_keys = 11;
}
while(!C2);
}
else if(C3 == 0)
{

delay();
if(C3 == 0)
{

temp_keys = 15;
}
while(!C3);
}
else if(C4 == 0)
{

delay();
if(C4 == 0)
{

temp_keys = 19;
}
while(!C4);
}
R2 = 0;
R1 = R3 = R4 = 1;
C1 = C2 = C3 = C4 = 1;
if(C1 == 0)
{

delay();
if(C1 == 0)
{

temp_keys = 6;
}
while(!C1);
}
else if(C2 == 0)
{

delay();
if(C2 == 0)
{

temp_keys = 10;
}
while(!C2);
}
else if(C3 == 0)
{

delay();
if(C3 == 0)
{

temp_keys = 14;
}
while(!C3);
}
else if(C4 == 0)
{

delay();
if(C4 == 0)
{

temp_keys = 18;
}
while(!C4);
}
R3 = 0;
R2 = R1 = R4 = 1;
C1 = C2 = C3 = C4 = 1;
if(C1 == 0)
{

delay();
if(C1 == 0)
{

temp_keys = 5;
}
while(!C1);
}
else if(C2 == 0)
{

delay();
if(C2 == 0)
{

temp_keys = 9;
}
while(!C2);
}
else if(C3 == 0)
{

delay();
if(C3 == 0)
{

temp_keys = 13;
}
while(!C3);
}
else if(C4 == 0)
{

delay();
if(C4 == 0)
{

temp_keys = 17;
}
while(!C4);
}
R4 = 0;
R2 = R3 = R1 = 1;
C1 = C2 = C3 = C4 = 1;
if(C1 == 0)
{

delay();
if(C1 == 0)
{

temp_keys = 4;
}
while(!C1);
}
else if(C2 == 0)
{

delay();
if(C2 == 0)
{

temp_keys = 8;
}
while(!C2);
}
else if(C3 == 0)
{

delay();
if(C3 == 0)
{

temp_keys = 12;
}
while(!C3);
}
else if(C4 == 0)
{

delay();
if(C4 == 0)
{

temp_keys = 16;
}
while(!C4);
}
if(temp_keys == 4)
{

TR1 = ~TR1;
t1_sec = t1_sec;
t1_min = t1_min;
t1_hour = t1_hour;
}
else if(temp_keys == 5)
{

t1_sec = 0;
t1_min = 0;
t1_hour = 0;
}
else if(temp_keys == 6)
{

select(4);
P0 = 0xfe;
P2 = P2 & 0x1f;
}
else if(temp_keys == 7)
{

select(4);
P0 = 0xff;
P2 = P2 & 0x1f;	    
}	
}
void main()
{

init_system();
while(1)
{

scan_keys(); 
display(1, shuma[temp_keys%10]);
display(2, shuma[ temp_keys/10]);
close_display();
}
}

初始化外设一般都是蓝桥杯一上电就需要完成的事情,关闭蜂鸣器以及继电器还有关闭LED灯和数码管这些外设,不然会使得上电之后无关的外设同时工作影响正常的显示效果。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/115107.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 总结:监控系统的7大作用

    总结:监控系统的7大作用一、介绍二、详解 实时采集监控数据:包括硬件、操作系统、中间件、应用程序等各个维度的数据。 实时反馈监控状态:通过对采集的数据进行多维度统计和可视化展示,能实时体现监控对象的状态是正常还是异常。 预知故障和告警:能够提前预知故障风险,并及时发出告警信息。 辅助定位故障:提供故障发生时的各项指标数据,辅助故障分析和定位。 辅助性能调优:为性能调优提供数据支持,比如慢SQL,接口响应时间等。 辅助容量规划:为服务器、中间件以及应用集群的容量规划

  • 高性能php7_php5升级到php7

    高性能php7_php5升级到php7研究PHP7技术的背景公司开源节流的大背景下我们需要节省成本PHP7相对于现在魅族线上的版本5.5性能提升至少一倍以上社区日活用户增长迅速(15年数据日均PV年增长348%日均UV年增长112%)移动互联网的大环境下要求我们的程序能够更快的速度响应用户的请求以满足更好的用户体验对新技术的求知欲望(满足自己的一点点虚荣心)PHP7性能小记PHP7性能初印象(比PHP5.4提升

  • top命令的用法「建议收藏」

    1、top命令:相当于Windows下的资源管理器,能够动态实时的显示系统中进程的资源占用情况。2、在Linux终端上输入top命令出现的结果及其表示的含义如下图:顺便说一下uptime命令3、以上是默认的显示内容,可以通过快捷键来更改显示的内容:<1>按f键:会显示如下列表选a-z键就可以显示或者隐藏对应的列,按回车键确定。<2>按o键可以改变列的显示顺序。按a-z将相应…

  • 通俗理解线性回归(一)

    通俗理解线性回归(一)0什么是回归?假设线性回归是个黑盒子,那按照程序员的思维来说,这个黑盒子就是个函数,然后呢,我们只要往这个函数传一些参数作为输入,就能得到一个结果作为输出。那回归是什么意思呢?其实说白了,就是这个黑盒子输出的结果是个连续的值。如果输出不是个连续值而是个离散值那就叫分类。那什么叫做连续值呢?非常简单,举个栗子:比如我告诉你我这里有间房子,这间房子有40平,在地铁口,然后你来猜一猜我的房子总共值…

  • Python – __name__==’__main__’是干啥的,以及python -m与python的区别

    Python – __name__==’__main__’是干啥的,以及python -m与python的区别转自牛人: https://www.cnblogs.com/ddzj01/p/10919210.html1.__name__=='__main__'是干啥的先看例子,准

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号