📄 lcd.c
字号:
/**********************************
标题:12864液晶串行通讯常用子函数
文件名:lcd.c
编译:WinAVR-20080411
硬件环境:
时钟:外部6MHz
***********************************/
#include <avr/io.h>
#include <util/delay.h>
#include <stdint.h>
#include "spi.c"
#define lcd_cs PB0 //LCD片选可选PB0-PB4
void lcd_init(void);
void lcd_wri(uint8_t data_i);//写指令子函数,参数为欲写数据
void lcd_wrd(uint8_t data_d);//写数据子函数,参数为欲写数据
void lcd_write(uint8_t lcd_data1,uint8_t lcd_data2,uint8_t lcd_data3);
void lcd_dis(uint8_t lcd_addr,uint8_t dis_data);//显示子程序,第一参数为显示地址(0x80~0x9f)
//地址会自加连续显示时可指定一范围外地址,第二
//参数为显示数据
void lcd_clear(void);//清屏
uint8_t lcd_tmp1,lcd_tmp2,lcd_tmp3;
void lcd_init(void)
{
_delay_ms(40);//延时40ms
lcd_wri(0x30);//功能设置---8BIT控制界面,基本指令集
_delay_ms(1);
lcd_wri(0x0c);//显示打开,光标关,反白显示关
_delay_ms(1);
lcd_wri(0x01);//清除屏幕显示,将DDRAM的地址计数器归零
_delay_ms(10);
lcd_wri(0x06);//DDRAM的地址计数器(AC)加1
}
void lcd_wri(uint8_t data_i)
{
lcd_tmp1=0xf8; //串行通讯第一字节为1 1 1 1 1 1 Rw Rs 0
//写指令RS=RW=0
lcd_tmp2=data_i&0xf0;//第二字节为D7 D6 D5 D4 0 0 0 0
lcd_tmp3=data_i<<4; //第三字节为D3 D2 D1 D0 0 0 0 0
lcd_write(lcd_tmp1,lcd_tmp2,lcd_tmp3);
}
void lcd_wrd(uint8_t data_d)
{
lcd_tmp1=0xfa; //串行通讯第一字节为1 1 1 1 1 1 Rw Rs 0
//写数据RS=1 RW=0
lcd_tmp2=data_d&0xf0; //第二字节为D7 D6 D5 D4 0 0 0 0
lcd_tmp3=data_d<<4; //第三字节为D3 D2 D1 D0 0 0 0 0
lcd_write(lcd_tmp1,lcd_tmp2,lcd_tmp3);
}
void lcd_clear(void)
{
lcd_wri(1);
}
void lcd_dis(uint8_t lcd_addr,uint8_t dis_data)
{
if((lcd_addr>=0x80)&&(lcd_addr<=0x9f)) lcd_wri(lcd_addr);
lcd_wrd(dis_data);
}
void lcd_write(uint8_t lcd_data1,uint8_t lcd_data2,uint8_t lcd_data3)
{
PORTB|=(1<<lcd_cs); //LCD选通
SPCR|=(1<<SPE); //SPI使能
SPDR=lcd_data1; //SPI传送第一字节
while(!(SPSR&(1<<SPIF)));//等待传送完成
SPDR=lcd_data2; //SPI传送第一字节
while(!(SPSR&(1<<SPIF)));
SPDR=lcd_data3; //SPI传送第一字节
while(!(SPSR&(1<<SPIF)));
SPCR&=(~(1<<SPE)); //SPI关闭
PORTB&=(~(1<<lcd_cs)); //LCD关闭
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -