ARM7 lpc2148之GPIO按键输入试验

来源:本站
导读:目前正在解读《ARM7 lpc2148之GPIO按键输入试验》的相关信息,《ARM7 lpc2148之GPIO按键输入试验》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《ARM7 lpc2148之GPIO按键输入试验》的详细说明。
简介:此实验中摁下某个按键后,把相关的信号并行传递到74HC165上,然后再通过串行方式传到处理器中,处理器在通过控制P0.22口(MAT0.0)来控制蜂鸣器。

此实验中摁下某个按键后,把相关的信号并行传递到74HC165上,然后再通过串行方式传到处理器中,处理器在通过控制P0.22口(MAT0.0)来控制蜂鸣器

部分电路图如下所示:

ARM7 lpc2148之GPIO按键输入试验

ARM7 lpc2148之GPIO按键输入试验

#include <NXP/iolpc2148.h>

//宏定义

#define SCLK 0x01<<24

#define SCK0 0x01<<4

#define MISO 0x01<<5

#define MOSI 0x01<<6

#define RCK 0x01<<7

void HC595_Init(void);

void WriteByte(unsigned char data);

void Write595(void);

void HC165_CS(char flag);

unsigned char Read165(void);

void Delayn(unsigned long n);

//595扩展接口的数据显示缓存

unsigned int HC595_DATA = 0xFFFFFFFF;

//初始化595接口

void HC595_Init(void)

{

IO0DIR |= MOSI|RCK|SCK0;

IO1DIR |= SCLK;

IO1CLR |= SCLK;

IO0DIR |= RCK;

HC595_DATA = 0xFFFFFFFF;Write595();

}

//写字节

void WriteByte(unsigned char data)

{

unsigned char i;

//IO0CLR = RCK;

for(i=0;i<8;i++)

{

if(data&0x01) IO0SET=MOSI;

else IO0CLR=MOSI;

IO1SET=SCLK;

data>>=1;

IO1CLR=SCLK;

}

//IO0SET = RCK;

}

//刷新595的数据

void Write595(void)

{

IO0CLR = RCK;

WriteByte(HC595_DATA&0xff);

WriteByte((HC595_DATA&0xff00)>>8);

WriteByte((HC595_DATA&0xff0000)>>16);

WriteByte((HC595_DATA&0xff000000)>>24);

IO0SET = RCK;

}

//165片选

void HC165_CS(char flag)

{

if(flag) ////CLK INH写入高电平,

HC595_DATA &= ~(1<<1);

else

HC595_DATA |= (1<<1);

Write595();

}

//读165的数据

unsigned char Read165(void)

{

unsigned char RD=0,i;

HC165_CS(1); //

IO1CLR_bit.P1_25 = 1;//写入1使对应引脚输出低电平,即使S/L(管脚1)得到低电平,在arm板接收数据前,必须将该引脚拉低,目的是为了将并行数据A--H上得数据装载到内部寄存器中,这里体现的时LOAD功能

Delayn(10);

IO1SET_bit.P1_25 = 1;//写入1使对应引脚输出高电平,接下来在接收数据的过程中必须将该引脚拉高,目的是为了使寄存器中的数据可以移动,从而从QH或QN'中移入单片机。这里体现的是SHIFT功能。

for(i=0;i<8;i++)

{

RD <<= 1; //左移一位

if(IO0PIN&MISO) //MISO0是74HC165输出的串行数据,看74HC165是否接收到数据,如果MISO0不为0则说明接收到了数据,

RD |= 1;//先接受高位

IO0SET=SCK0;//时钟为高,上升沿下一个数据移出(只有在CP为高时,才允许CE由低转高)

Delayn(10);

IO0CLR=SCK0;//时钟低电平 (我们只需将arm处理器的某一个端口拉低或抬高即可,这样数据就一步一步的被接收了。请务必记得上升沿有效。)

}

HC165_CS(0);

return RD;

}

main()

{

PINSEL0=0x000000;

PINSEL1=0x000000; //所有引脚连接GPIO

unsigned char HC165_DATA;

IO1DIR_bit.P1_25 = 1;

IO1SET_bit.P1_25 = 1;

PINSEL0_bit.P0_5 = 0;

//IO0DIR_bit.P0_5 = 0; //HC165输入管脚

IO0DIR=1<<22; //蜂鸣器控制口设置为输出,其余输入

HC595_Init();

while(1)

{

HC165_DATA = Read165();

if((HC165_DATA&(1<<4))==0) IO0SET=1<<22; //当KEY2按下的时候,蜂鸣器响起(此处解释见下面)

else IO0CLR=1<<22; //松开KEY2,蜂鸣器停止蜂鸣

}

}

//延时周期数

void Delayn(unsigned long n)

{

while(n--);

}

最后说明:

对主函数中if((HC165_DATA&(1<<4))==0) IO0SET=1<<22的解释,1<<4位使得第4位变为1,有74HC165数据手册中功能方图:

ARM7 lpc2148之GPIO按键输入试验 可知第4位对应的外围引脚是3,再由上面的第一个图74HC165的连接图可发现它与KEY INT2相连,所以对应的是KEY2键

关于程序中74HC165的数据传送的方式自己还有待研究,之所以用到了74HC595,是因为力天电子的这款板子在进行设计是把把74HC165 的片选(165 CS)连接到了595上,所以必须得对595进行相应操作

提醒:《ARM7 lpc2148之GPIO按键输入试验》最后刷新时间 2024-03-14 00:54:23,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《ARM7 lpc2148之GPIO按键输入试验》该内容的真实性请自行鉴别。