Proteus仿真-ARM7单片机-输入/输出端口GPIO编程01


作者:Justin

博客地址:http://blog.sina.com.cn/lonlycorner520  

点击阅读原文,可以看到完成的笔记系列

真不容易,总算是完成了我的第一个ARM7单片机的程序,虽然很简单,但是我也是花费了好长时间的,从IAR for ARM这个软件的学习,其中遇到的最严重的问题就是头文件问题,哎~~整了半天,后来在它们提供的例子中这才恍然大悟,我列个去,还得加上路径~~差点崩溃~~,然后就是在网上乱搜,各种找教程啊~~~,哎,晕了,还以为什么必须要main.c文件呢,狗屁,小弟果断不用,也可以仿真~~~在学习IAR for ARM这个软件的时候最不会的当然就是启动文件不明白了~~至今还是一头雾水呢,真的不会编写那个(貌似只有高手才懂得~,我就果断不看了,谁然我是个菜鸟),不过暂时还是不要太着急,慢慢来吧,就先凑合着用软件自带的启动文件喽~~

然后就是Proteus仿真,又开始晕了,各种错误~~还以为可不加什么电源,接地的,还以为跟51单片机,AVR单片机是一样的(唯一的共同点就是不用扩展外部晶振),就这样一点一点的摸索着潜进~~

好了,贴两张图片吧,看看我的源程序和仿真的结果:

还有,我忘记说我用的芯片:是Philips公司的LPC2106(虽然早就过时了,但是仿真吗~~只有这么几个~~

//------------------------------------------------------------------------------
//单个LED闪烁控制实验
//功能:LED闪烁控制。对LED控制
#include"nxp/iolpc2106.h"
#define ledcon  0x00000200          //P0.9引脚控制LED,低电平点亮
//------------------------------------------------------------------------------
//main
void main()
{
  PINSEL0=0X00000000;               //设置所有引脚连接GPIO
  PINSEL1=0X00000000;
  IODIR=ledcon;                     //设置P0.9连接的LED控制为输出
  IOCLR=ledcon;
}

只是简单的驱动ARM~~

暂时不涉及太多的嵌入式~~

一点一点开始吧~~

~~

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

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

1、管脚连接模块

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

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

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

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

寄存器的描述:

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

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

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

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


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

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

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

在复位时拉低DBGSEL时,只要管脚P0.17-P0.31的功能控制有效。(这个还真的不知道哎~~

 

管脚功能寄存器值:

我们大学单片机教材是msp430,是16位的单片机。对于当时的我来说,这单片机太复杂了,所以我在淘宝淘了51的开发板,自己看视频学习。单片机学习就是边看边敲代码。照着例程一个个敲。郭天祥的十天学会单片机应该说是当时最火的51单片机教程。现在我已经好久没了解过了,应该经过这么多年的发展,开发板市场已经一片红海了,竞争压力下,应该会有更多的优质课程。

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,0x82,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,输入到存储寄存器中,由于片选一直为低,所以直接就输出显示的数据
}

单片机

每天更新
单片机
各种知识,电子制作DIY,及
电子行业
最新资讯,关注我们,棒棒哒!

到这里,就差不多介绍完了,但是单片机的知识面非常庞杂,相比起来,本篇文章十分粗浅,冰山一角,我只是从一个软件程序员的角度去介绍它,想通过本文让想学习STM32单片机开发的新同学看到一个相对完整的从0到第一个闪灯实验的过程,依此概览单片机学习和开发的轮廓。

生成海报
点赞 0

Abin

我还没有学会写个人说明!

相关推荐

STM32F4最小系统硬件设计

对于硬件工程师来讲,想要入门STM32相关的开发,我想除了深入阅读一下STM32的数据手册外,最实用且有效的方法就是自己实际做一个STM32的最小系统板了。本文将以一个小的STM32F427VG的电路最

STM32F1移植U8g2库

STM32移植U8g2库 MCU为STM32F1030C8T6最小系统,使用STM32CubeMX生成HAL库工程模板,采用硬件四线SPI连接0.96寸单色OLED(驱动芯片为SSD1306,128*