Arduino 2线串行 通信 驱动 LCD 12864

 上效果图片

 

源代码 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:
    


}





接口定义

时序介绍
指令表

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值