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

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2128|回复: 5

Attiny2313驱动4线LCD0802

[复制链接]
发表于 2020-8-19 20:28 | 显示全部楼层 |阅读模式
  attiny2313和lcd0802连接如下:
LCD0802 ->ATTINY2313

   VSS    GND
   VDD    VCC(5V)
   VO     电位器,注意调低!
   RS     PD6
   RW     PB0
   E      PA0
   D4-D7  PD2-PD5


  1. #ifndef _headfile_h
  2. #define _headfile_h

  3. #include<iot2313v.h>
  4. #include<AVRdef.h>

  5. typedef  unsigned char uint8_t;
  6. typedef  unsigned int  uint16_t;



  7. void display_string(uint8_t x, uint8_t y,uint8_t ch[]);
  8. void display_char(uint8_t X, uint8_t Y,uint8_t data);
  9. void delay(uint16_t time);  //微秒延时
  10. void LCD0802_Port(void);
  11. void Init_LCD(void);
  12. #endif
复制代码


  1. #include "main.h"
  2. /******************LCD0802液晶常量及操作******************/

  3. #define LCDa_RS_H()        PORTD |=0x40        //定义三个控制引脚
  4. #define LCDa_RS_L()        PORTD &=0xBF       
  5. #define LCDa_RW_H()        PORTB |=0x01
  6. #define LCDa_RW_L()        PORTB &=0xFE
  7. #define LCDa_E_H()        PORTA |=0x01
  8. #define LCDa_E_L()        PORTA &=0xFE

  9. #define LCDa_L1                0x80        //第一行的地址:0x80+addr ,addr为列数
  10. #define LCDa_L2                0xC0        //第二行的地址:0x80+0x40+addr

  11. #define LCDa_CGRAM_ADDR        0x40        //CGRAM的开始地址
  12. #define LCDa_CGMAX             64            //CGRAM存储的最大字节数

  13. #define LCDa_SET_RS                    LCDa_RS_H()        //三个控制管脚的控制操作
  14. #define LCDa_SET_RW                 LCDa_RW_H()
  15. #define LCDa_SET_E                  LCDa_E_H()
  16. #define LCDa_CLR_RS                 LCDa_RS_L()
  17. #define LCDa_CLR_RW                 LCDa_RW_L()
  18. #define LCDa_CLR_E                  LCDa_E_L()

  19. #define LCDa_DO(X)                {PORTD &=0b11000011;PORTD |=(X<<2);} //输出数据总线端口定义


  20. #define LCDa_FUNCTION        0x28    // 液晶模式为8位,2行,5*7字符  4位显示


  21. #define LCDa_CLS        0x01                // 清屏
  22. #define LCDa_HOME        0x02                // 地址返回原点,不改变DDRAM内容
  23. #define LCDa_ENTRY         0x06                // 设定输入模式,光标加,屏幕不移动
  24. #define LCDa_C2L        0x10                // 光标左移
  25. #define LCDa_C2R        0x14                // 光标右移
  26. #define LCDa_D2L        0x18                // 屏幕左移
  27. #define LCDa_D2R        0x1C                // 屏幕右移

  28. #define LCDa_ON                0x0C                // 打开显示
  29. #define LCDa_OFF        0x08                // 关闭显示
  30. #define LCDa_CURON        0x0E                // 显示光标
  31. #define LCDa_CURFLA        0x0F                // 打开光标闪烁

  32. /*******************************************
  33. 函数名称: LCD1602_portini
  34. 功    能: 初始化1602液晶用到的IO口
  35. 参    数: 无
  36. 返回值  : 无
  37. ********************************************/
  38. void LCD0802_Port(void)
  39. {
  40.         DDRD |=~0b11000011;//配置数据管脚为输出
  41.         DDRD |=0x40;
  42.         DDRB |=0x01;
  43.         DDRA |=0x01;   
  44. }
  45. /// --------------------------------------------------------------------------------------
  46. // 读忙  
  47. void Read_Busy(void)
  48. {       

  49.     LCDa_DO(~0b11000011);
  50.     DDRD &=0b11000011;   //输入
  51.     LCDa_CLR_RS;
  52.     LCDa_CLR_RW;
  53.     LCDa_SET_E;
  54.     while(PIND&(~0b11000011));//当0802内部操作完成后,才可以接受下一条指令
  55.     LCDa_CLR_E;
  56. }
  57. //  写指令
  58. void Write_cmd(uint8_t com)
  59. {
  60.   //Read_Busy();
  61.   delay(1);
  62.   LCDa_CLR_RS;                              
  63.   LCDa_CLR_RW;                            //写操作操作
  64.   LCDa_SET_E;
  65.   LCDa_DO((com>>4));                //写入数据高四位
  66.   asm("nop");
  67.   LCDa_CLR_E;
  68.   asm("nop");
  69.   LCDa_SET_E;
  70.   LCDa_DO((com&0x0F));                //写入数据低四位
  71.   asm("nop");
  72.   LCDa_CLR_E;

  73. }

  74. //写命令:输入RS=0,RW=0,E=高脉冲。输出:无。
  75. //写数据:输入RS=1,RW=0,E=高脉冲。输出:无。

  76. // --------------------------------------------------------------------------------------
  77. //  写数据
  78. void Write_dat(uint8_t dat)
  79. {
  80.   //Read_Busy();
  81.   delay(1);
  82.   LCDa_SET_RS;                              
  83.   LCDa_CLR_RW;                            //写操作操作
  84.   LCDa_SET_E;
  85.   LCDa_DO((dat>>4));                //写入数据高四位
  86.   asm("nop");
  87.   LCDa_CLR_E;
  88.   asm("nop");
  89.   LCDa_SET_E;
  90.   LCDa_DO((dat&0x0F));                //写入数据低四位
  91.   asm("nop");
  92.   LCDa_CLR_E;
  93. }

  94. // --------------------------------------------------------------------------------------
  95. //  初始化液晶屏   
  96. void Init_LCD(void)
  97. {
  98.   delay(100);
  99.   // RS = 1;    //RS  0:写指令,1:写数据   //0:输入(输出驱动被禁止),读数返回管脚值;1:端口位-输出驱动使能, PTAD读数返回PTADn内容。
  100.   // RW = 1;    //R/W 0:写操作,1:读操作
  101.   Write_cmd(0x28); //写命令 4线、双行显示、5*7点阵  
  102.   delay(100);
  103.   Write_cmd(0x28); //写命令 4线、双行显示、5*7点阵  
  104.   delay(100);
  105.   Write_cmd(0x28); //写命令 4线、双行显示、5*7点阵  
  106.   
  107.   Write_cmd(LCDa_FUNCTION); //写命令 4线、双行显示、5*7点阵  
  108.   delay(100);
  109.   Write_cmd(LCDa_CLS);      //写命令 清屏
  110.   delay(20);
  111.   Write_cmd(LCDa_HOME);     //返回原点
  112.   delay(20);
  113.   Write_cmd(LCDa_ENTRY);    //写命令 开显示,光标不闪烁
  114.   delay(20);
  115.   Write_cmd(LCDa_ON);       //写命令 8线、双行显示、5*7点阵
  116.   delay(20);
  117. }
  118. // --------------------------------------------------------------------------------------
  119. /******************************************************************************
  120. X 列,  0~7
  121. Y 行,  1,2
  122. data ASCII 码字符
  123. *******************************************************************************/
  124. void display_char(uint8_t X, uint8_t Y,uint8_t data)
  125. {
  126.     if(Y==1)  X+=LCDa_L1;         //第一行
  127.     else      X+=LCDa_L2;         //第二行
  128.     Write_cmd(X);
  129.     delay(5);
  130.     Write_dat(data);
  131. }
  132. //--------------------------------------------------------------------------------
  133. //显示字符串
  134. void display_string(uint8_t x, uint8_t y,uint8_t ch[])
  135. {
  136.   uint8_t i=0;                                      //x为起始位
  137.   while (ch[i])
  138.   {
  139.     display_char(x+i,y,ch[i]);
  140.     i++;
  141.   }
  142. }
  143. // ----------------------------------------------------------------------------
复制代码
APP 层如下
  1. /**
  2. * @file vfd_8md06inkm.c
  3. * @author mangolu (mangolu81@gmail.com)
  4. * @brief HDC1080
  5. * @version 1.0.0
  6. * @date 2019-10-27
  7. *
  8. * @copyright Copyright (c) 2019 mangolu All righits reserved
  9. *
  10. */

  11. //注意将option中target选为attint2313
  12. /*
  13. Hardware connections for Arduino Uno:
  14. VDD to 5V
  15. SCL to PB7
  16. SDA to PB5
  17. GND to common ground
  18. */

  19. /***********************************
  20.    LCD0802 引脚定义:
  21.    VSS    GND
  22.    VDD    VCC(5V)
  23.    VO     电位器,注意调低!
  24.    RS     PD6
  25.    RW     PB0
  26.    E      PA0
  27.    D4-D7  PD2-PD5

  28.    
  29. ***********************************/

  30. #include "main.h"



  31. #pragma interrupt_handler TIMER1_CMP:5    //定时器声明,计数器比较器TIN1A

  32. uint16_t seconds;

  33. //------------------------------------------------------------------------
  34. void TIMER1_CMP(void)
  35. {
  36. //TIFR  |= (1<<OCF1A);
  37. seconds++;
  38. }
  39. //初始化定时器------------------------------------------------------------
  40. void Init_PWM(void)
  41. {
  42.   TCCR0A=0b10000011;                   //普通方式
  43.   TCCR0B=0b00000001;                           //预分频1,计时6.67us,page68
  44.   OCR0A=180;
  45. }
  46. //************************************************************
  47. //初始化定时器1
  48. //比较匹配时清零OC2A,CTC
  49. void Init_Timer1(void)
  50. {
  51.   TCCR1A  =0;
  52.   TCCR1B  =0;
  53.   TCCR1B |=(1<<CS12)|(1<<WGM12);  //CTC 256分频

  54.   OCR1A   = 31250;               //1s中断一次
  55.   TIMSK  |= (1<<OCIE1A);
  56.   TIFR   |= (1<<OCF1A);
  57.   TCNT1   = 0;
  58. }
  59. //初始化控制器------------------------------------------------------------------
  60. //初始化时钟-------------------------------------------------------------------
  61. void Init_Clock(void)
  62. {
  63. //OSCCAL = 0x67;                 //时钟矫正至8Mhz
  64. //CLKPR  = 0x80;                 //时钟分频器使能CLKPR_CLKPCE  
  65. //CLKPR  = 0x00;                 //系统时钟8分频,p24(0>1;1>2;...8>256)
  66. }
  67. //初始化时钟--------------------------------------------------------------------
  68. //微秒延时
  69. void delay(uint16_t time)
  70. {
  71. uint16_t i,j;
  72. for(i=0;i<2000;i++)
  73. {
  74.    for(j=0;j<time;j++)
  75.    ;
  76. }
  77. }

  78. //------------------------------------------------------------------------
  79. void Init_devices(void)
  80. {
  81.     //Init_Clock();

  82.         LCD0802_Port();
  83. }

  84. // -----------------------------------------------------------------------------
  85. void main(void)
  86. {

  87.     CLI();                       //清中断
  88.     Init_devices();              //初始化设备
  89.     delay(10);
  90.     Init_LCD();
  91.   
  92.     //Init_Timer1();
  93.     //SEI();                       //中断使能
  94.     delay(10);
  95.     display_string(0,1,"Welcome!");   //第一行
  96.     display_string(0,2,"KEA128.");    //第二行
  97.     delay(10);
  98.     while(1)
  99.     {       
  100.   
  101.    
  102.     }

  103. }
复制代码







发表于 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的资料较少。
发表于 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的驱动、函数库,用起来那叫一个爽
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 09:23 , Processed in 0.078726 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表