📄 lcd12864.c
字号:
#include "LCD12864.h"
#include "SPI1.h"
#define SERIAL_WDATA 0XFA /* 写入到资料寄存器DR */
#define SERIAL_WCMD 0XF8 /* 写入到指令寄存器IR */
#define SERIAL_RBF 0XFC /* 读忙标志BF和AC */
#define SERIAL_RDATA 0XFE /* 读资料寄存器DR */
void _delay_us(unsigned int x)
{
unsigned int t = 50;
while(x--)
{
t = 50; // 随便写的一个值,时间可能不准确
while(t--)
asm("nop");
}
}
void _delay_ms(unsigned int x)
{
while(x--)
_delay_us(1000);
}
void LCDSerial_Send(unsigned char x)
{
SPI1_ReadWrite_Byte(x);
}
void LCD12864_Busy_Wait(void)
{
_delay_ms(1);
}
void LCD12864_WriteCMD(unsigned char cmd)
{
LCD12864_Busy_Wait();
LCDSerial_Send(SERIAL_WCMD); // 写入到IR
LCDSerial_Send(cmd&0xf0);
LCDSerial_Send(cmd<<4);
}
void LCD12864_WriteData(unsigned char wdata)
{
LCD12864_Busy_Wait();
LCDSerial_Send(SERIAL_WDATA); // 写入到资料寄存器
LCDSerial_Send(wdata&0xf0);
LCDSerial_Send(wdata<<4);
}
void LCD12864_Init(void)
{
//LCD_PORT |= (1<<LCD_SID)|(1<<LCD_SCLK);
//LCD_DDR |= (1<<LCD_SID)|(1<<LCD_SCLK);
_delay_ms(100);
LCD12864_WriteCMD(0x30); // 设定基本指令集
_delay_ms(1);
LCD12864_WriteCMD(0x30);
_delay_us(40);
LCD12864_WriteCMD(0x0c); // 显示开
_delay_us(100);
LCD12864_WriteCMD(0x06); // AC+1
_delay_us(100);
LCD12864_WriteCMD(0x80); // 设定起始地址
_delay_us(100);
LCD12864_WriteCMD(0x01); // 清屏
_delay_ms(40);
}
/* x: 第几列 y: 第几行 */
void LCD12864_Set_XY(unsigned char x, unsigned char y)
{
unsigned char address;
switch(y){
case 0:
address = 0x80 + x;
break;
case 1:
address = 0x90 + x;
break;
case 2:
address = 0x88 + x;
break;
case 3:
address = 0x98 + x;
break;
default:
address = 0x80 + x;
break;
}
LCD12864_WriteCMD(address);
return;
}
void LCD12864_PutString(unsigned char x, unsigned char y, char *str)
{
LCD12864_Set_XY(x,y);
while(*str){
LCD12864_WriteData(*str++);
_delay_ms(1);
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -