📄 lcd128_1.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 + -