单元训练07:矩阵键盘的基本操作-sbit写法

news2024/12/23 12:12:36

蓝桥杯 小蜜蜂 单元训练07:矩阵键盘的基本操作

sbit写法中加入了定时器使用。

#include "stc15f2k60s2.h"

typedef unsigned char uint8_t;

uint8_t timerCounter = 0;
uint8_t timerEnable = 0;

#define LED(X)                   \
    {                            \
        P0 = X;                  \
        P2 = (P2 & 0x1f | 0x80); \
        P2 &= 0x1f;              \
    }
// 数码管
// 段选
#define COM(x)                 \
    {                          \
        P0 = x;                \
        P2 = P2 & 0x1F | 0xc0; \
        P2 &= 0x1F;            \
    }
// 位选
#define SEG(x)                 \
    {                          \
        P0 = x;                \
        P2 = P2 & 0x1F | 0xE0; \
        P2 &= 0x1F;            \
    }
code unsigned char Seg_Table[] =
    {
        0xc0, // 0
        0xf9, // 1
        0xa4, // 2
        0xb0, // 3
        0x99, // 4
        0x92, // 5
        0x82, // 6
        0xf8, // 7
        0x80, // 8
        0x90, // 9
        0x88, // A
        0x83, // b
        0xc6, // C
        0xa1, // d
        0x86, // E
        0x8e  // F
}; // 表不用记,官方提供资源包里面有。

// 数码管第一位显示
void DisplayNo1(uint8_t no)
{
    COM(0x01);
    SEG(Seg_Table[no]);
}

// 矩阵键盘 行
sbit row1 = P3 ^ 0;
sbit row2 = P3 ^ 1;
sbit row3 = P3 ^ 2;
sbit row4 = P3 ^ 3;
// 矩阵键盘 列
sbit col1 = P4 ^ 4;
sbit col2 = P4 ^ 2;
sbit col3 = P3 ^ 5;
sbit col4 = P3 ^ 4;

void ClearRow()
{
    row1 = 0;
    row2 = 0;
    row3 = 0;
    row4 = 0;

    col1 = 1;
    col2 = 1;
    col3 = 1;
    col4 = 1;
}
void ClearCol()
{
    col1 = 0;
    col2 = 0;
    col3 = 0;
    col4 = 0;

    row1 = 1;
    row2 = 1;
    row3 = 1;
    row4 = 1;
}

code uint8_t ArrayNum[4][4] = {
    {0, 1, 2, 3},
    {4, 5, 6, 7},
    {8, 9, 10, 11},
    {12, 13, 14, 15}};

uint8_t keyStatus;

uint8_t key_row;
uint8_t key_col;
uint8_t keyValue = 255;

void KeyScan()
{
    switch (keyStatus)
    {
    case 0:
        ClearCol();
        if ((row1 == 0) || (row2 == 0) || (row3 == 0) || (row4 == 0))
        {
            keyStatus = 1;
        }
        break;
    case 1:
        ClearCol();
        if (row1 == 0)
        {
            key_row = 1;
            keyStatus = 2;
        }
        else if (row2 == 0)
        {
            key_row = 2;
            keyStatus = 2;
        }
        else if (row3 == 0)
        {
            key_row = 3;
            keyStatus = 2;
        }
        else if (row4 == 0)
        {
            key_row = 4;
            keyStatus = 2;
        }
        break;
    case 2:
        ClearRow();
        if (col1 == 0)
        {
            key_col = 1;
            keyStatus = 3;
        }
        else if (col2 == 0)
        {
            key_col = 2;
            keyStatus = 3;
        }
        else if (col3 == 0)
        {
            key_col = 3;
            keyStatus = 3;
        }
        else if (col4 == 0)
        {
            key_col = 4;
            keyStatus = 3;
        }
        break;
    case 3:
        ClearRow();
        if ((col1 == 1) && (col2 == 1) && (col3 == 1) && (col4 == 1))
            keyStatus = 0;
        break;
    default:
        keyStatus = 0;
        break;
    }
}
void SegShow()
{
    if (timerEnable)
        KeyScan();
    timerEnable = 0;
    DisplayNo1(ArrayNum[key_row - 1][key_col - 1]);
}
void Timer0_Init(void) // 1毫秒@12.000MHz
{
    AUXR |= 0x80; // 定时器时钟1T模式
    TMOD &= 0xF0; // 设置定时器模式
    TL0 = 0x20;   // 设置定时初始值
    TH0 = 0xD1;   // 设置定时初始值
    TF0 = 0;      // 清除TF0标志
    TR0 = 1;      // 定时器0开始计时
    ET0 = 1;      // 使能定时器0中断
    EA = 1;
}

void main()
{
    Timer0_Init();

    LED(0xff);
    SEG(0xff);
    COM(0xff);

    while (1)
    {
        SegShow();
    }
}

void Timer0_Isr(void) interrupt 1
{
    if (timerCounter++ == 1) // 1ms
    {
        timerCounter = 0;
        timerEnable = 1;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2041287.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构之排序(下)

片头 嗨!小伙伴们,咱们又见面啦,在上一篇数据结构之排序(上)中,我们学习了直接插入排序、冒泡排序和希尔排序,今天我们继续学习排序这一块,准备好了吗?Ready Go ! ! ! 一、选择排序 1.1 基本思…

测评各主流大模型对复杂文档处理的精确度,司马阅领先

司马阅一直在升级,这次升级后,我们将司马阅和主流的AI大模型再做一次测评。这次极端测评,主要pk各大模型对复杂文档处理的精确度。 我们选取的依然是这份专业的行业报告:《中国生成式AI开发者洞察》,共58页&#xff0…

js实现图片以鼠标为中心滚轮缩放-vue

功能背景 实现以鼠标在图中的位置为中心进行图片的滚轮缩放,现在是无论鼠标位置在哪都以图片中心进行缩放,这不符合预期; 关键点 缩放前鼠标在的位置是 A(clinetX,clientY) 点,缩放后鼠标的位置是 A’&a…

遇到 aspects 依赖引入失败问题

在引入 aspects 的相关依赖时&#xff0c;没有找到这个版本 <dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>6.0.0-M2</version> </dependency> 第一次尝试&#xff…

中国云计算技术(三)

目录 四、云视频监控技术&#xff08;一&#xff09;cVideo云视频监控系统&#xff08;二&#xff09;cVideo智能分析系统&#xff08;三&#xff09;cVideo云转码系统 四、云视频监控技术 随着云计算技术的飞速发展&#xff0c;许多传统行业纷纷向“云”上靠拢&#xff0c;视频…

【日记】朋友和他女朋友领证了(368 字)

正文 一定程度上感受到了驻场运维的水深火热&#xff0c;感觉成天到晚都在救火。今天下午就给人修了四五台机器…… 回想了一下&#xff0c;今天貌似还真没干什么。毕竟早上睁眼就是 8:35 了&#xff0c;给人吓得半死。 &#xff08;感觉 AI 也很智障&#xff0c;当初就是发现音…

0603定时器的输入捕获

定时器的输入捕获 最终程序现象&#xff1a; 1.输入捕获模式测频率 2.PWMI模式&#xff08;PWM输入模式&#xff09;测频率和占空比 输入捕获电路&#xff1a;左边这一部分。 右边的就是输出比较部分。 4个输入捕获和输出比较通道&#xff0c;共用4个CCR寄存器&#xff0c;另外…

uniapp 自定义全局弹窗

自定义全局弹窗可在js和.vue文件中调用&#xff0c;unipop样式不满足&#xff0c;需自定义样式。 效果图 目录结构 index.vue <template><view class"uni-popup" v-if"isShow"><view class"uni-popup__mask uni-center ani uni-cust…

10款企业网络准入控制系统排行榜|网络准入控制系统推荐

在当今数字化时代&#xff0c;企业网络的安全性对于维护业务连续性和保护敏感数据至关重要。网络准入控制系统&#xff08;NAC&#xff09;作为企业安全架构的核心组成部分&#xff0c;负责管理和控制所有试图接入企业网络的设备。我们列出了2024年企业网络准入控制系统的排行榜…

别急着买新手机:OPPO Reno13系列配置全解析,性价比爆表

在智能手机市场&#xff0c;OPPO Reno系列凭借其高性价比和出色的影像实力&#xff0c;一直是消费者关注的焦点。 随着科技的不断进步&#xff0c;OPPO也在不断推陈出新&#xff0c;满足用户对高性能手机的需求。最近&#xff0c;OPPO Reno13系列的曝光&#xff0c;预示着OPPO…

【高性能高易用】物联网AI开发套件----Qualcomm® RB3 Gen 2 开发套件

Qualcomm RB3 Gen 2 开发套件 专为高性能计算、高易用性而设计的物联网开发套件 Qualcomm RB3 Gen 2 开发套件拥有先进的功能和强大的性能&#xff0c;包括强大的AI运算&#xff0c;12 TOPS 算力和计算机图形处理能力&#xff0c;可轻松创造涵盖机器人、企业、工业和自动化等…

谷歌账号登录的时候提示被停用,原因是什么,账号还有救吗?该如何处理?

今日早上&#xff0c;有个久违的朋友找到我说&#xff0c;要恢复账号。 他的情况是这样的&#xff1a;7月21日的时候&#xff0c;他发现自己的谷歌账号登录的时候提示活动异常先&#xff0c;需要输入手机号码验证才能恢复账号。但是输入了自己和亲友们的多个手机号码都无法验证…

Astro + Cloudflare Pages 快速搭建个人博客

目录 1 选择 Astro 模板2 使用代码3 修改代码4 上传 Github5 部署 Cloudflare Pages6 后续修改 最近我搭建完了我的个人网站&#xff0c;很多人问是怎么做的&#xff0c;今天就来写一篇教程吧。 全部干货&#xff0c;看完绝对能成功搭建自己的网站&#xff01;&#xff08;还不…

8月12号笔记

工作组 工作组对计算机进行分层&#xff0c;通过创建不同的工作组&#xff0c;不同的计算机可以按照功能或部门归属到不同的组内&#xff0c;整个组织的网络就会变得具有层次性。在默认情况下&#xff0c;局域网内的计算机都是采用工作组方式进行资源管理的&#xff0c;即处在…

S71200 - 编程 - 笔记

1 DEMO 1.1气阀控制 1.2 红绿灯 基于PLC红绿灯控制_哔哩哔哩_bilibili 2 介绍变量DB&#xff0c;M&#xff0c;I&#xff0c;Q的使用 在PLC编程中&#xff0c;通常会使用多种类型的变量来实现逻辑控制、数据存储和输入输出操作。以下是常见的PLC变量类型及其用途&#xff…

C++笔记3•类和对象2•

1.类的6个默认成员函数 概念: 默认成员函数是用户没有显式实现,编译器会生成的成员函数称为默认成员函数。其中包括 构造函数、析构函数、拷贝构造、赋值重载、普通对象取地址重载、const对象取地址重载。也就是说类在空的情况下,空类中也不是什么也没有,会包含这六个默认成…

Linux shell脚本实战案例

文章目录 1. 基础案例&#xff1a;显示系统信息2. 文件备份案例3. 自动安装软件案例4. 批量重命名文件案例5. 监控磁盘空间案例6. 定时任务案例&#xff1a;定期清理日志文件7. 错误处理和日志记录案例&#xff1a;安全地运行命令8. 备份数据库案例&#xff1a;定期备份MySQL数…

Waterfox vG6.0.8 官方版下载及安装步骤(一款响应速度非常快的浏览器)

前言 Waterfox 水狐浏览器&#xff0c;从字面上我们可以轻松的了解该款浏览器的一些特点。Waterfox是通过Mozilla官方认证的纯64位版火狐浏览器&#xff0c;而Waterfox 10采用Firefox 10官方源码编译而成&#xff0c;改进了大内存和64位计算的细节&#xff0c;在64位Windows系…

haproxy整理

haproxy 1.1 haproxy简介 HAProxy是法国开发者 威利塔罗(Willy Tarreau) 在2000年使用C语言开发的一个开源软件 是一款具备高并发(万级以上)、高性能的TCP和HTTP负载均衡器&#xff0c;支持基于cookie的持久性&#xff0c;自动故障切换&#xff0c;支持正则表达式及web状态统…

Linux10 三剑客 正则表达式

三剑客 grep 擅长过滤&#xff0c;按行过滤 首先要把多个虚拟机的网络改成一种形式 爆破攻击&#xff1a;‌爆破攻击是一种尝试通过穷举法&#xff08;即尝试所有可能的组合&#xff09;来破解密码或身份验证的方法。这种攻击通常用于尝试登录到系统、网络或应用程序&#…