⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd128_1.c

📁 LCD12864的驱动程序
💻 C
字号:
/**********************************************************
*描述:YM12864R-3带中文字库图形液晶驱动
*版本:V1.2
*控制器:ST7920
*通讯方式:串行方式
*编程:飞扬
**********************************************************/
#include <reg51.h>
//用累加器传送数据比较快
sbit ACC_0 = ACC^0;
sbit ACC_7 = ACC^7;
//引脚定义:
sbit  LCD_CS =P2^5; //LCD片选端
sbit  LCD_SID=P2^4; //LCD串行数据输入/输出端
sbit  LCD_CLK=P2^3; //LCD串行同步时钟,上升沿时读取SID数据.
sbit  pbs=P2^2;
sbit  dd=P2^0;
//函数声明:
void LCD_WIR(unsigned char LCD_COM);
void LCD_WDR(unsigned char LCD_DATA);
void LCD_Send(unsigned char sData);
unsigned char LCD_Rec();
unsigned char LCD_RBF();
/**********************************************************
*YM12864R-3液晶显示屏测试程序.
*造字功能测试
*控制器:ST7920
*通讯方式:串行(3线)
**********************************************************/

//函数声明
void delay(unsigned char count);
void LCD_WIR(unsigned char LCD_COM);
void LCD_WDR(unsigned char LCD_DATA);
void LCD_Init();
void lcd_cgram();
//用二维数组定义造字图形数据
unsigned char code pictab[5][32]={
//箱子图形代码
  {0xFF,0xFF,0xFF,0xFF,0xC0,0x03,0xC0,0x03,
      0xCF,0xF3,0xCF,0xF3,0xCC,0x33,0xCC,0x33,
      0xCC,0x33,0xCC,0x33,0xCF,0xF3,0xCF,0xF3,
      0xC0,0x03,0xC0,0x03,0xFF,0xFF,0xFF,0xFF},
//圆形图形代码
  {0x0F,0xF0,0x10,0x08,0x20,0x04,0x47,0xE2,
      0x88,0x11,0x90,0x09,0x90,0x09,0x90,0x09,
      0x90,0x09,0x90,0x09,0x90,0x09,0x88,0x11,
      0x47,0xE2,0x20,0x04,0x10,0x08,0x0F,0xF0},
//脸形
  {0x1F,0xF8,0x3F,0xFC,0x7F,0xFE,0xFF,0xFD,
      0xFF,0xFD,0xFF,0xFD,0xFF,0xFD,0x80,0x01,
      0x8C,0x31,0x9E,0x79,0x80,0x01,0x80,0x01,
      0x80,0x01,0x43,0xC2,0x21,0x84,0x1F,0xF8},

//十字图形代码
  {0x0F,0xF0,0x08,0x10,0x0B,0xD0,0x0A,0x50,
      0xFA,0x5F,0x82,0x41,0xBE,0x7D,0xA0,0x05,
      0xA0,0x05,0xBE,0x7D,0x82,0x41,0xFA,0x5F,
      0x0A,0x50,0x0B,0xD0,0x08,0x10,0x0F,0xF0},
//墙壁
  {0xFB,0xFB,0xFB,0xFB,0xFB,0xFB,0x00,0x00,
      0xDF,0xDF,0xDF,0xDF,0xDF,0xDF,0x00,0x00,
      0xFD,0xFD,0xFD,0xFD,0xFD,0xFD,0x00,0x00,
      0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x00,0x00},
};
unsigned char code string[]="YM12864R造字演示";

void main()
{
 unsigned char i;
 dd=1;
 pbs=0;
 delay(40);   //延时等待电源稳定,液晶复位完成
 LCD_Init(); //调用液晶初始化程序
 delay(3);
 LCD_WIR (0x80); //在LCD第1行显示
 for (i=0;i<16;i++)
  LCD_WDR(string[i]);
  //调用造字函数
  //lcd_cgram();
  LCD_WIR(0x90);//在LCD第2行显示 ;
  LCD_WDR(0xc8);
  LCD_WDR(0xcb);
  LCD_WIR(0X8B);
  LCD_WDR(0xc8);
  LCD_WDR(0xcb);
  //显示造的第1个字
  LCD_WDR(0x00);
  LCD_WDR(0x00);
  //显示造的第2个字
  LCD_WDR(0x00);
  LCD_WDR(0x02);
  //显示造的第3个字
  LCD_WDR(0x00);
  LCD_WDR(0x04);
  //显示造的第4个字
  LCD_WDR(0x00);
  LCD_WDR(0x06);

  //以上4个自造字可以用循环写入,我这里只是测试.
  while(1);
}
//造字
void lcd_cgram()
{
 unsigned char i,k,h=0x40;
 for (k=0;k<4;k++)//写入4个自造字数据
 {
  for (i=0;i<16;i++) //写入1个自造字数据
   {
    LCD_WIR (h+i); //CGRAM地址
    LCD_WDR(pictab[k][i*2]);//写高8位数据到CGRAM
    LCD_WDR(pictab[k][i*2+1]);//写低8位到CGRAM
  }
 h=h+0x10;  //或写成复合运算 h+=0x10; 指向下一个自造字CGRAM地址
  }
}
//短延时函数(100us)
void delay(unsigned char count)
{//延时时间为count*100us
 unsigned char i,j;
 for (j=count;j>0;j--)
   for (i=50;i>0;i--);
}


/**********************************************************
*LCD初始化函数
**********************************************************/
void LCD_Init()
{
 LCD_WIR(0x30); //功能设置-基本指令集
 LCD_WIR(0x0c); //显示打开,光标关,反白显示关
 LCD_WIR(0x01); //清屏
 LCD_WIR(0x06); //进入点设定,光标向右移动,AC+1
}
/**********************************************************
*写指令到LCD函数
*名称:LCD_WIR
*入口参数:LCD_COM (字符型--8位数据)
**********************************************************/
void LCD_WIR(unsigned char LCD_COM)
{
 unsigned char tDat;
 LCD_CS = 0;  //拉低片选终止所有数据传送
 do{tDat = LCD_RBF();
 }while((tDat&0x80)==0x80); //判忙
 LCD_CS = 1;   //拉高片选准备传送数据
 LCD_Send(0xf8);   //发送写指令
 LCD_Send(LCD_COM&0xf0);//发送高4位
 LCD_Send(LCD_COM<<4); //发送低4位
 LCD_CS = 0;   //拉低片选终止所有数据传送
}
/**********************************************************
*写数据到LCD函数
*名称:LCD_WDR
*入口参数:LCD_DATA (字符型-8位)
**********************************************************/
void LCD_WDR(unsigned char LCD_DATA)
{
 unsigned char tDat;
 LCD_CS = 0;     //拉低片选终止所有数据传送
 do{tDat = LCD_RBF();
 }while((tDat&0x80)==0x80);//判忙
 LCD_CS = 1;   //拉高片选准备传送数据
 LCD_Send(0xfa);   //发送写数据指令
 LCD_Send(LCD_DATA&0xf0);//发送高4位
 LCD_Send(LCD_DATA<<4); //发送低4位
 LCD_CS = 0;   //拉低片选终止所有数据传送
}
/**********************************************************
*读取LCD忙碌标志(BF)和地址计数器(AC)的状态
*名称:LCD_RBF
**********************************************************/
unsigned char LCD_RBF()
{
 unsigned char HDat,LDat;
 LCD_CS = 1;  //拉高片选准备传送数据
 LCD_Send(0xfc);  //发送读数据指令
 HDat = LCD_Rec(); //读取数据高4位
 LDat = LCD_Rec(); //读取数据低4位
 LCD_CS = 0;  //拉低片选终止所有数据传送
 LDat = (LDat>>4)|(HDat&0xf0); //组合成完整数据
 return (LDat);
}

/**********************************************************
*LCD发送8BIT的数据(1个字节)
*名称:LCD_Send
*入口:
**********************************************************/
void LCD_Send(unsigned char sData)
{
 unsigned char i;
 ACC = sData;
 for (i=8;i>0;i--)
  {
  LCD_CLK = 0;
  LCD_SID = ACC_7;//发送一位数据
  LCD_CLK = 1;  //拉高串行时钟端,锁存数据
  ACC   <<= 1;
 }
}
/**********************************************************
*LCD接收8BIT数据(1个字节)
*名称:LCD_Rec
*出口:rData
**********************************************************/
unsigned char LCD_Rec()
{
 unsigned char i;
 for (i=8;i>0;i--)
  {
  LCD_CLK = 0;
  ACC   <<= 1;
  LCD_CLK = 1;
  ACC_0   = LCD_SID;
  }
 return(ACC);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -