这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » M8,48,88,168,AVRGCC,AVR,Studio M8/48/88/

共3条 1/1 1 跳转至

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

院士
2006-09-17 18:14:16     打赏
,M8,48,88,168,AVRGCC,AVR,Studio M8/48/88/168实验板 AVRGCC + AVR Studio



关键词: AVRGCC     Studio     实验    

院士
2006-12-22 22:43:00     打赏
2楼
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的数据
}

1: 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);                 //写显示数据也要适当延时
}

2: 好太好了 3: 咋不把程序功能说清楚,那样才方便学习,最好上效果图

专家
2022-08-20 16:52:35     打赏
3楼

感谢分享


共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]