📄 -
字号:
/*********************************************************************************************************
** 文件功能 :12864液晶串行驱动程序
** 注意事项 :硬件部分需要将12864的第15个管脚通过电阻接到低电平
** 工程作者 :Blue Sky Teams——ZZL
** 工程版本 :V1.0
*********************************************************************************************************/
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int //宏定义
/*****LCD接口定义*****/
sbit CS = P0^5; //片选信号 4
sbit SID = P0^6; //串行数据 5
sbit SCLK = P0^7; //串行同步时钟 6
/*****LCD功能初始化指令*****/
#define basic_commod 0x30
#define extern_commod 0x34
#define cursor_on 0x0f
#define cursor_off 0x0c
#define clear 0x01
#define draw_on 0x36
#define draw_off 0x34
/*****汉字地址表*****/
uchar code addr_tab[]={
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,//第一行汉字位置
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,//第二行汉字位置
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,//第三行汉字位置
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,//第四行汉字位置
};
/*****串行发送一个字节*****/
void SendByte(uchar Dbyte)
{
uchar i;
for(i=0;i<8;i++)
{
SCLK = 0;
Dbyte=Dbyte<<1; //左移一位
SID = CY; //移出的位给SID
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
SCLK = 1;
_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();
_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();
_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();
_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();
SCLK = 0;
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
}
}
/*****串行接收一个字节*****/
uchar ReceiveByte(void)
{
uchar i,temp1,temp2;
temp1 = 0;
temp2 = 0;
for(i=0;i<8;i++)
{
temp1=temp1<<1;
SCLK = 0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
SCLK = 1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
if(SID) temp1++;
SCLK = 0;
}
for(i=0;i<8;i++)
{
temp2=temp2<<1;
SCLK = 0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
SCLK = 1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();
if(SID) temp2++;
SCLK = 0;
}
return ((0xf0&temp1)+(0x0f&temp2));
}
/*****检测LCD忙状态*****/
void CheckBusy( void )
{
do SendByte(0xfc); //11111,RW(1),RS(0),0
while(0x80&ReceiveByte()); //BF(.7)=1 Busy
}
/*****读取LCD RAM状态*****/
uchar Read_12864_Data( void )
{
uchar state;
CS = 1;
CheckBusy();
SendByte(0xfe); //11111,RW(1),RS(1),0
state=ReceiveByte();
CS = 0;
return state;
}
/*****写指令*****/
void Write_12864_Com(uchar Cbyte )
{
CS = 1;
CheckBusy();
SendByte(0xf8); //11111,RW(0),RS(0),0
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
SendByte(0xf0&Cbyte); //高四位
_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();
SendByte(0xf0&Cbyte<<4); //低四位(先执行<<)
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
CS = 0;
}
/*****写数据*****/
void Write_12864_Data(uchar Dbyte )
{
CS = 1;
_nop_();_nop_(); _nop_();_nop_();
CheckBusy(); _nop_();_nop_();
SendByte(0xfa); //11111,RW(0),RS(1),0
_nop_();_nop_();_nop_();_nop_();
SendByte(0xf0&Dbyte); //高四位
_nop_();_nop_();_nop_();_nop_();
SendByte(0xf0&Dbyte<<4); //低四位(先执行<<)
_nop_();_nop_();_nop_();_nop_();
CS = 0;
}
/*****初始化LCD*****/
void LCD_12864_Init(void) //液晶初始化
{
Write_12864_Com(basic_commod);//30H--基本指令操作
Write_12864_Com(cursor_off);//0x06开显示,关光标,不闪烁。 扩展
Write_12864_Com(clear);//清除显示0x01
Write_12864_Com(0x06);//指定在资料写入或读取时,光标的移动方向,DDRAM的地址计数器(AC)加1。
}
void Write_12864_String(uchar *str)//写入字符串或者汉字
{
uchar *p;
p=str;
while(*p!=0)
{
Write_12864_Data(*p);
p=++str;
}
}
/*********************************************************************************************************
** 函数功能 :在指定位置写入汉字
** 函数说明 :汉字必须是写在一个连续的16*16的点阵中
** 入口参数 :待写入的汉字
** 函数举例 :Hanzi_Disp("液晶实验")
** 出口参数 :无
*********************************************************************************************************/
void Hanzi_Disp(uchar x,uchar y,uchar *s)
{
Write_12864_Com(addr_tab[8 * x + y]); //写地址
while(*s > 0)
{
Write_12864_Data(*s); //写数据
s ++;
}
}
/*********************************************************************************************************
** 函数功能 :在指定位置写一个整数
** 函数说明 :整数的范围从0到65535
** 入口参数 :待写入的整数
** 出口参数 :无
*********************************************************************************************************/
void Num_Display(uchar x,uchar y,uint number)
{
uint i = 10000;
Write_12864_Com(addr_tab[8 * x + y]); //写地址
if( number !=0)
{
while(number / i == 0)
{
i /= 10;
}
if(i != 1)
{
while(number/i != 0)
{
Write_12864_Data(number / i + 0x30);
number -= (number / i) * i;
i /= 10;
if(i == 1)break;
}
}
}
Write_12864_Data(number%10+0x30);
}
/*********************************************************************************************************
** 函数功能 :在屏幕上显示一副图片
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -