|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
M8/48/88/168实验板 AVRGCC + AVR Studio |
作者:panxiaoyi 栏目:单片机 |
M8实验板 74HC165/74HC595读写函数 AVRGCC + AVR studio 芯片:ATMEGA48 时钟:不限 J2的4个跳线短接 ------------------------------------------------------------------------- 主程序 #include <avr/io.h> #include "595-165.h" #include <avr/delay.h> 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(10); } }//end ----------------------------------------------------------------------------- 595-165.h头文件 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的数据 } avr单片机diy网 |
2楼: | >>参与讨论 |
作者: panxiaoyi 于 2006/9/24 22:10:00 发布:
M8/48/88/168实验板 AVRGCC AVR Studio 1602LCD驱动 主程序 ----------------------------------------------------------------------- #include <avr/io.h> #include "595-165.h" #include "1602lcd.h" void main(void) { spiinit(); //spi初始化 lcd_init(); //LCD初始化 while(1) { lcd_dictate(1); //LCD清屏指令是'1' _delay_ms(250); lcd_data('A'); //显示'A' _delay_ms(250); lcd_gotoxy(8,1); //定位到8列1行 lcd_data(48); //显示'0',0的ASCII值是48 _delay_ms(250); } }//end ------------------------------------------------------------------------ 1602lcd.h头文件 ------------------------------------------------------------------------ //使用“1602lcd.h”文件前请先包含“595-165.h”文件 //由于LCD内部的处理速度比较慢,所以必须加入适当延时 //LCD可以旋转180度连接,程序只需修改SPI数据方向即可 //================================================================== #include <avr/delay.h> void lcd_dictate(unsigned CHAR dictate_data) //写LCD指令的函数 { unsigned CHAR temp_data; temp_data=dictate_data&240; //求高4位, write595(temp_data+8); //写DB7/DB6/DB5/DB4/E=1/RW=0/RS=0/VO=0 write595(temp_data); //E由1变为0,其它数据不变 temp_data=dictate_data<<4; //求低4位...... write595(temp_data+8); write595(temp_data); _delay_ms(2); //写指令后一定要适当延时 } //================================================================== void lcd_init(void) //LCD初始化函数 { _delay_ms(20); write595(56); write595(48); //固定初始化数据 _delay_ms(6); write595(56); write595(48); //固定初始化数据 _delay_ms(2); write595(56); write595(48); //固定初始化数据 _delay_ms(2); write595(40); write595(32); //固定初始化数据 _delay_ms(2); lcd_dictate(40); //数据_4位/2行/5*7象素 lcd_dictate(12); //显示_开/光标_关 } //================================================================== //列/行定位函数,最开头的地址是0列0行 void lcd_gotoxy(unsigned CHAR x, unsigned CHAR y) //列/行定位函数 { unsigned CHAR xy; if(x<=19 && y<=3) //防止输入的数据不正确 { if(y==0) xy=x+128; //第0行的地址是从128开始 if(y==1) xy=x+192; //第1行...... if(y==2) xy=x+148; if(y==3) xy=x+212; lcd_dictate(xy); } } //================================================================= void lcd_data(unsigned CHAR byte_data) //写显示数据函数 { unsigned CHAR temp_data; temp_data=(byte_data&240)+2; //求高4位,同时RS=1 write595(temp_data+8); //写DB7/DB6/DB5/DB4/E=1/RW=0/RS=0/VO=0 write595(temp_data); //E由1变为0,其它数据不变 temp_data=(byte_data<<4)+2; //求低4位...... write595(temp_data+8); write595(temp_data); _delay_ms(1); //写显示数据也要适当延时 } * - 本贴最后修改时间:2006-9-24 22:40:15 修改者:panxiaoyi avr单片机diy网 |
3楼: | >>参与讨论 |
作者: sclarkca 于 2006/10/5 0:18:00 发布:
好 太好了 |
4楼: | >>参与讨论 |
作者: stycx 于 2006/10/5 8:58:00 发布:
咋不把程序功能说清楚,那样才方便学习,最好上效果图 |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |