Attiny2313驱动4线LCD0802
attiny2313和lcd0802连接如下:LCD0802 ->ATTINY2313
VSS GND
VDD VCC(5V)
VO 电位器,注意调低!
RS PD6
RW PB0
E PA0
D4-D7PD2-PD5
#ifndef _headfile_h
#define _headfile_h
#include<iot2313v.h>
#include<AVRdef.h>
typedefunsigned char uint8_t;
typedefunsigned intuint16_t;
void display_string(uint8_t x, uint8_t y,uint8_t ch[]);
void display_char(uint8_t X, uint8_t Y,uint8_t data);
void delay(uint16_t time);//微秒延时
void LCD0802_Port(void);
void Init_LCD(void);
#endif
#include "main.h"
/******************LCD0802液晶常量及操作******************/
#define LCDa_RS_H() PORTD |=0x40 //定义三个控制引脚
#define LCDa_RS_L() PORTD &=0xBF
#define LCDa_RW_H() PORTB |=0x01
#define LCDa_RW_L() PORTB &=0xFE
#define LCDa_E_H() PORTA |=0x01
#define LCDa_E_L() PORTA &=0xFE
#define LCDa_L1 0x80 //第一行的地址:0x80+addr ,addr为列数
#define LCDa_L2 0xC0 //第二行的地址:0x80+0x40+addr
#define LCDa_CGRAM_ADDR 0x40 //CGRAM的开始地址
#define LCDa_CGMAX 64 //CGRAM存储的最大字节数
#define LCDa_SET_RS LCDa_RS_H() //三个控制管脚的控制操作
#define LCDa_SET_RW LCDa_RW_H()
#define LCDa_SET_E LCDa_E_H()
#define LCDa_CLR_RS LCDa_RS_L()
#define LCDa_CLR_RW LCDa_RW_L()
#define LCDa_CLR_E LCDa_E_L()
#define LCDa_DO(X) {PORTD &=0b11000011;PORTD |=(X<<2);} //输出数据总线端口定义
#define LCDa_FUNCTION 0x28 // 液晶模式为8位,2行,5*7字符4位显示
#define LCDa_CLS 0x01 // 清屏
#define LCDa_HOME 0x02 // 地址返回原点,不改变DDRAM内容
#define LCDa_ENTRY 0x06 // 设定输入模式,光标加,屏幕不移动
#define LCDa_C2L 0x10 // 光标左移
#define LCDa_C2R 0x14 // 光标右移
#define LCDa_D2L 0x18 // 屏幕左移
#define LCDa_D2R 0x1C // 屏幕右移
#define LCDa_ON 0x0C // 打开显示
#define LCDa_OFF 0x08 // 关闭显示
#define LCDa_CURON 0x0E // 显示光标
#define LCDa_CURFLA 0x0F // 打开光标闪烁
/*******************************************
函数名称: LCD1602_portini
功 能: 初始化1602液晶用到的IO口
参 数: 无
返回值: 无
********************************************/
void LCD0802_Port(void)
{
DDRD |=~0b11000011;//配置数据管脚为输出
DDRD |=0x40;
DDRB |=0x01;
DDRA |=0x01;
}
/// --------------------------------------------------------------------------------------
// 读忙
void Read_Busy(void)
{
LCDa_DO(~0b11000011);
DDRD &=0b11000011; //输入
LCDa_CLR_RS;
LCDa_CLR_RW;
LCDa_SET_E;
while(PIND&(~0b11000011));//当0802内部操作完成后,才可以接受下一条指令
LCDa_CLR_E;
}
//写指令
void Write_cmd(uint8_t com)
{
//Read_Busy();
delay(1);
LCDa_CLR_RS;
LCDa_CLR_RW; //写操作操作
LCDa_SET_E;
LCDa_DO((com>>4)); //写入数据高四位
asm("nop");
LCDa_CLR_E;
asm("nop");
LCDa_SET_E;
LCDa_DO((com&0x0F)); //写入数据低四位
asm("nop");
LCDa_CLR_E;
}
//写命令:输入RS=0,RW=0,E=高脉冲。输出:无。
//写数据:输入RS=1,RW=0,E=高脉冲。输出:无。
// --------------------------------------------------------------------------------------
//写数据
void Write_dat(uint8_t dat)
{
//Read_Busy();
delay(1);
LCDa_SET_RS;
LCDa_CLR_RW; //写操作操作
LCDa_SET_E;
LCDa_DO((dat>>4)); //写入数据高四位
asm("nop");
LCDa_CLR_E;
asm("nop");
LCDa_SET_E;
LCDa_DO((dat&0x0F)); //写入数据低四位
asm("nop");
LCDa_CLR_E;
}
// --------------------------------------------------------------------------------------
//初始化液晶屏
void Init_LCD(void)
{
delay(100);
// RS = 1; //RS0:写指令,1:写数据 //0:输入(输出驱动被禁止),读数返回管脚值;1:端口位-输出驱动使能, PTAD读数返回PTADn内容。
// RW = 1; //R/W 0:写操作,1:读操作
Write_cmd(0x28); //写命令 4线、双行显示、5*7点阵
delay(100);
Write_cmd(0x28); //写命令 4线、双行显示、5*7点阵
delay(100);
Write_cmd(0x28); //写命令 4线、双行显示、5*7点阵
Write_cmd(LCDa_FUNCTION); //写命令 4线、双行显示、5*7点阵
delay(100);
Write_cmd(LCDa_CLS); //写命令 清屏
delay(20);
Write_cmd(LCDa_HOME); //返回原点
delay(20);
Write_cmd(LCDa_ENTRY); //写命令 开显示,光标不闪烁
delay(20);
Write_cmd(LCDa_ON); //写命令 8线、双行显示、5*7点阵
delay(20);
}
// --------------------------------------------------------------------------------------
/******************************************************************************
X 列,0~7
Y 行,1,2
data ASCII 码字符
*******************************************************************************/
void display_char(uint8_t X, uint8_t Y,uint8_t data)
{
if(Y==1)X+=LCDa_L1; //第一行
else X+=LCDa_L2; //第二行
Write_cmd(X);
delay(5);
Write_dat(data);
}
//--------------------------------------------------------------------------------
//显示字符串
void display_string(uint8_t x, uint8_t y,uint8_t ch[])
{
uint8_t i=0; //x为起始位
while (ch)
{
display_char(x+i,y,ch);
i++;
}
}
// ----------------------------------------------------------------------------APP 层如下
/**
* @file vfd_8md06inkm.c
* @author mangolu (mangolu81@gmail.com)
* @brief HDC1080
* @version 1.0.0
* @date 2019-10-27
*
* @copyright Copyright (c) 2019 mangolu All righits reserved
*
*/
//注意将option中target选为attint2313
/*
Hardware connections for Arduino Uno:
VDD to 5V
SCL to PB7
SDA to PB5
GND to common ground
*/
/***********************************
LCD0802 引脚定义:
VSS GND
VDD VCC(5V)
VO 电位器,注意调低!
RS PD6
RW PB0
E PA0
D4-D7PD2-PD5
***********************************/
#include "main.h"
#pragma interrupt_handler TIMER1_CMP:5 //定时器声明,计数器比较器TIN1A
uint16_t seconds;
//------------------------------------------------------------------------
void TIMER1_CMP(void)
{
//TIFR|= (1<<OCF1A);
seconds++;
}
//初始化定时器------------------------------------------------------------
void Init_PWM(void)
{
TCCR0A=0b10000011; //普通方式
TCCR0B=0b00000001; //预分频1,计时6.67us,page68
OCR0A=180;
}
//************************************************************
//初始化定时器1
//比较匹配时清零OC2A,CTC
void Init_Timer1(void)
{
TCCR1A=0;
TCCR1B=0;
TCCR1B |=(1<<CS12)|(1<<WGM12);//CTC 256分频
OCR1A = 31250; //1s中断一次
TIMSK|= (1<<OCIE1A);
TIFR |= (1<<OCF1A);
TCNT1 = 0;
}
//初始化控制器------------------------------------------------------------------
//初始化时钟-------------------------------------------------------------------
void Init_Clock(void)
{
//OSCCAL = 0x67; //时钟矫正至8Mhz
//CLKPR= 0x80; //时钟分频器使能CLKPR_CLKPCE
//CLKPR= 0x00; //系统时钟8分频,p24(0>1;1>2;...8>256)
}
//初始化时钟--------------------------------------------------------------------
//微秒延时
void delay(uint16_t time)
{
uint16_t i,j;
for(i=0;i<2000;i++)
{
for(j=0;j<time;j++)
;
}
}
//------------------------------------------------------------------------
void Init_devices(void)
{
//Init_Clock();
LCD0802_Port();
}
// -----------------------------------------------------------------------------
void main(void)
{
CLI(); //清中断
Init_devices(); //初始化设备
delay(10);
Init_LCD();
//Init_Timer1();
//SEI(); //中断使能
delay(10);
display_string(0,1,"Welcome!"); //第一行
display_string(0,2,"KEA128."); //第二行
delay(10);
while(1)
{
}
}
用的 ICCAVR 编译器吧,好奇怎么用 Arduino IDE 来编译 2313 t3486784401 发表于 2020-8-20 00:18
用的 ICCAVR 编译器吧,好奇怎么用 Arduino IDE 来编译 2313
一样的,那些寄存器名字一样。主要需要添加attiny2313的支持库。百度上有
t3486784401 发表于 2020-8-20 00:18
用的 ICCAVR 编译器吧,好奇怎么用 Arduino IDE 来编译 2313
查了,关于arduino 支持attiny2313的资料较少。 本帖最后由 t3486784401 于 2020-8-21 01:47 编辑
希岩 发表于 2020-8-20 21:52
一样的,那些寄存器名字一样。主要需要添加attiny2313的支持库。百度上有
...
Arduino IDE 是 GCC 和 Arduino硬件抽象层 的合体。
GCC 编译 AVR 没啥难度,都是 C 标准库,和 ICC 一样;
Arduino抽象层 才是最麻烦的地方,也是 Arduino 的精髓。
首先是 IO 逻辑映射,这个并不难规定好逻辑号就行;
之后是核心的计时移植(millis, micros),需要占用定时器产生时间基准;
然后是周边的串口 Serial、模拟输入ADC、模拟输出PWM移植。
目测这个 BSP 包可以用:https://github.com/SpenceKonde/ATTinyCore
t3486784401 发表于 2020-8-21 01:37
Arduino IDE 是 GCC 和 Arduino硬件抽象层 的合体。
GCC 编译 AVR 没啥难度,都是 C 标准库,和 ICC 一样 ...
所以有时候直接抄arduino的驱动、函数库,用起来那叫一个爽:lol
页:
[1]