📄 so12864.c
字号:
#include "so12864.h"
/*************************************************/
//Init LCD
/*************************************************/
void Init_LCD(void)
{
//Make the CS AO RST pin as output
DDR_SPI_CTL = (1 << LCD_AO_TRIS) | (1 << LCD_RST_TRIS) | (1 << LCD_CS_TRIS);
DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK); //设置MOSI,SCK,SS 为OUTPUT,其它为INPUT
SPCR = (1<<SPE)|(1<<MSTR); //SPI使能,主机方式,设置SCK为fosc/4,上升沿,MSB First
/* 一定要先重启LCD,再设置SPI,否则通讯不成功 */
LCD_RST_IO |= BIT(LCD_RST_PIN);
LCD_CS_IO |= BIT(LCD_CS_PIN);
LCD_AO_IO |= BIT(LCD_AO_PIN);
LCD_CS_IO &= ~BIT(LCD_CS_PIN); //select 12864
LCD_RST_IO &= ~BIT(LCD_RST_PIN); //reset
nop();
nop();
nop();
LCD_RST_IO |= BIT(LCD_RST_PIN);
//write command
Write_LCDCOM(DISPLAY_ON); //ON DISPLAY
Write_LCDCOM(START_LINE_0); //STAR DISPLAY
Write_LCDCOM(ADC_NORMAL); //ADC NORMAL
Write_LCDCOM(DISPLAY_NORMAL); //Display normal
Write_LCDCOM(ALL_POINT_NORMAL); //CLEAR
Write_LCDCOM(BIAS_1_9); //1/9BIAS
Write_LCDCOM(OUTPUT_MPDE_REVERSE); //COMMON OUTPUT DIRECTION
Write_LCDCOM(POWER); //POWER CONTROL
Write_LCDCOM(RESISTOR_RATION); //RESISTER RATIO
Write_LCDCOM(HIBYTE(ELECTRONIC_VOLUME));//VOLUM MODE SET
Write_LCDCOM(LOBYTE(ELECTRONIC_VOLUME));
Clear_LCD();
}
/*************************************************/
//Write command
/*************************************************/
void Write_LCDCOM(BYTE command)
{
LCD_AO_IO &= ~BIT(LCD_AO_PIN);
LCD_CS_IO &= ~BIT(LCD_CS_PIN);
SPDR = (unsigned char)command;
while(!(SPSR&(1<<SPIF))); //Wait for transmission finish
}
/*************************************************/
//Write data
/*************************************************/
void Write_LCDDATA(BYTE data)
{
LCD_AO_IO |= BIT(LCD_AO_PIN);
LCD_CS_IO &= ~BIT(LCD_CS_PIN);
SPDR = (unsigned char)data;
while(!(SPSR&(1<<SPIF))); //Wait for transmission finish
}
/*************************************************/
//Clear LCD
/*************************************************/
void Clear_LCD()
{
unsigned char seg;
unsigned char page;
for(page = PAGE_0; page < PAGE_8; page++) //写页地址共8 页0xb0----0xb8
{
Write_LCDCOM(page);
Write_LCDCOM(0x10); //列地址,高低字节两次写入,从第0列开始
Write_LCDCOM(0x00);
for(seg = 0; seg < 128; seg++) //写128列
{
Write_LCDDATA(0x00);
}
}
}
/*************************************************/
//Display English words
/*************************************************/
void DispEN_LCD(BYTE page, WORD column, BYTE *ptr)
{
unsigned char seg;
Write_LCDCOM(page);
Write_LCDCOM(HIBYTE(column)); //列地址,高低字节两次写入
Write_LCDCOM(LOBYTE(column));
for(seg = 0; seg < 8; seg++) //写8列
{
Write_LCDDATA((BYTE)(*ptr++));
}
}
/*************************************************/
//Display Chinese words
/*************************************************/
void DispCN_LCD(BYTE page, WORD column, BYTE *ptr)
{
unsigned char seg;
unsigned char offset;
for(offset = 0; offset < 2; offset++)
{
Write_LCDCOM((BYTE)(page + offset));
Write_LCDCOM(HIBYTE(column)); //列地址,高低字节两次写入
Write_LCDCOM(LOBYTE(column));
for(seg = 0; seg < 16; seg++) //写16列
{
Write_LCDDATA((BYTE)(*ptr++));
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -