共3条
1/1 1 跳转至页
,M8,48,88,168,AVRGCC,AVR,Studio 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|= 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的数据
}
答 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: 咋不把程序功能说清楚,那样才方便学习,最好上效果图
芯片: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的数据
}
答 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: 咋不把程序功能说清楚,那样才方便学习,最好上效果图
共3条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |