历史上的今天
今天是:2025年05月14日(星期三)
2019年05月14日 | arm7 力天电子lpc2148 GPIO之按键输入试验
2019-05-14 来源:eefocus
此实验中摁下某个按键后,把相关的信号并行传递到74HC165上,然后再通过串行方式传到处理器中,处理器在通过控制P0.22口(MAT0.0)来控制蜂鸣器
部分电路图如下所示:

注意:9号引脚接的是2148的MISO0(P0.5)

#include //宏定义 #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数据手册中功能方图: 可知第4位对应的外围引脚是3,再由上面的第一个图74HC165的连接图可发现它与KEY INT2相连,所以对应的是KEY2键 关于程序中74HC165的数据传送的方式自己还有待研究,之所以用到了74HC595,是因为力天电子的这款板子在进行设计是把把74HC165 的片选(165 CS)连接到了595上,所以必须得对595进行相应操作 
史海拾趣
|
没有钱可以挣,没有权可以争取,没有知识可以学习,没有技能可以讨教,一切没有的东西都可以用我们的双手创造出来。人最缺少的永远都只是态度和精神而已。很多年轻人都总是要在职业上经历大量的失败和挫折。那么他们究竟缺乏的是什么呢? ...… 查看全部问答> |
|
目录 第一章 概述 第二章 微机及其外设电源电路 第三章 电源维修方面 第四章 不间断电源 第五章 微机直流稳压电源 第六章 显示器电源 第七章 打印机电源 [ 本帖最后由 wzt 于 2010-3-10 18:10 编辑 ]… 查看全部问答> |
|
每种颜色代表不同的数字,如下: 棕1 红2 橙3 黄4 绿5 蓝6 紫7 灰8 白9 黑0 ,金、银表示误差 色环电阻是应用于各种电子设备的最多的电阻类型,无论怎样安装,维修者都能方便的读出其阻值,便于检测和更换。但在实践中发现,有些色环电阻的排列 ...… 查看全部问答> |
|
1 概述 当前,USB外设的开发是一个热点。由于USB总线具有传输速度快、占用资源少及真正的即插即用等优点,越来越受到业界的青睐。可是,USB的开发要求设计人员对USB的标准、Firmware(固件)编程及驱动程序的编写等有较深入的理解,因 ...… 查看全部问答> |
|
现在我用TIM4产生PWM,然后TIM2定时中断往TIM4扔音频数据,现在播放正常,但是发现在配置打开TIM4,TIM2后,USART1好像就失效了,就是串口1不能首发数据了,请问是TIM4,TIM2和串口一有冲突么?… 查看全部问答> |
|
关于CEDDK的READ_PORT_UCHAR(<端口号地址>),其中的端口号地址是在哪里定义的呢? 小弟最近在写一个GPIO驱动,在GPI_Read()流接口函数中想用READ_PORT_UCHAR()从指定的GPIO的端口接受数据。我用的是PXA270,其中的GPIO的端口号地址是在哪里定义的呢?我看了PXA270的datasheet好像没有发现。… 查看全部问答> |




