新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > ARM7單片機(學習ing)—(一)、輸入/輸出端口GPIO編程—01

ARM7單片機(學習ing)—(一)、輸入/輸出端口GPIO編程—01

作者: 時間:2017-05-02 來源:網(wǎng)絡 收藏

  一、輸入/輸出端口編程

本文引用地址:http://2s4d.com/article/201705/358654.htm

  一—(01)、一位數(shù)碼管靜態(tài)顯示(通過74HC595實現(xiàn))

  1、管腳連接模塊

  首先介紹一下LPC2106的相關的管腳~~

  特性:可以實現(xiàn)獨立的管腳配置

  應用:管腳連接模塊的用途是將管腳配置為需要的功能(這一章節(jié)主要就是介紹功能~~別的會在接下來的章節(jié)中分別予以介紹~~)

  描述:管腳連接模塊可以使所選管腳具有一個以上的功能。配置寄存器控制多路開關來連接管腳與片內外設。外設在激活和任何相關只讀使能之前必須連接到適當?shù)墓苣_。任何使能的外設功能如果沒有映射到相應的管腳,則被認為是無效的。

  寄存器的描述:

  管腳連接模塊包括兩個寄存器:

    

 

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

  PINSEL0寄存器按照下表當中的設定來控制管腳的功能。

  IODIR寄存器中的方向控制位只有在管腳選擇為的功能時才有效(也就是本章要講述的)。對于其它功能,方向是自動控制的。

    

 

    

 

    

 

    

 

    

 

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

  PINSEL1寄存器按照下表來設定控制管腳的功能。

  IODIR寄存器中的方向控制位只有在管腳選擇GPIO功能時才有效。對于其它功能,方向是自動控制的。

  在復位時拉低DBGSEL時,只要管腳P0.17-P0.31的功能控制有效。(這個還真的不知道哎~~  

)    

 

    

 

    

 

    

 

    

 

  管腳功能寄存器值:

  PINSEL寄存器控制器件管腳的功能。如下圖。

  每一對寄存器位對應一個特定的器件管腳。

  只有當管腳選擇為GPIO功能時,IODIR寄存器的方向控制位才有效。

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

  每個派生期間通常具有不同的管腳分布,因此每個管腳可能有不同的功能。

    

 

  2、GPIO

  特性:

  1)單個位的方向控制

  2)單獨控制輸出的置位和清零

  3)所有I/0口在復位后默認為輸入

  應用:

  1)通用I/0口

  2)驅動LED或者其他指示器

  3)驅動片外器件

  4)檢測數(shù)字輸入

  管腳描述:  

 

  寄存器描述:

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

    

 

  GPIO引腳值寄存器IOPIN:

    

 

  GPIO輸出置位寄存器IOSET:

    

 

  GPIO輸出清零寄存器:

    

 

  GPIO方向寄存器:

    

 

    

 

  好了,就這么點吧~~

  然后就是今天要做的實驗:

  一位數(shù)碼管的靜態(tài)顯示

  暈了~~用IAR for ARM就是調不好~~

  shit~~

  然后就換用了Keil~~

  浪費我大把時間了~~

  早知道就早用Keil了~~

  回頭還得再調試一下IAR~~

  好了,發(fā)圖~~

    

 

    

 

  然后就是程序了~~

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

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

  //LED數(shù)碼管顯示

  //通過I/O模擬同步串行接口與74HC595進行連接,控制74HC595驅動LED數(shù)碼管顯示

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

  #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};

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

  //延時函數(shù)

  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模擬數(shù)據(jù)傳輸口

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

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

  //向74HC595發(fā)送一個字節(jié)函數(shù)(發(fā)送數(shù)據(jù)時,高位在前)

  //還是大概介紹一下74HC595吧:

  //74HC595是具有8位移位寄存器和一個存儲器,三態(tài)輸出功能。

  //移位寄存器和存儲器是分別的時鐘。

  //數(shù)據(jù)在SH_CP的上升沿輸入到移位寄存器中,在ST_CP的上升沿輸入到存儲寄存器中去。

  //如果兩個時鐘連在一起,則移位寄存器總是比存儲寄存器早一個脈沖(一般不會這么用吧~~)。

  //移位寄存器有一個串行移位輸入(DS),和一個串行輸出(Q7’),和一個異步的低電平復位。

  //存儲寄存器有一個并行8位的,具備三態(tài)的總線輸出,當使能OE時(為低電平),存儲寄存器的數(shù)據(jù)輸出到總線。

  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; //要從最高位發(fā)送,當最高位為1時,置位SPI_DA

  else

  IOCLR=SPI_DA; //當最高位為0時,清零SPI_DA

  dat<<=1; //dat循環(huán)左移一位

  IOSET=SPI_CLK; //SPI_CLK為1,一個脈沖上升沿,將數(shù)據(jù)移入移位寄存器

  }

  IOSET=SPI_CS; //SPI_CS=1,輸入到存儲寄存器中,由于片選一直為低,所以直接就輸出顯示的數(shù)據(jù)

  }



關鍵詞: ARM7 GPIO

評論


相關推薦

技術專區(qū)

關閉