arm7单片机编程实例,ARM7之输入/输出端口GPIO编程教程

  一、输入/输出端口GPIO编程

  一—(01)、一位数码管静态显示(通过74HC595实现)

  1、管脚连接模块

  首先介绍一下LPC2106的相关的管脚~~

  特性:可以实现独立的管脚配置

  应用:管脚连接模块的用途是将管脚配置为需要的功能(这一章节主要就是介绍GPIO功能~~别的会在接下来的章节中分别予以介绍~~)

  描述:管脚连接模块可以使所选管脚具有一个以上的功能。配置寄存器控制多路开关来连接管脚与片内外设。外设在激活和任何相关只读使能之前必须连接到适当的管脚。任何使能的外设功能如果没有映射到相应的管脚,则被认为是无效的。

  寄存器的描述:

  管脚连接模块包括两个寄存器:

arm7单片机编程实例,ARM7之输入/输出端口GPIO编程教程

  管脚功能寄存器0:(PINSEL0)

  PINSEL0寄存器按照下表当中的设定来控制管脚的功能。

  IODIR寄存器中的方向控制位只有在管脚选择为GPIO的功能时才有效(也就是本章要讲述的)。对于其它功能,方向是自动控制的。

arm7单片机编程实例,ARM7之输入/输出端口GPIO编程教程
arm7单片机编程实例,ARM7之输入/输出端口GPIO编程教程
arm7单片机编程实例,ARM7之输入/输出端口GPIO编程教程
arm7单片机编程实例,ARM7之输入/输出端口GPIO编程教程
arm7单片机编程实例,ARM7之输入/输出端口GPIO编程教程

  管脚功能寄存器1:(PINSEL1)

  PINSEL1寄存器按照下表来设定控制管脚的功能。

  IODIR寄存器中的方向控制位只有在管脚选择GPIO功能时才有效。对于其它功能,方向是自动控制的。

  在复位时拉低DBGSEL时,只要管脚P0.17-P0.31的功能控制有效。

arm7单片机编程实例,ARM7之输入/输出端口GPIO编程教程
arm7单片机编程实例,ARM7之输入/输出端口GPIO编程教程
arm7单片机编程实例,ARM7之输入/输出端口GPIO编程教程
arm7单片机编程实例,ARM7之输入/输出端口GPIO编程教程
arm7单片机编程实例,ARM7之输入/输出端口GPIO编程教程

 

  管脚功能寄存器值:

  PINSEL寄存器控制器件管脚的功能。如下图。

  每一对寄存器位对应一个特定的器件管脚。

  只有当管脚选择为GPIO功能时,IODIR寄存器的方向控制位才有效。

  其它功能的方向是自动控制的。

  每个派生期间通常具有不同的管脚分布,因此每个管脚可能有不同的功能。

  2、GPIO

  特性:

  1)单个位的方向控制

  2)单独控制输出的置位和清零

  3)所有I/0口在复位后默认为输入

  应用:

  1)通用I/0口

  2)驱动LED或者其他指示器

  3)驱动片外器件

  4)检测数字输入

  管脚描述:

  寄存器描述:

  GPIO包含4个寄存器,如下表:

  GPIO引脚值寄存器IOPIN:

  GPIO输出置位寄存器IOSET:

  GPIO输出清零寄存器:

  GPIO方向寄存器:

  然后就是今天要做的实验:

  一位数码管的静态显示

  用IAR for ARM就是调不好~~

  换用了Keil

  浪费我大把时间了

  早知道就早用Keil了

  回头还得再调试一下IAR

  然后就是程序了~~

  MDK1_1.c(先是主程序吗~~你懂得)

  //------------------------------------------------------------------------------

  //LED数码管显示

  //通过I/O模拟同步串行接口与74HC595进行连接,控制74HC595驱动LED数码管显示

  //------------------------------------------------------------------------------

  #include“lpc210x.h”

  typedef unsigned long uint32;

  typedef unsigned char uchar;

  #define SPI_IO 0x00000150 //SPI接口的I/O设置字

  uchar const seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0.82,0xf8,

  0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

  //------------------------------------------------------------------------------

  //延时函数

  void delay(uint32 z)

  {

  uint32 i;

  for(;z》0;z--)

  for(i=0;i《50000;i++);

  }

  //------------------------------------------------------------------------------

  //main

  int main()

  {

  uchar i;

  PINSEL0=0X00000000;

  PINSEL1=0X00000000; //设置左右引脚连接GPIO

  IODIR=SPI_IO; //设置SPI控制口为输出~~由于这是模拟的,所以需要自己设置方向位

  while(1)

  {

  for(i=0;i《16;i++)

  {

  HC595_send_data(seg[i]);

  delay(1);

  }

  }

  }

  74HC595.c

  //------------------------------------------------------------------------------

  //74HC595模拟SPI通信,便于调用

  #include“lpc210x.h”

  typedef unsigned long uint32;

  typedef unsigned char uchar;

  #define SPI_CS 0x00000100 //P0.8模拟片选

  #define SPI_DA 0x00000040 //P0.6模拟数据传输口

  #define SPI_CLK 0x00000010 //P0.4模拟CLK

  //------------------------------------------------------------------------------

  //向74HC595发送一个字节函数(发送数据时,高位在前)

  //还是大概介绍一下74HC595吧:

  //74HC595是具有8位移位寄存器和一个存储器,三态输出功能。

  //移位寄存器和存储器是分别的时钟。

  //数据在SH_CP的上升沿输入到移位寄存器中,在ST_CP的上升沿输入到存储寄存器中去。

  //如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲(一般不会这么用吧~~)。

  //移位寄存器有一个串行移位输入(DS),和一个串行输出(Q7’),和一个异步的低电平复位。

  //存储寄存器有一个并行8位的,具备三态的总线输出,当使能OE时(为低电平),存储寄存器的数据输出到总线。

  void HC595_send_data(uchar dat)

  {

  uchar i;

  IOCLR=SPI_CS; //SPI_CS=0

  for(i=0;i《8;i++) //模拟SPI~~

  {

  IOCLR=SPI_CLK; //SPI_CLK=0

  if((dat&0x80)!=0) //设置SPI_DA的输出值

  IOSET=SPI_DA; //要从最高位发送,当最高位为1时,置位SPI_DA

  else

  IOCLR=SPI_DA; //当最高位为0时,清零SPI_DA

  dat《《=1; //dat循环左移一位

  IOSET=SPI_CLK; //SPI_CLK为1,一个脉冲上升沿,将数据移入移位寄存器

  }

  IOSET=SPI_CS; //SPI_CS=1,输入到存储寄存器中,由于片选一直为低,所以直接就输出显示的数据

  }

技术专区

  • 裸机程序如何驱动硬件?看前辈是怎么说的
  • ARM紧耦合内存简介及配置
  • ARMv8 通过设计简化软件移植详解
  • STM32中断优先级谁更高 主要根据两个方面来判断
  • 基于ARM与DSP的主从式双CPU嵌入式四轴运动控制器设计方案
  • arm7单片机编程实例,ARM7之输入/输出端口GPIO编程教程已关闭评论
    A+
发布日期:2019年07月14日  所属分类:物联网