ARM920T实验箱s3c2410 矩阵按键控制步进电机正反转和停止

这篇具有很好参考价值的文章主要介绍了ARM920T实验箱s3c2410 矩阵按键控制步进电机正反转和停止。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题描述

按下第一个按键使步进电机可以正转、第二个反转反转、第三个按键停止

矩阵按键控制

画了张矩阵按键的内部电路图:

ARM920T实验箱s3c2410 矩阵按键控制步进电机正反转和停止

矩阵按键实物图:
ARM920T实验箱s3c2410 矩阵按键控制步进电机正反转和停止

ABC按键右边的就是步进电机。

按键第一行连接的是寄存器GPFDAT0的端口
第二行连接的是寄存器GPFDAT2的端口
第三行连接的是寄存器GPGDAT3的端口
第四行连接的是寄存器GPGDAT11的端口

GPF寄存器是8个位;GPG、GPE寄存器是16位。每种寄存器还对应有GPCON控制寄存器和GPUP上拉电阻寄存器。这里可以不用配置GP*UP上拉电阻。

GP*CON控制寄存器00输入,01输出,10中断,11保留

思路

将行配置为输入,列配置为输出。因为行连接电源,在按键没被按下时是高电平,按下后行的电平变为列电平值。

//按键,列的地址,低四位控制 #define KEY_LINE (*(volatile unsigned short*)0x38001002)

检测分三步:
1、将行配置为输入,列配置为输出。
2、首先将列全部置0,检测行是否位0,是则说明这一行有按键被按下;
3、再将一列置0,其余三列置1,检测行是否位0,是则说明这行这列的按键被按下。若不是,再将第二列置0,其余三列置1,再检测行是否为0。剩余两列也一样。

配置输入输出
void KeyInit() //按键初始化
{
    //00为输入,01为输出
    
    //输入
    GPFCON=(GPECON & (~(0x3<<0)));//初始化GPF0为输入
    GPFCON=(GPECON & (~(0x3<<4)));//初始化GPF2为输入
    
    
    GPGCON=(GPGCON & (~(0x3<<6)));//初始化GPG3、GPG11为输入
    GPGCON=(GPGCON & (~(0x3<<22)));
    
    //输出
    GPECON=(GPECON & (~(0x3<<6)));
    GPECON=(GPECON | (0x1<<6));//初始化GPE3为输出
    GPECON=(GPECON & (~(0x3<<22)));
    GPECON=(GPECON | (0x1<<22));//初始化GPE11为输出
    
    
    GPGCON=(GPGCON & (~(0x3<<4)));
    GPECON=(GPECON | (0x1<<4));//初始化GPG2为输出
    GPGCON=(GPGCON & (~(0x3<<12)));
    GPECON=(GPECON | (0x1<<12));//初始化GPG6为输出
}
按键扫描

//*
*按键扫描函数
*/
unsigned int KeyNum() 
{
    //初始化不为0~15就都行
    //0000
    column(0);
    if((GPFDAT & 0X01) == 0)
    {
        delay_ms(20);//消抖
        //0111
        column(1);
        if((GPFDAT & 0X01) == 0) // key7被按下
        {
            delay_ms(20);
            return Key = SEVEN;
        }
        else
            column(2); //1011
        if((GPFDAT & 0X01) == 0) //key8被按下
        {
            delay_ms(20);
            return Key = EIGHT;
        }
        else
            column(3);//1101
        if((GPFDAT & 0X01) == 0) //key9 被按下
        {
            delay_ms(20);
           return Key= NINE;
        }
        else
            column(4);//1110
        if((GPFDAT & 0X01) == 0) //keyA 被按下
        {
            delay_ms(20);
           return Key= A;
        }
    }
    else if ((GPFDAT & 0x04) == 0)//第二行
    {
        delay_ms(20);//消抖
        //0111
        column(1);
        if((GPFDAT & 0x04) == 0) // key4被按下
        {
            delay_ms(20);
           return Key = FOUR;
        }
        else
            column(2);//1011
        
        if((GPFDAT & 0x04) == 0) //key5被按下
        {
            delay_ms(20);
           return Key = FIVE;
        }
        else
            column(3);//1101
        if((GPFDAT & 0x04) == 0) //key6 被按下
        {
            delay_ms(20);
           return Key= SIX;
        }
        else
            column(4);//1110
        if((GPFDAT & 0x04) == 0) //keyB 被按下
        {
            delay_ms(20);
           return Key= B;
        }
    }
    else if ((GPGDAT & 0x0008) == 0) //第三行
    {
        delay_ms(20);//消抖
        //0111
        column(1);
        if((GPGDAT & 0x0008) == 0) // key1被按下
        {
            delay_ms(20);
           return Key = ONE;
        }
        //1011
        else
            column(2);
        if((GPGDAT & 0x0008) == 0) //key2被按下
        {
            delay_ms(20);
           return Key = TWO;
        }
        else//1101
            column(3);
        if((GPGDAT & 0x0008) == 0) //key3 被按下
        {
            delay_ms(20);
          return  Key= THREE;
        }
        //1110
        else
            column(4);
        if((GPGDAT & 0x0008) == 0) //keyC 被按下
        {
            delay_ms(20);
           return Key= C;
        }
    }
    else if ((GPGDAT & 0x0800) == 0) //第四行
    {
        delay_ms(20);//消抖
        //0111
        column(1);
        if((GPGDAT & 0x0800) == 0) // key0被按下
        {
            delay_ms(20);
           return Key = ZERO;
        }
        else//1011
            column(2);
        if((GPGDAT & 0x0800) == 0) //keyF被按下
        {
            delay_ms(20);
           return Key = F;
        }
        //1101
        else
            column(3);
        if((GPGDAT & 0x0800) == 0) //keyE 被按下
        {
            delay_ms(20);
           return Key= E;
        }
        //1110
        else
            column(4);
        if((GPGDAT & 0x0800) == 0) //keyD 被按下
        {
            delay_ms(20);
           return Key= D;
        }
    }
    return Key;
}

步进电机控制

步进电机有A、B、 C、 D四个相,分别对应四个位,正向依次通电(A->B->C->D)即可实现正转;反向依次通电即可实现反转(D->C->B->A)
注意:每次通电一个相后,需要给一点延迟。

步进电机地址0x38001000

以如下方式定义地址后:
#define DIANJI (*(volatile unsigned short*)0x38001000)

通过给电机地址赋值即可实现正反转:

unsigned short shuju[4] = {0x01, 0x02, 0x04, 0x08};
unsigned int i, j;
 //步进电机正转
 for (i = 0; i < 4; i++)
{
    DIANJI = shuju[i];
    delay_ms(100);
}
    //步进电机反转
for (j = 4; j > 0; j--)
{
    DIANJI = shuju[j-1];
    delay_ms(100);
 }

完整代码

本文是通过轮循的方式扫描按键是否被按下,完整代码如下:文章来源地址https://www.toymoban.com/news/detail-484871.html


#include <stdio.h>

//定义键盘数字值
#define ZERO 0
#define ONE 1
#define TWO 2
#define THREE 3
#define FOUR 4
#define FIVE 5
#define SIX 6
#define SEVEN 7
#define EIGHT 8
#define NINE 9
#define A 10
#define B 11
#define C 12
#define D 13
#define E 14
#define F 15
#define KEY_INIT 20 //按键初始化的值,只要不是0~15就行


/*定义步进电机地址*/
#define DIANJI (*(volatile unsigned short*)0x38001000)

//按键,列的地址,通过低四位控制
#define KEY_LINE (*(volatile unsigned short*)0x38001002)


/*定义IO端口地址*/
#define GPFCON (*(volatile unsigned *)0x56000050) //Port F control
#define GPFDAT (*(volatile unsigned *)0x56000054) //Port F data
#define GPFUP  (*(volatile unsigned *)0x56000058) //Pull-up control F

#define GPGCON (*(volatile unsigned *)0x56000060) //Port G control
#define GPGDAT (*(volatile unsigned *)0x56000064) //Port G data
#define GPGUP  (*(volatile unsigned *)0x56000068) //Pull-up control G

#define GPECON (*(volatile unsigned *)0x56000040) //Port E control
#define GPEDAT (*(volatile unsigned *)0x56000044) //Port E data
#define GPEUP  (*(volatile unsigned *)0x56000048) //Pull-up control E

//控制步进电机正反转的数据
/**
* 电机有A、B、C、D四个相,对应四个位,分别给每个相通电。
*/
unsigned short shuju[4] = {0x01, 0x02, 0x04, 0x08};

//定义按键扫描获取的返回变量
unsigned int Key = KEY_INIT;

/**
 *12MHz
 * N ms延时
 */
void delay_ms(unsigned int n)
{
    unsigned int i=0,j=0;
    for(i=0;i<n;i++)
        for(j=0;j<123;j++);
}


//延时n秒
void delay_s(unsigned int n)
{
    unsigned int i=0,j=0;
    for(i=0;i<n;i++)
        for(j=0;j<21738;j++);
}


void KeyInit() //按键初始化
{
    //00为输入,01为输出
    
    //输入
    GPFCON=(GPECON & (~(0x3<<0)));//初始化GPF0为输入
    GPFCON=(GPECON & (~(0x3<<4)));//初始化GPF2为输入
    
    
    GPGCON=(GPGCON & (~(0x3<<6)));//初始化GPG3、GPG11为输入
    GPGCON=(GPGCON & (~(0x3<<22)));
    
    //输出
    GPECON=(GPECON & (~(0x3<<6)));
    GPECON=(GPECON | (0x1<<6));//初始化GPE3为输出
    GPECON=(GPECON & (~(0x3<<22)));
    GPECON=(GPECON | (0x1<<22));//初始化GPE11为输出
    
    
    GPGCON=(GPGCON & (~(0x3<<4)));
    GPECON=(GPECON | (0x1<<4));//初始化GPG2为输出
    GPGCON=(GPGCON & (~(0x3<<12)));
    GPECON=(GPECON | (0x1<<12));//初始化GPG6为输出
    
    
}

//电机停止
void dj_stop() 
{
    DIANJI = 0;
    delay_ms(100);
}

/**
*逐列扫
*
 * column表示需要置0的列
 * 0表示四列全置0
 * 1 -> 第一列为0,其余为1
 * 2 -> 第二列为0,其余为1
 * 3 -> 第三列为0,其余为1
 * 4 -> 第四列为0,其余为1
 */
void column(unsigned int column)
{
    switch (column) {
        case 0:
            //0000
            KEY_LINE = 0x00;
            break;
            
        case 1:
            //0111
            KEY_LINE = 0x0e;
            break;
            
        case 2:
            //1011
            
            KEY_LINE = 0x0d;
            
            break;
            
        case 3:
            //1101
            
            KEY_LINE = 0x0b;
            break;
            
        case 4:
            //1110
            KEY_LINE = 0x07;
            
        default:
            //1111
            KEY_LINE = 0x0F;
            break;
    }
}

/*
*按键扫描函数
*/
unsigned int KeyNum() 
{
    //初始化不为0~15就都行
    //0000
    column(0);
    if((GPFDAT & 0X01) == 0)
    {
        delay_ms(20);//消抖
        //0111
        column(1);
        if((GPFDAT & 0X01) == 0) // key7被按下
        {
            delay_ms(20);
            return Key = SEVEN;
        }
        else
            column(2); //1011
        if((GPFDAT & 0X01) == 0) //key8被按下
        {
            delay_ms(20);
            return Key = EIGHT;
        }
        else
            column(3);//1101
        if((GPFDAT & 0X01) == 0) //key9 被按下
        {
            delay_ms(20);
           return Key= NINE;
        }
        else
            column(4);//1110
        if((GPFDAT & 0X01) == 0) //keyA 被按下
        {
            delay_ms(20);
           return Key= A;
        }
    }
    else if ((GPFDAT & 0x04) == 0)//第二行
    {
        delay_ms(20);//消抖
        //0111
        column(1);
        if((GPFDAT & 0x04) == 0) // key4被按下
        {
            delay_ms(20);
           return Key = FOUR;
        }
        else
            column(2);//1011
        
        if((GPFDAT & 0x04) == 0) //key5被按下
        {
            delay_ms(20);
           return Key = FIVE;
        }
        else
            column(3);//1101
        if((GPFDAT & 0x04) == 0) //key6 被按下
        {
            delay_ms(20);
           return Key= SIX;
        }
        else
            column(4);//1110
        if((GPFDAT & 0x04) == 0) //keyB 被按下
        {
            delay_ms(20);
           return Key= B;
        }
    }
    else if ((GPGDAT & 0x0008) == 0) //第三行
    {
        delay_ms(20);//消抖
        //0111
        column(1);
        if((GPGDAT & 0x0008) == 0) // key1被按下
        {
            delay_ms(20);
           return Key = ONE;
        }
        //1011
        else
            column(2);
        if((GPGDAT & 0x0008) == 0) //key2被按下
        {
            delay_ms(20);
           return Key = TWO;
        }
        else//1101
            column(3);
        if((GPGDAT & 0x0008) == 0) //key3 被按下
        {
            delay_ms(20);
          return  Key= THREE;
        }
        //1110
        else
            column(4);
        if((GPGDAT & 0x0008) == 0) //keyC 被按下
        {
            delay_ms(20);
           return Key= C;
        }
    }
    else if ((GPGDAT & 0x0800) == 0) //第四行
    {
        delay_ms(20);//消抖
        //0111
        column(1);
        if((GPGDAT & 0x0800) == 0) // key0被按下
        {
            delay_ms(20);
           return Key = ZERO;
        }
        else//1011
            column(2);
        if((GPGDAT & 0x0800) == 0) //keyF被按下
        {
            delay_ms(20);
           return Key = F;
        }
        //1101
        else
            column(3);
        if((GPGDAT & 0x0800) == 0) //keyE 被按下
        {
            delay_ms(20);
           return Key= E;
        }
        //1110
        else
            column(4);
        if((GPGDAT & 0x0800) == 0) //keyD 被按下
        {
            delay_ms(20);
           return Key= D;
        }
    }
    return Key;
}

void Main()
{
    unsigned int key, i, j;
    KeyInit();
    while (1)
    {
        key = KeyNum();
        if (key != KEY_INIT) //按键有被按下
        {
            switch (key) //按下的是那颗按键
            {
                case SEVEN: 
                    //步进电机正转
                    for (i = 0; i < 4; i++)
                    {
                        DIANJI = shuju[i];
                        delay_ms(100);
                    }
                    break;
                case EIGHT:
                //步进电机反转
                    for (j = 4; j > 0; j--)
                    {
                        DIANJI = shuju[j-1];
                        delay_ms(100);
                    }
                    break;
                case NINE:
                    dj_stop();
                    break;
                default:
                    dj_stop();
                    break;
            }
            
        }
    }
}

到了这里,关于ARM920T实验箱s3c2410 矩阵按键控制步进电机正反转和停止的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 用唐都实验箱通过微指令实现冒泡排序,原码一位乘和栈的相关操作

    摘要 1 前言 2 实验原理 2.1 数据格式 2.2 指令格式 2.3 数据通路框图 3 总体****设计 3.1 微指令流程图 3.2 指令系统 3.3 线路连接图 4 详细设****计 4.1 冒泡排序 4.2 原码一位乘 4.3 堆栈 5 实验结果 5.1 冒泡排序 5.2 原码一位乘 5.3堆栈 6 参考文献 摘要 本次课程设计首先对复杂模型机进

    2024年02月03日
    浏览(53)
  • 深度相机、实验箱、扫描仪、机器狗…… 奥比中光超强性能3D视觉应用亮相VALSE 2023

    6月10日-12日,VALSE 2023视觉与学习青年学者研讨会在江苏无锡举办,奥比中光作为金牌赞助商,携Femto Mega与Gemini 2系列3D相机以及3D视觉实验箱开发套件、手持3D扫描仪、四足机器狗等创新解决方案参展,为3D视觉开发者提供多样化的开发选择。 VALSE是计算机视觉、图像处理、模

    2024年02月09日
    浏览(84)
  • 20230705点亮STC32G实验箱9.6(STC32G12K128)开发板的跑马灯LED(深入了解)

    08第六集:LED闪烁第六集:LED闪烁和花式点灯上和花式点灯上.mp4 09第六集:LED闪烁和花式点灯下.mp4 【大文哥学习32位8051】20230704【冲哥视频】第六集的晶振时钟的学习困惑 2023/7/5 17:36 delay_ms(3000); 刷机的时候如果使用11.0592M的Fosc,3秒钟的延迟大概7秒钟。 刷机的时候如果使用

    2024年02月12日
    浏览(47)
  • ARM-Linux驱动内核(S3C2440)

    Linux启动流程 驱动(程序) : 驱使设备行动的程序 1. 启动bootloader---引导操作系统启动的(裸机)程序,为操作系统启动准备环境,并引导操作系统启动 2. 启动kernel---操作系统核心 (俗称的操作系统) 3. 加载根文件系统---一堆文件的集合(根目录下的文件)   存储分类 RAM(随机存储

    2024年01月23日
    浏览(45)
  • 鲲鹏920(ARM64)移植javacpp

    JavaCPP 使得Java 应用可以在高效的访问本地C++方法,JavaCPP底层使用了JNI技术,可以广泛的用在Java SE应用中(也包括安卓),以下两个特性是JavaCPP的关键,稍后咱们会用到: 提供一些注解,将Java代码映射为C++代码 提供一个jar,用java -jar命令可以将C++代码转为java应用可以访问

    2024年02月09日
    浏览(48)
  • PWM定时器精准定时实现led闪烁(S3C2440裸机开发)

    上期和大家分享了使用PWM定时器输出周期方波驱动蜂鸣器,那么本期分享的内容是使用PWM定时器实现定时器的功能,有了上期的基础,这期分享的内容大家理解起来应该非常easy,接下来看一下吧! PWM定时器的原理其实是使用了中断,这里使用的定时器0; 如下实现的是每过两

    2024年02月15日
    浏览(47)
  • ESP32S3串口实验

    ESP32S3 一共有三个 UART 通讯接口,设备号从 0~2,即 UART0,UART1,UART2。这三个串口的管脚不 是固定的,是可以重映射到任意的 IO 口的。 ESP32S3 的 BOOT 程序把 UART0 用于程序下载,LOG 输出,我们的第一个实验 hello world 的 LOG 就是从 UART0 输出的。这个实验的 UART1 和 UART2 没有外接

    2024年02月12日
    浏览(40)
  • H3C 综合实验

    设备改名 按照图示要求将其中设备改名,交换机sw111-sw555,路由器r1-r5 IP地址分配 按图示要求,将计算机设备及路由相应端口设置IP地址 链路聚合 在sw111和sw222之间的G1/0/1-2接口设置链路聚合,聚合链路编号为1,工作模式为trunk VLAN 在sw111、sw222上创建vlan 10、20,将G1/0/3置于v

    2024年02月07日
    浏览(46)
  • H3C-Cloud Lab实验-链路聚合实验

    实验拓扑图: 实验需求: 1、按照图示配置PC3和PC4的IP地址 2、在SW1和SW2的两条直连链路上配置链路聚合,实现链路冗余,并可以增加传输带宽 3、SW1和SW2之间的直连链路要配置为Trunk类型,允许所有vlan通过 4、中断SW1和SW2之间的一条直连链路,测试PC3和PC4是否仍然能够继续访

    2024年02月16日
    浏览(35)
  • H3C-Cloud Lab实验-OSPF配置实验

    一、实验拓扑图 实验需求: 1、按照图示配置 IP 地址 2、按照图示分区域配置 OSPF ,实现全网互通 3、为了路由结构稳定,要求路由器使用环回口作为 Router-id,ABR 的环回口宣告进骨干区域 4、掌握OSPF初始化流程、路由表学习的过程 二、实验步骤 1)CRT连接设备 2)依次对5台设

    2024年02月16日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包