登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

M8/48/88/168实验板 AVRGCC + AVR Studio

作者:panxiaoyi 栏目:单片机
M8/48/88/168实验板 AVRGCC + AVR Studio
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&#124;= 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&#124;=4;               //PB2输出一个负脉冲,刷新74HC595的数据  
}  
  
unsigned CHAR read165(void)           //读74HC165函数
{
  PORTB&=251; PORTB&#124;=4;               //PB2输出一个负脉冲,刷新74HC165的数据
  SPDR=DATA_74HC595_74HC165;          //载入74HC595最后一次的数据,目的是读取74HC165
  while((SPSR>>7)==0);                //等待发送接收结束
  return SPDR;                        //返回值是SPI接收到74HC165的数据
}



avr单片机diy网

2楼: >>参与讨论
panxiaoyi
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

太好了

4楼: >>参与讨论
stycx
咋不把程序功能说清楚,那样才方便学习,最好上效果图
 
参与讨论
昵称:
讨论内容:
 
 
相关帖子
请教
请问AVR中的.comm是什么意思?
关于邀请广告链接及合作伙伴的公告
如何用WinAVR对MAX1143进行编程????
讨论M162的质量问题,买了3个有2个是坏的.
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号