返回列表 发帖

74HC595 74HC165程序例子

硬件说明:ATmega48/88/168的PB5是SPI时钟输出,接74HC595/74HC165的移位时钟输入端;PB4是SPI的MISO数据输人,接74HC165的数据输出;PB3是SPI的MOSI数据输出,接74HC595的串行数据输入端SER;PB2接74HC595/74HC165的锁存时钟输入端。 程序1:本例子是用硬件SPI接口循环发送一个变量到74HC595,并且在数据发送完毕后通过单片机的另外一个IO接口PB2输出一个“锁存”脉冲 ,使74HC595把移位寄存器的数据输出到锁存寄存器,并驱动8个LED输出,实现来回流水的效果。 //本程序在本站的 M8 V2.0 实验板 通过 // CodeWizardAVR V1.25.1 // http://www.avrdiy.com // 程序设计: 啊艺panxiaoyi #include #include #include void main(void) { unsigned char data=1 , sign=1; PORTB=0; DDRB=0; PORTB|=0b00000100; //空闲时PB2=1是为了兼容74HC165,因为锁存时钟=1时74HC165才允许读数据 DDRB|= 0b00101100; //PB口的2/3/5使能输出,其它口不变 SPCR=80; //SPI初始化/高位先输出/空闲时时钟=0,数据=0/4分频/数据在时钟上升沿有效/主机 while(1) { spi(data); //输出data数据,本函数采样查询方式发送,直到数据发送完毕才运行下一条语句 PORTB.2=0; PORTB.2=1; //74HC595移位寄存器的数据在锁存时钟上升沿时传送到锁存寄存器 delay_ms(1000); if(data==1) sign=1; //记录顺序流水 if(data==128) sign=0; //记录倒序流水 if(sign) data<<=1; else data>>=1; //如果顺序流水数据就左移一位,否则数据就右移一位 } }//end   --------------------------------------------------------------------------------   程序2:本程序利用硬件SPI连接74HC165采集8个按键信息,并且由75HC595驱动8个LED把按键的信息显示出来 //本程序在本站的 M8 V2.0 实验板 通过 // CodeWizardAVR V1.25.1 // http://www.avrdiy.com // 程序设计: 啊艺panxiaoyi #include #include #include void main(void) { unsigned char data=0 , x; PORTB=0; DDRB=0; PORTB|=0b00000100; //空闲时PB2=1是为了兼容74HC165,因为锁存时钟=1时74HC165才允许读数据 DDRB|= 0b00101100; //PB口的2/3/5使能输出,其它口不变 SPCR=80; //SPI初始化/高位先输出/空闲时时钟=0,数据=0/4分频/数据在时钟上升沿有效/主机 while(1) { x=spi(data); //输出data数据到74HC595,同时读取74HC165的数据,保存在变量x PORTB.2=0; PORTB.2=1; //刷新74HC595/74HC165的数据 data=x; } }//end -------------------------------------------------------------------------------- 程序3:本程序把读74HC165和写74HC595分别写成一个函数,使用更方便 #include #include <595-165.h> #include void main(void) { spiinit(); //spi初始化 while(1) { unsigned char data,i; data=read165(); //通过硬件SPI读取74HC165的数据 if(data==254) i+=1; write595(i); //通过硬件SPI把数据写入74HC595 delay_ms(100); } }//end 下面是头文件"595-165.h"的内容 //定义一个全局变量来记忆最后一次写入74HC595的数据 //目的是读74HC165时保持74HC595的数据不发生改变 //变量名复杂一点目的是避免和其它变量混淆 unsigned char DATA_74HC595_74HC165; void spiinit(void) //spi初始化 { PORTB&=0b11000011; DDRB|= 0b00101100; SPCR=80; } void write595(unsigned char LED_DATA) //写数据到74HC595函数 { SPDR=LED_DATA; //开始发送数据 while((SPSR>>7)==0); //等待发送接收结束 DATA_74HC595_74HC165=LED_DATA; //记忆最后一次发送的数据 LED_DATA=SPDR; //读,是为了清零中断标志 PORTB&=251; PORTB|=4; //PB2输出一个负脉冲,刷新74HC595的数据 } unsigned char read165(void) //读74HC165函数 { PORTB&=251; PORTB|=4; //PB2输出一个负脉冲,刷新74HC165的数据 SPDR=DATA_74HC595_74HC165; //载入74HC595最后一次的数据,目的是读取74HC165 while((SPSR>>7)==0); //等待发送接收结束 return SPDR; //返回值是SPI接收到74HC165的数据

返回列表

最新关注 关闭


关于论坛注册,最新修改,请网友们注意

由于最近大量垃圾信息出现在我们的论坛,为了营造一个良好的氛围,目前论坛只开发邀请注册,你可以点击以下链接自动邀请注册(如果有人使用了点击下一个试一试) ...


查看
珩源工控论坛热诚欢迎您联系我们进行合作!

Powered by Discuz! 7.2© 2001-2009 Comsenz Inc.

珩源工控论坛 ( 桂ICP备19004328号) |论坛统计|WAP| 客服中心-www.hymcu.com
  

GMT+8, 2024-11-1 12:24, Processed in 1.058691 second(s), 5 queries, Gzip enabled.