智能车模块详解——按键及按键调参

同以往文章一样,会附上几个讲理论的优质博客链接,本文重点讲怎么用代码实现。

  • 按键:

lcd_showint8(0,0,P37);

 p37接一个按键,按键没按下显示0,按下显示1;这个很简单,但是怎么用呢?

假如我想按一次按键,屏幕刷新一次,如果我这样写,会发生什么?

if(P37==1)lcd_clear();

如果我按一下按键,理论上会有P37==0,P37==1,P37==0,三个阶段,

按键P37==1的时候会一直刷新,没有达到只刷新一次的要求,

所以我们通常检测按键的动作并不是检测一个固定的电平值,而是检测电平值的变化,即按键在按下和弹起这两种状态之间的变化,只要发生了这种变化就说明现在按键产生动作了。

 51单片机入门——矩阵按键_倾晨灬雨曦的博客-CSDN博客_矩阵按键

三行代码按键消抖 独立按键 矩阵按键 长按 短按 双击_#法外狂徒张三的博客-CSDN博客_按键三行代码

 上面两篇文章对按键讲的很详细,下面我来讲一下,如何用代码来实现按键扫描——长按,短按,没按。

先建立一个枚举,表示按键的三种状态

typedef enum
{
    nopress = 0,
    onepress,
    holdpress,
} KeyStateEnum;

extern KeyStateEnum Key1;

#define KEY_ONE     P37

void KeyParams_Init(void)//按键初始化
{
    Key1 = nopress;

}

 按键扫描函数,放进中断里

void KeyScanInt(void)
{
    static uint8 KeyPressNum = 0;
    static uint16 KeyPressTime = 0;
    static uint8 SomeKeyPress_Flag = 0;//0 松开 1按下  2:消抖 3:长按
    #define AlwaysPressTime 1600//一直按检测时间
    #define debouncing  5
    if(SomeKeyPress_Flag == 0 && (KEY_ONE == 0))
    {
         SomeKeyPress_Flag = 1;
    }
    if(SomeKeyPress_Flag > 0)
    {
        KeyPressTime ++;
        //5ms消抖
        if(SomeKeyPress_Flag == 1 && KeyPressTime >= debouncing)
        {
            SomeKeyPress_Flag = 2;
            if(KEY_ONE == 0)
                KeyPressNum = 1;//¼ì²â°´¼ü°´ÏÂ
        }
        //按一下松开
        if((KEY_ONE == 1) && KeyPressTime < AlwaysPressTime && SomeKeyPress_Flag == 2)
        {
            SomeKeyPress_Flag = 0;//°´¼üËÉ¿ªÁË
            if(KeyPressNum == 1)
                Key1 = onepress;
        }
        //长按
        if(KeyPressTime >= AlwaysPressTime && SomeKeyPress_Flag == 2)
        {
            if(KeyPressNum == 1)      Key1 = holdpress;
            if(KEY_ONE == 1)
            {
                SomeKeyPress_Flag = 0;
                KeyPressTime = 0;
                Key1 = nopress;
            }
        }
    }
}

 这个是一个按键的按键扫描,如果有多个按键按,读懂代码之后加几个&&和||就行

按键扫描模块,.c.h文件-C文档类资源-CSDN下载

我这里的文件是写了四个按键,有需要的自己拿就行。

使用:

将KeyParams_Init放在初始化位置

将KeyScanInt放在定时器中断

应用:这是我写的按键调参的一部分

//应用
if(KeyRight == onepress)
{
    KeyRight = nopress;
    now -= step * 10;
}
while(KeyCenter == holdpress)
{
    now += step;
    delay_ms(5);
    ips114_showint16(pos_x,pos_y,now);
}


  •  按键调参:

uint8 ParamsAdjustUint16(uint16 *p,uint16 pos_x,uint16 pos_y,short step)
{
    //读取
    uint16 now = *p;
    IPS114_PENCOLOR = PURPLE;
    while(KeyNext != onepress)
    {
        if(KeyLeft == onepress)
        {
            KeyLeft = nopress;
            now += step * 10;
        }
        if(KeyRight == onepress)
        {
            KeyRight = nopress;
            now -= step * 10;
        }
		while(KeyCenter == holdpress)
		{
		now += step;
		delay_ms(50);
		ips114_showuint16(pos_x,pos_y,now);
		}
        if(KeyUp == onepress)
        {
            KeyUp = nopress;
            now += step;
        }
        if(KeyDown == onepress)
        {
            KeyDown = nopress;
            now -= step;
        }
        ips114_showuint16(pos_x,pos_y,now);
    }
    KeyNext = nopress;
    IPS114_PENCOLOR = RED;
    *p = now;

    return 1;
}

这是调Uint16类型数据的函数,其他的你按照这个改就行,

这里是按KeyNext(按键)进入调参页面,上下左右中,对应执行数据的增减,这里按照你们的按键数量改就行。

//使用
ParamsAdjustUint16(&IslandSpeed,120,3,5);

我这里整理了,这些常见的,限于篇幅

uint8 ParamsAdjustFloat(float *p,uint16 pos_x,uint16 pos_y,float step);		//调整float参数
uint8 ParamsAdjustShort(short *p,uint16 pos_x,uint16 pos_y,short step);		//调整short参数
uint8 ParamsAdjustUint16(uint16 *p,uint16 pos_x,uint16 pos_y,short step);	//调整uint16参数
uint8 ParamsAdjustUint8(uint8 *p,uint16 pos_x,uint16 pos_y,uint8 step);		//调整uint8参数
uint8 ParamsAdjustInt(int *p,uint16 pos_x,uint16 pos_y,short step);//调整int参数
uint8 StateAdjust(uint8 *p,uint16 pos_x,uint16 pos_y);	//调整'T''F'参数 为是或者否
uint8 DirAdjust(uint8 *p,uint16 pos_x,uint16 pos_y);	//调整'L''R'参数 为左或者右
float Float_QuZheng(float xiaoshu,uint8 mode);//小数点后取整

系列文章目录

文章分为三个层次

速通版

是希望通过简化的步骤搭建出寻迹小车,进而了解整个智能车是如何实现的,快速上手,为后续参与智能车竞赛做基础。

如果只是为了完成学校智能车初期培训,做出能简单循迹的小车,可以看这个速通版。

全程引导篇

是讲了做出能够完赛的智能车的整个过程,大部分文章只是简单点拨一下,但是附上了相关的文章链接,方便根据自己的情况深入了解。

全程引导篇,能够带你比较系统地了解整个智能车的制作过程,推荐备赛初期或者有车模之后学习。

详细讲解篇

是全程引导篇的补充,由于全程引导篇是引导性质,文章内容只是点拨,缺乏相应的原理或代码讲解,因此写详细讲解篇作为补充。

详细讲解篇会渗透在全程引导篇中。


速通版

智能小车速通版——手把手教程

全程引导篇

智能小车速通版——教程引导(原版)

智能小车速通版——教程引导

智能车入门——IDE安装以及库函数选用

智能车入门——编程语言(c)的学习

智能车入门——简单驱动常用模块

智能车入门——车模器件篇

智能车入门——模块化编程

智能车入门——跑车前的零碎知识

智能车入门——电磁循迹原理与实现

智能车入门——实现低速完赛

详细讲解篇

智能车入门补充篇

智能车入门补充篇——逐飞开源库介绍

智能车入门补充篇——常见宏定义和使用

智能车入门补充篇——模块化编程

智能车入门补充篇——电感值处理、转向控制与巡线

智能车入门补充篇——元素识别

智能车模块详解——按键及按键调参

智能车模块详解——数据存储与读写(eeprom/flash)

智能车入门——I/O、PWM

智能车入门——中断

智能车入门——编码器

智能车入门——陀螺仪

智能车入门——摄像头和CCD

智能车入门——舵机

(更新中)

  • 8
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
IP5114屏幕移植是指将IP5114显示屏的硬件和软件系统适配到其他设备中的过程。IPS114屏幕是一种显示屏技术,具有更广阔的视角和更真实的色彩表现力,因此在移植过程中需要特别注意保留其独特的特性。 首先,在硬件层面上,需要确保目标设备与IPS114屏幕的接口和尺寸兼容。这意味着要对目标设备的电路板进行改造,以便与IPS114屏幕的连接器相匹配。还需要对电源和信号线路进行调整,以确保IPS114屏幕能够正常工作。 其次,在软件层面上,需要针对目标设备调整或编写显示驱动程序。这些驱动程序负责控制IPS114屏幕的亮度、对比度和刷新率等参数,以及显示图形和文字等内容。移植过程中需要进行相关的编码和调试工作,确保显示效果与原本的IPS114屏幕一致。 在进行IPS114屏幕移植时,还需要考虑目标设备的操作系统和应用软件的兼容性。如果目标设备使用的是不同的操作系统,可能需要对软件进行相应修改或重新开发,以适应IPS114屏幕的特性和驱动需求。同时,也需要测试和优化软件的性能,确保IPS114屏幕在目标设备上的稳定运行和良好用户体验。 总之,IPS114屏幕移植是一项涉及硬件改造、软件调试和兼容性测试的工程。只有充分考虑IPS114屏幕的特性和目标设备的要求,才能顺利完成移植工作,并使IPS114屏幕在新设备上发挥出其优势。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_lucky_R

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值