上效果图片
源代码 Arduino 328p
/*****************************************************************
* 2线 LCD 12864 (屏幕主控芯片 ST7920)
******************************************************************/
/***********************端口/引脚定义区域************************/
#define LCDCS 2//LCD12864片选端口(原RS)/片选可直接VCC
#define LCDDIO 3//LCD12864串行数据输入/输出(原RW)
#define LCDCLK 4//LCD12864串行时钟(原EN)
#define LCDPSB 5//LCD12864串/并行数据选择端口/串行可直接接地
/*************************函数声明区域***************************/
/****************************************************************/
//初始化液晶模块函数LCD12864_init(),无形参和返回值
/****************************************************************/
void LCD12864_init()
{
//LCDPSB=0;//选择串行模式将PSB置“0”或直接接地
digitalWrite(LCDPSB, LOW);
//LCDCS=1;//片选12864
digitalWrite(LCDCS, HIGH);
delay(10);//延时等待稳定
LCD12864_Write(0x30,0);//选择基本指令集
LCD12864_Write(0x0C,0);//开显示,无游标,不反白
LCD12864_Write(0x01,0);//清除显示屏幕,把DDRAM位址计数器调整为00H
}
/****************************************************************/
//逐位写入串行数据函数LCD12864_SBYTE(),有形参byte,无返回值
/****************************************************************/
void LCD12864_SBYTE(unsigned char byte)
{
u8 i;
for(i=0;i<8;i++)//一个字节由8位组成故而循环8次写入
{
//LCDCLK = 0;//拉低时钟线
digitalWrite(LCDCLK, LOW);
if((byte<<i)&0x80)//取位操作
//LCDDIO=1;//写入数据‘1’
digitalWrite(LCDDIO, HIGH);
else
// LCDDIO=0;//写入数据'0'
digitalWrite(LCDDIO, LOW);
//LCDCLK = 1;//拉高时钟线
digitalWrite(LCDCLK, HIGH);
}
}
/****************************************************************/
//命令或数据写入函数LCD12864_Write(),有形参cmdordata和writetype
//cmdordata是欲写入数据,writetype是写入类型,无返回值
/****************************************************************/
void LCD12864_Write(unsigned char cmdordata,int writetype)
{
if(writetype==0)//判断写入类型
LCD12864_SBYTE(0xF8); //“1111 1000”表示写入命令信息
else
LCD12864_SBYTE(0xFA);//“1111 1010”表示写入数据信息
LCD12864_SBYTE(0xF0&cmdordata);//取高四位传送
LCD12864_SBYTE(0xF0&(cmdordata<<4));//取低四位传送
}
/****************************************************************/
//字符串显示函数Display12864(),有形参row,col,*string,row表示行
//col表示列,字符指针string指向字符串数据,无返回值
/****************************************************************/
void Display12864(unsigned char row,unsigned char col,unsigned char *string)
{
switch(row)//行变量判断
{
case 1:row=0x80;break;//第一行DDRAM首地址为0x80
case 2:row=0x90;break;//第二行DDRAM首地址为0x90
case 3:row=0x88;break;//第三行DDRAM首地址为0x88
case 4:row=0x98;break;//第四行DDRAM首地址为0x98
default:break;
}
LCD12864_Write(row+col,0);//写入行列地址
while(*string!='\0')//输出字符串直到结束标志‘|0’
{
LCD12864_Write(*string,1);//写入字符数据
string++;//指针后移
}
}
/****************************************************************/
void LCD12864_init();//12864初始化函数声明
void LCD12864_SBYTE(unsigned char byte);//逐位写入串行数据函数声明
void LCD12864_Write(unsigned char cmdordata,unsigned char writetype);//写入液晶模组命令或数据函数声明
void Display12864(unsigned char row, unsigned char col,unsigned char *string);//显示字符串函数声明
/**************************主函数区域****************************/
void setup() {
// put your setup code here, to run once:
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
LCD12864_init(); //初始化12864液晶
Display12864(1,0,"===Arduion===");//显示第一行数据
Display12864(2,0,"=======OK=======");//显示第二行数据
Display12864(3,0,"12864ABCD");//显示第三行数据
Display12864(4,0,"20240912");//显示第四行数据
}
void loop() {
// put your main code here, to run repeatedly:
}