蓝桥杯2024/1/31-----底层测试模板

和之前一样建好工程文件夹,里边包含User(放工程文件,mian.c)、Driver(存放底层文件如Led.c,Led.h等)
新建的工程先搭建框架,可以先书写底层函数(此次书写了四个函数并包含相应的头文件共八个底层文件)


底层函数内容:

1.初始化底层驱动专用文件


比如先用3个IO口控制74HC138译码器,控制Y4为低电平;当Y4为低电平时,或非门74HC02控制Y4C为高电平,使74HC573的OE端口有效,OE端口有效时,可使用P0口控制LED的亮灭。
可以去多了解74HC138译码器,74HC02或非门,74HC573八路输出透明锁存器的相关内容会更好理解
#include <Init.h>

//关闭外设
void System_Init()
{
    P0 = 0xff;
    P2 = P2 & 0x1f | 0x80;
    P2 &= 0x1f;
    P0 = 0x00;
    P2 = P2 & 0x1f | 0xa0;
    P2 &= 0x1f;
}

#include <STC15F2K60S2.H>
void System_Init();

2.Led底层驱动专用文件


与初始化底层驱动专用文件同理,需要了解对应的锁存器控制,可以在使用的芯片数据手册查看
#include <Led.h>

void Led_Disp(unsigned char addr,enable)
{
    static unsigned char temp = 0x00;
    static unsigned char temp_old = 0xff;
    if(enable)
        temp |= 0x01 << addr;
    else
        temp &= ~(0x01 << addr);
    if(temp != temp_old)
    {
        P0 = ~temp;
        P2 = P2 & 0x1f |0x80;
        P2 &= 0x1f;
        temp_old = temp;
    }
}

#include <STC15F2K60S2.H>
void Led_Disp(unsigned char addr,enable);


3.按键底层驱动专用文件
(板子上的按键从按键4开始到按键19,可根据实际硬件修改)
#include <Key.h>

unsigned char Key_Read()
{
    unsigned char temp = 0;
    if(P33 == 0) temp = 4;
    if(P32 == 0) temp = 5;
    if(P31 == 0) temp = 6;
    if(P30 == 0) temp = 7;
    return temp;
}

#include <STC15F2K60S2.H>

unsigned char Key_Read();

4.数码管底层驱动专用文件


(这个板子使用的为共阳数码管,若使用的为共阴数码管要更换对应的段码表和位选表;与初始化底层驱动专用文件同理,需要了解对应的锁存器控制,可以在使用的芯片数据手册查看)
#include <Seg.h>

unsigned char Seg_Dula[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//数码管段码储存数组
unsigned char Seg_Wela[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//数码管位码储存数组

void Seg_Disp(unsigned char wela,dula,point)
{
    P0 = 0xff; //
    P2 = P2 & 0x1f |0xe0;
    P2 &= 0x1f;
    P0 = Seg_Wela[wela];
    P2 = P2 & 0x1f |0xc0;
    P2 &= 0x1f;
    P0 = Seg_Dula[dula];
    if(point)
        P0 &= 0x7f;
    P2 = P2 & 0x1f |0xe0;
    P2 &= 0x1f;
}

#include <STC15F2K60S2.H>

void Seg_Disp(unsigned char wela,dula,point);

工程主函数内容:

1.头文件声明(把需要用到的头文件添加进来)

#include <STC15F2K60S2.H>//单片机寄存器专用头文件

#include <Init.h>//初始化底层驱动专用头文件
#include <Led.h>//Led底层驱动专用文件
#include <Key.h>//按键底层驱动专用文件
#include <Seg.h>//数码管底层驱动专用文件

2.变量声明(把需要用到的所有变量现在这里进行声明)

unsigned char Key_Val,Key_Down,Key_Old,Key_Up;//按键扫描专用变量
unsigned char Key_Slow_Down;//按键减速专用变量 10ms
unsigned char Seg_Buf[8] = {10,10,10,10,10,10,10,10};//数码管显示数据存放数组
unsigned char Seg_Point[8] = {0,0,0,0,0,0,0,0};//数码管小数点数据存放数组
unsigned char Seg_Pos;//数码管扫描专用变量
unsigned char Seg_Slow_Down;//数码管减速专用变量 500ms
unsigned char ucLed[8] = {0,0,0,0,0,0,0,0};//Led显示数据存放数组

void Delay500ms()        //@12.000MHz,测试使用的500ms延时
{
    unsigned char i, j, k;
    i = 23;
    j = 205;
    k = 120;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}
 

3.按键处理函数(在这里编写按键控制的函数)

void Key_Proc()
{
        if(Key_Slow_Down)return;
        Key_Slow_Down = 1;//按键减速程序
        
        Key_Val = Key_Read();//读取按下的键码值
        Key_Down = Key_Val & (Key_Val ^ Key_Old);//捕捉下降沿
        Key_Up = ~Key_Val & (Key_Val ^ Key_Old);//捕捉上升沿
        Key_Old = Key_Val;//辅助扫描

//    switch (Key_Down)//测试这个函数使用状况,测试结束后可以删掉
//    {
//        case 4:
//            Led_Disp(2,1);
//            break;
//        case 5:
//            Led_Disp(2,0);
//            break;
//    }

}

4.信息处理函数(需要使用到到的函数进行简单的预处理)

void Seg_Proc()
{
        //unsigned char i;//用于for循环
        if(Seg_Slow_Down)return;
        Seg_Slow_Down = 1;//数码管减速程序
}

5.其他函数(其他编写的函数,在这里书写会比较方便理解)

void Led_Proc()
{
    
}

6.定时器0中断初始化函数


(这个可以使用STC的定时器计算那里生成c代码,后面要自己添加ET0,EA打开中断)
void Timer0Init(void)        //1毫秒@12.000MHz
{
    TMOD &= 0xF0;        //设置定时器模式
    TL0 = 0x18;        //设置定时初值
    TH0 = 0xFC;        //设置定时初值
    TF0 = 0;        //清除TF0标志
    TR0 = 1;        //定时器0开始计时
    
    ET0 = 1;
    EA = 1;
}

7.定时器0中断服务函数


(为了定时执行特定的任务,如此处设置了定时的时间触发了数码管和LED产生特定反应)//中断在测试时可以先注释掉,但是这里按键状态有延时,测试按键时可以解除注释
void Timer0Server() interrupt 1
{
    
        if(++Key_Slow_Down == 10)Key_Slow_Down =0;
        if(++Seg_Slow_Down == 500)Seg_Slow_Down =0;
        if(++Seg_Pos == 6)Seg_Pos = 0;
        Seg_Disp(Seg_Pos,Seg_Buf[Seg_Pos],Seg_Point[Seg_Pos]);
        Led_Disp(Seg_Pos,ucLed[Seg_Pos]);
}

8.主函数Main(调用书写的函数实现所需的相应功能)


void main()
{

    //int i = 0;,key_value;
    System_Init();
    //Timer0Init();//中断在测试时可以先注释掉
    while(1)
    {
        Key_Proc();
       Seg_Proc();
        Led_Proc();

        
//        key_value=Key_Read();//测试按键按下的状态
//        if(key_value==4)
//        {
//            Led_Disp(1,1);
//        }
//        else
//        {
//            Led_Disp(1,0);
//        }
        

//        for(i=0;i<8;i++)//测试数码管状态
//        {
//            Seg_Disp(i,i,1);
//        }

//        for(i=0;i<8;i++)//测试LED状态
//        {
//            Led_Disp(i,1);Delay500ms();//LED亮起,延时500ms
//            Led_Disp(i,0);Delay500ms();//LED灭掉,延时500ms
//        }//1:L1闪烁;2:L2闪烁;3:L3闪烁

    }
}


 

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

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

相关文章

Swagger学习使用

swagger升级导致访问ui页面地址不一样 方式一 依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.3.RELEASE</version> </parent> <dependen…

FUXA远程命令执行漏洞(CVE-2023-33831)

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

C++弹球游戏:Jump Ball Game

一、下载压缩包 请查看网站C弹球游戏&#xff1a;Jump Ball Game并且下载&#xff0c;可以看到如下界面&#xff1a; 二、匹配图标 把压缩包解压了&#xff1a; 右键点击Jump Ball Game.lnk&#xff0c;点击“属性”它将会是我们要运行的文件。 点击“更改图标”&#xff0c;选…

集合问题(并查集)

本题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 题目&#xff1a; 样例1&#xff1a; 输入 4 5 9 2 3 4 5 输出 YES 0 0 1 1 样例2&#xff1a; 输入 3 3 4 1 2 4 输出 NO 思路&#xff1a; 这道题关键点在于。 当集合中有一个元素均存在于集合 A 和集合 B 的时…

前端常见面试题③

1、宿主对象和本机对象有什么区别&#xff1f; 宿主对象由环境提供&#xff0c;例如浏览器中的窗口或文档对象。本机对象&#xff08;如数组或字符串&#xff09;是 ECMAScript 规范的一部分&#xff0c;它们的行为由语言本身定义。 2、解释可变对象和不可变对象之间的区别。…

嵌入式学习步骤

嵌入式行业是一个涉及广泛领域的行业&#xff0c;嵌入式、物联网、人工智能、智能与科学、电子信息工程、通信工程、自动化工程、测控、计算机科学等专业在嵌入式系统中使得软件和硬件的结合更加高效&#xff0c;适合从事嵌入式物联网开发。 嵌入式学习步骤总结如下&#xff1a…

将有逻辑关系的树形结构数组转换为扁平化的一维对象数组(包含PID、ID父子关系)(tree转换为List)

// 将有逻辑关系的树形结构数组转换为扁平化的一维对象数组 treeStructure2flatArray(arr) {let r [], r_ (ar, PID root) > ar.forEach(v > (v.children && (r_(v.children, v.ID), delete v.children), (v.PID PID, r.push(v))));r_(JSON.parse(JSON.strin…

2.2日总结

第一题&#xff1a;搭配购买 题解&#xff1a;一看就是很普通的01背包问题&#xff0c;但是和查并集一起考了&#xff0c;首先我们需要把每个有联系的链接起来&#xff0c;形成一个大背包&#xff0c;用来装他们的总金额和总价值&#xff0c;然后我们在看一个个的物品进行取或者…

LeetCode.2670. 找出不同元素数目差数组

题目 题目链接 分析 一种暴力的方法&#xff0c;枚举数组所有数字&#xff0c;分别计算当前元素前面不同的元素和后面不同的元素&#xff0c;然后相减即可。这样的话太暴力&#xff0c;前缀和后缀也需要分别遍历&#xff1a;O(N*2)了。 我们来优化一下&#xff1a; 根据这种…

STM32F407移植OpenHarmony笔记8

继上一篇笔记&#xff0c;成功开启了littlefs文件系统&#xff0c;能读写FLASH上的文件了。 今天继续研究网络功能&#xff0c;让控制台的ping命令能工作。 轻量级系统使用的是liteos_m内核lwip协议栈实现网络功能&#xff0c;需要进行配置开启lwip支持。 lwip的移植分为两部分…

Paper - 预测异源多聚体相互作用 Effective Virial Coefficient (有效节流系数) 算法

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/135974780 论文&#xff1a;Predicting heteropolymer interactions: demixing and hypermixing of disordered protein sequences 预测异聚物相…

Mysql的BufferPool

Mysql的BufferPool Mysql是一个存储数据到磁盘的进程&#xff0c;但是磁盘的速度难以与CPU相比&#xff0c;所以InnoDB存储引擎在处理客户端的请求时&#xff0c;当需要访问某个页的数据时&#xff0c;就会把完整的页的数据全部加载到内存中。将整个页加载到内存中后就可以进行…

Vue3_基础使用_1

这节主要介绍&#xff1a; vue2与vue3的区别&#xff0c;创建响应式的数据&#xff0c;setup语法糖的使用&#xff0c;watch监听&#xff0c;及vue3创建项目。 vue2的选项式与vue3的组合式区别&#xff1a; 选项式&#xff1a;vue2中数据与方法计算属性等等&#xff0c;针对…

TryHackMe-Valley

靶场介绍 Boot the box and find a way in to escalate all the way to root! 启动盒子&#xff0c;找到一种方法&#xff0c;一路升级到root&#xff01; 信息收集&端口利用 使用nmap对靶机进行扫描 nmap 10.10.138.189开放22、80和37370端口&#xff0c;先访问80端口查…

Facebook未来展望:社交媒体的下一个篇章

社交媒体一直是连接人与人之间的纽带&#xff0c;而Facebook则一直在推动这一领域的发展。随着科技不断演进和社会需求的不断变迁&#xff0c;Facebook正积极筹谋社交媒体的下一个篇章。本文将深入剖析Facebook的未来展望&#xff0c;探讨其在社交媒体领域所迎接的新时代。 1. …

【开源】SpringBoot框架开发农村物流配送系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统登录、注册界面2.2 系统功能2.2.1 快递信息管理&#xff1a;2.2.2 位置信息管理&#xff1a;2.2.3 配送人员分配&#xff1a;2.2.4 路线规划&#xff1a;2.2.5 个人中心&#xff1a;2.2.6 退换快递处理&#xff1a;…

【c语言】strcpy()和strncpy():字符串复制详解

&#x1f388;个人主页&#xff1a;甜美的江 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;c语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&a…

数据库问题排查与常用设置

1.数据库问题 1.1数据库磁盘满了 mysql57表现1: 插入数据或者更新数据可能报错 The table xxx is full" 报错示例: { "timestamp": 1706766474768, "status": 500, "error": "Internal Server Error", "exception&q…

TryHackMe-File Inclusion练习

本文相关的TryHackMe实验房间链接&#xff1a;TryHackMe | Why Subscribe 路径遍历(目录遍历) LocationDescription/etc/issue包含要在登录提示之前打印的消息或系统标识。/etc/profile控制系统范围的默认变量&#xff0c;例如导出&#xff08;Export&#xff09;变量、文件创…

fastadmin添加活动二维码图片,扫码可以直接跳转到该活动

一&#xff0c;在controll重写add方法 /*** 添加*/ public function add() {if ($this->request->isPost()) {$params $this->request->post("row/a");if ($params) {$params $this->preExcludeFields($params);if ($this->dataLimit &&…