Attiny2313驱动4线LCD0802-Arduino中文社区 - Powered by Discuz! Archiver

希岩 发表于 2020-8-19 20:28

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)
    {       

   
    }

}






t3486784401 发表于 2020-8-20 00:18

用的 ICCAVR 编译器吧,好奇怎么用 Arduino IDE 来编译 2313

希岩 发表于 2020-8-20 21:52

t3486784401 发表于 2020-8-20 00:18
用的 ICCAVR 编译器吧,好奇怎么用 Arduino IDE 来编译 2313

一样的,那些寄存器名字一样。主要需要添加attiny2313的支持库。百度上有

希岩 发表于 2020-8-20 22:03

t3486784401 发表于 2020-8-20 00:18
用的 ICCAVR 编译器吧,好奇怎么用 Arduino IDE 来编译 2313

查了,关于arduino 支持attiny2313的资料较少。

t3486784401 发表于 2020-8-21 01:37

本帖最后由 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

希岩 发表于 2020-9-18 16:27

t3486784401 发表于 2020-8-21 01:37
Arduino IDE 是 GCC 和 Arduino硬件抽象层 的合体。

GCC 编译 AVR 没啥难度,都是 C 标准库,和 ICC 一样 ...

所以有时候直接抄arduino的驱动、函数库,用起来那叫一个爽:lol
页: [1]
查看完整版本: Attiny2313驱动4线LCD0802