简介:此实验中摁下某个按键后,把相关的信号并行传递到74HC165上,然后再通过串行方式传到处理器中,处理器在通过控制P0.22口(MAT0.0)来控制蜂鸣器。
此实验中摁下某个按键后,把相关的信号并行传递到74HC165上,然后再通过串行方式传到处理器中,处理器在通过控制P0.22口(MAT0.0)来控制蜂鸣器
#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进行相应操作
上一篇:嵌入式系统中引导程序的实现
下一篇:ARM 架构/特性(处理器)全解
推荐阅读最新更新时间:2024-11-11 18:39
设计资源 培训 开发板 精华推荐
- 适用于 PSU 且效率大于 90% 的 36W 通用输入双输出辅助电源参考设计
- C5275115_AS5600非接触12位磁角度传感器验证板
- 使用热电偶测量温度的两种方法具有简单性、准确性和灵活性
- DER-442 - 30W 隔离反激式、1 - 10 V 模拟调光 LED 驱动器
- C481214-LDO一路输出方案验证板(小封装)
- AD8505ARJZ-R7 脉搏血氧计红色和红外电流源作为电压基准器件的缓冲器的典型应用电路
- DC2581A-A,基于 LTC2341-18 双通道、18 位、666ksps SAR ADC 的演示板
- 使用符合 EN55022 B 类(24Vin 和 48Vin,单输出)具有 EMC 滤波的 RP40-2412SFR DC/DC 转换器的典型应用
- 【成航PCB赛】音频功率放大电路
- NCP139AFCT110T2GEVB:NCP139 WLCSP-6 评估板 1V1
- ActiveSync USB同步连接在PC上要编程操作该怎么整?枚举USB设备,把其当一般的USB设备来操作?还是RAPI?
- 助你快速开发emwin
- TI DC/DC 电源双通道驱动器 UCC27201上电使用问题解决
- 那个牌子PLC的脉冲指令好用?并且效果也好?
- ubuntu 12.04(gcc降级)编译android代码遇到"_FORTIFY_SOURCE"的解决方法
- 求达人帮忙看下下面的程序怎么走的。
- stm32F407 fsmc接DM9000A,读取不到ID。求助!
- 2440如何通过USB读取SD卡上的数据呢?
- 嵌入式C里面设置绝对地址的数值的问题
- 市场上流通大量的AT89C51 24PI 09XX的芯片,但去ATMEL主页没发现这个批号,为什么?