attiny2313和lcd0802连接如下:
LCD0802 ->ATTINY2313
VSS GND
VDD VCC(5V)
VO 电位器,注意调低!
RS PD6
RW PB0
E PA0
D4-D7 PD2-PD5
- #ifndef _headfile_h
- #define _headfile_h
- #include<iot2313v.h>
- #include<AVRdef.h>
- typedef unsigned char uint8_t;
- typedef unsigned int uint16_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; //RS 0:写指令,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[i])
- {
- display_char(x+i,y,ch[i]);
- i++;
- }
- }
- // ----------------------------------------------------------------------------
复制代码 APP 层如下
|