📄 12864.c
字号:
/**********************************************************************************
12864管脚说明:1--CS1(片选左半屏) 2--CS2(片选右半屏) 3--GND 4--VDD(5.0V)
5--V0(液晶驱动电压灰度调节) 6--D/I(数据/指令R/S) 7--R/W(读/写)
8--E(使能端) 9~16--DB0~DB7(数据) 17--LED+(背光+ 5.0V) 18--LED-(背光- 0V)
数据--P0 DI--P2.0 RW--P2.1 CS1--P2.2 CS2--P2.3 E--P2.4 V0--电位器+5.0
***********************************************************************************/
#include <reg52.h>
#include <stdio.h>
#include <intrins.h>
#include <string.h>
#include <math.h>
sbit RS = P2^2; /*"H" is send or read the data;"L" is the instruction*/
sbit RW = P2^4;
sbit E = P2^3; /*Operation enable*/
sbit CS1 = P2^0;
sbit CS2 = P2^1;
#define DataPort P0 //数据口为P0口
unsigned char code ASCII_code[10][16]; //0-9的字模
void InitLCD(); //清屏函数
void delay1ms(unsigned char x); //延时1ms函数
void delay10ms(unsigned char x); //延时10ms函数
void OutFI(unsigned char i); //左屏显示送指令函数
void OutSI(unsigned char i); //右屏显示送指令函数
void OutFD(unsigned char i); //左屏显示送数据函数
void OutSD(unsigned char i); //右屏显示送数据函数
void biaoge(); //画表格函数
void Clrscreen(unsigned char m); //送指定数据函数
void Clrscreen_ge(unsigned char dat,unsigned char layer,unsigned char column,unsigned char whidth); //送固定数据\画表格
void Clrscreen_data(unsigned char dat,unsigned char layer,unsigned char column,unsigned char whidth); //送固定数据子函数
void display_GD(unsigned char layer,unsigned char column,unsigned char whidth,unsigned char daxiao,signed char KY,signed char HY,unsigned char *china_code); //移动显示子函数
void display(unsigned char layer,unsigned char column,unsigned char whidth,unsigned char daxiao,unsigned char *china_code); //随意显示子函数
void display_LM(unsigned char layer,unsigned char column,unsigned char whidth,unsigned char daxiao,unsigned char *china_code);//拉幕显示子函数
void QU_ASCII(unsigned char layer,unsigned char column,unsigned char whidth,unsigned char daxiao,unsigned char *china_code); //取数字的ASCII码显示
/*-----------------------------------------------------------------------------
函 数 名: void delay1ms(unsigned char x)
功 能: 延时1MS函数
说 明: X为1MS的倍数
------------------------------------------------------------------------------*/
void delay1ms(unsigned char x)
{
unsigned char i,j;
for(i=0;i<x;i++)
for(j=0;j<120;j++);
}
/*-----------------------------------------------------------------------------
函 数 名: void delay10ms(unsigned char x)
功 能: 延时10MS函数
说 明: X为10MS的倍数
------------------------------------------------------------------------------*/
void delay10ms(unsigned char x)
{
unsigned char i,j,k;
for(i=0;i<x;i++)
for(j=0;j<10;j++)
for(k=0;k<120;k++);
}
/*------------------------------------------------------------------------
函 数 名: void InitLCD()
功 能: 初始化
说 明:
--------------------------------------------------------------------------*/
void InitLCD()
{
OutFI(0x40); /*Set the Y address 0 */
OutSI(0x40);
OutFI(0xb8); /*Set the Page 0 */
OutSI(0xb8);
OutFI(0xc0); /*Set the display start line 0 */
OutSI(0xc0);
OutFI(0x3f); /*Display ON */
OutSI(0x3f);
}
/*-----------------------------------------------------------------------------------
函 数 名: void OutFI(uchar i)
功 能: 给左半屏发送指令
说 明: I为要送的指令
/*-----------------------------------------------------------------------------------*/
void OutFI(unsigned char i)
{
unsigned char data_sta;
EA=0;
do{
E=0;RW=1;RS=0;CS1=0;_nop_();
E=1;_nop_();_nop_();_nop_();
data_sta=DataPort;
_nop_();_nop_();
E=0;RW=0;CS1=1;
}while(data_sta&0x80);
E=0;RW=0;RS=0;CS1=0;_nop_();
DataPort=i;
E=1;_nop_();_nop_();_nop_();
E=0;RW=1;CS1=1;
EA=1;
}
/*----------------------------------------------------------------------------
函 数 名: void OutSI(uchar i)
功 能: 给右半屏发送指令
说 明: I为要送的指令
----------------------------------------------------------------------------*/
void OutSI(unsigned char i)
{
unsigned char data_sta;
EA=0;
do{
E=0;RW=1;RS=0;CS2=0;_nop_();
E=1;_nop_();_nop_();_nop_();
data_sta=DataPort;
_nop_();_nop_();
E=0;RW=0;CS2=1;
}while(data_sta&0x80);
E=0;RW=0;RS=0;CS2=0;_nop_();
DataPort=i;
E=1;_nop_();_nop_();_nop_();
E=0;RW=1;CS2=1;
EA=1;
}
/*----------------------------------------------------------------------------
函 数 名: void OutFD(uchar i)
功 能: 给左半屏送数据
说 明: I为要送的数据
----------------------------------------------------------------------------*/
void OutFD(unsigned char i)
{
unsigned char data_sta;
EA=0;
do{
E=0;RW=1;RS=0;CS1=0;_nop_();
E=1;_nop_();_nop_();_nop_();
data_sta=DataPort;
_nop_();_nop_();
E=0;RW=0;CS1=1;
}while(data_sta&0x80);
E=0;RW=0;RS=1;CS1=0;_nop_();
DataPort=i;
E=1;_nop_();_nop_();_nop_();
E=0;RW=1;CS1=1;
EA=1;
}
/*----------------------------------------------------------------------------
函 数 名: void OutSD(uchar i)
功 能: 给右半屏送数据
说 明: I为要送的数据
----------------------------------------------------------------------------*/
void OutSD(unsigned char i)
{
unsigned char data_sta;
EA=0;
do{
E=0;RW=1;RS=0;CS2=0;_nop_();
E=1;_nop_();_nop_();_nop_();
data_sta=DataPort;
_nop_();_nop_();
E=0;RW=0;CS2=1;
}while(data_sta&0x80);
E=0;RW=0;RS=1;CS2=0;_nop_();
DataPort=i;
E=1;_nop_();_nop_();_nop_();
E=0;RW=1;CS2=1;
EA=1;
}
/*-------------------------------------------------------------------------
函 数 名: void Clrscreen(unsigned char m)
功 能: 全屏显示某一个数据
说 明: M为要显示的数据 m=0x00则为清屏
----------------------------------------------------------------------------*/
void Clrscreen(unsigned char m)
{
unsigned char i,j;
for(i=8;i>0;i--)
{
OutFI(0xb8|(i-1));
for(j=0;j<64;j++)
{
OutFI(j|0x40);
OutFD(m);
}
}
for(i=0;i<8;i++)
{
OutSI(0xb8|i);
for(j=0;j<64;j++)
{
OutSI(j|0x40);
OutSD(m);
}
}
}
/*************************************************************
函 数 名: void Clrscreen_ge
功 能: 送固定数据\画表格
说 明: (数据,起始页,起始列,显示宽度)
**************************************************************/
void Clrscreen_ge(unsigned char dat,unsigned char layer,unsigned char column,unsigned char whidth)
{
unsigned char i,D,C,W,z,x;
D=dat;
C=column;
W=whidth;
if(column<64)
{
if(column+whidth<64)
{
for(i=0;i<W;i++)
{
OutFI(0xb8|layer); //送页地址
OutFI(C|0x40); //送列地址
OutFD(D); //送显示数据
C++;
}
}
else
{
z=64-column;
for(i=0;i<z;i++)
{
OutFI(0xb8|layer);
OutFI(C|0x40);
OutFD(D);
C++;
}
x=column+whidth-64;
for(i=0;i<x;i++)
{
OutSI(0xb8|layer);
OutSI(C|0x40);
OutSD(D);
C++;
}
}
}
else
{
for(i=0;i<W;i++)
{
OutSI(0xb8|layer);
OutSI(C|0x40);
OutSD(D);
C++;
}
}
}
/***********************************************************
函 数 名: void baoge()
功 能: 画固定表格
说 明:
************************************************************/
void biaoge()
{
Clrscreen_ge(0x01,0,1,126);
Clrscreen_ge(0x01,6,1,126);
Clrscreen_ge(0x80,7,1,126);
Clrscreen_data(0xff,0,0,1);
Clrscreen_data(0xff,2,0,1);
Clrscreen_data(0xff,4,0,1);
Clrscreen_data(0xff,6,0,1);
Clrscreen_data(0xff,0,127,1);
Clrscreen_data(0xff,2,127,1);
Clrscreen_data(0xff,4,127,1);
Clrscreen_data(0xff,6,127,1);
}
/*************************************************************
函 数 名: void Clrscreen_data
功 能: 在固定位置送固定数据函数
说 明: (要送的数据,页地址,列地址,显示宽度)
**************************************************************/
void Clrscreen_data(unsigned char dat,unsigned char layer,unsigned char column,unsigned char whidth)
{
unsigned char i,D,C,W,z,x;
D=dat;
C=column;
W=whidth;
if(column<64)
{
if(column+whidth<64)
{
for(i=0;i<W;i++)
{
OutFI(0xb8|layer);
OutFI(C|0x40);
OutFD(D);
C++;
}
C=C-W;
for(i=0;i<W;i++)
{
OutFI(0xb8|layer+1);
OutFI(C|0x40);
OutFD(D);
C++;
}
}
else
{
z=64-column;
for(i=0;i<z;i++)
{
OutFI(0xb8|layer);
OutFI(C|0x40);
OutFD(D);
C++;
}
C=C-z;
for(i=0;i<z;i++)
{
OutFI(0xb8|layer+1);
OutFI(C|0x40);
OutFD(D);
C++;
}
x=column+whidth-64;
for(i=0;i<x;i++)
{
OutSI(0xb8|layer);
OutSI(C|0x40);
OutSD(D);
C++;
}
C=C-x;
for(i=0;i<x;i++)
{
OutSI(0xb8|layer+1);
OutSI(C|0x40);
OutSD(D);
C++;
}
}
}
else
{
for(i=0;i<W;i++)
{
OutSI(0xb8|layer);
OutSI(C|0x40);
OutSD(D);
C++;
}
C=C-W;
for(i=0;i<W;i++)
{
OutSI(0xb8|layer+1);
OutSI(C|0x40);
OutSD(D);
C++;
}
}
}
/*******************************************************************************************
函 数 名: void display_GD
功 能: 实现显示水平滚动
说 明: [起始页,显示列,显示宽度,字的大小,水平滚动起始列,上下滚动的行数(为0时在指定的页位置,
为正数时向上移,为负数时向下移动),字模]水平滚动和上下滚动时与FOR循环配合使用
例如: for(i=124,j=1;i>0,j<124;i--,j++)
{
display_GD(4,i,j,16,125,i,arrayadress2[0]);
delay10ms(10);
}
*******************************************************************************************/
void display_GD(unsigned char layer,unsigned char column,unsigned char whidth,unsigned char daxiao,signed char KY,signed char HY,unsigned char *china_code)
{
unsigned int p=0;
unsigned char i,k,x;
unsigned char DX,W,CO;
W=whidth;
CO=column;
DX=daxiao;
if(column<64)
{
if(column+whidth<64)
{
W=whidth/daxiao;
for(i=0;i<W;i++)
{
for(k=0;k<DX;k++)
{
OutFI(0xb8|layer);
OutFI(CO|0x40);
OutFI(HY|0xC0);
OutFD(china_code[p]);
p++;
CO+=1;
}
p+=DX;
}
CO-=W*DX;
p=0;
for(i=0;i<W;i++)
{
for(k=0;k<DX;k++)
{
OutFI(0xb8|layer+1);
OutFI(CO|0x40);
OutFI(HY|0xC0);
OutFD(china_code[p+DX]);
p++;
CO+=1;
}
p+=DX;
}
W=whidth%DX;
for(k=0;k<W;k++)
{
OutFI(0xb8|layer);
OutFI(CO|0x40);
OutFI(HY|0xC0);
OutFD(china_code[p]);
p++;
CO+=1;
}
CO=CO-W;
for(k=0;k<W;k++)
{
OutFI(0xb8|layer+1);
OutFI(CO|0x40);
OutFI(HY|0xC0);
OutFD(china_code[p+DX-W]);
p++;
CO+=1;
}
}
//****************************************字全部在左半屏
/*******************************************************************************************/
else
{
W=(64-CO)/DX;
for(i=0;i<W;i++)
{
for(k=0;k<DX;k++)
{
OutFI(0xb8|layer);
OutFI(CO|0x40);
OutFI(HY|0xC0);
OutFD(china_code[p]);
p++;
CO+=1;
}
p+=DX;
}
CO-=DX*W;
p-=DX*W*2;
for(i=0;i<W;i++)
{
for(k=0;k<DX;k++)
{
OutFI(0xb8|layer+1);
OutFI(CO|0x40);
OutFI(HY|0xC0);
OutFD(china_code[p+DX]);
p++;
CO+=1;
}
p+=DX;
}
//****************************处理在左半屏显的整个字的部分
/********************************************************/
W=(64-CO)%DX;
for(k=0;k<W;k++)
{
OutFI(0xb8|layer);
OutFI(CO|0x40);
OutFI(HY|0xC0);
OutFD(china_code[p]); //*2+j*whidth
p++;
CO+=1;
}
CO-=W;
p+=DX-W;
for(k=0;k<W;k++)
{
OutFI(0xb8|layer+1);
OutFI(CO|0x40);
OutFI(HY|0xC0);
OutFD(china_code[p]); //*2+j*whidth+(j-z)
p++;
CO+=1;
}
/*******************************左右半屏过度的左半屏部分
/*******************************************************/
if((whidth+column-63)>(DX-W)) x=DX-W;
else x=whidth+column-63;
if(x==DX) x=0;
else x=x;
CO=64;
p-=DX;
for(k=0;k<x;k++)
{
OutSI(0xb8|layer);
OutSI(CO|0x40);
OutSI(HY|0xC0);
OutSD(china_code[p]); //*2+j*whidth-z
p++;
CO+=1;
}
CO=64;
p+=W;
for(k=0;k<x;k++)
{
OutSI(0xb8|layer+1);
OutSI(CO|0x40);
OutSI(HY|0xC0);
OutSD(china_code[p]); //*2+j*whidth-z+x
p++;
CO+=1;
}
/***********************************左右半屏过度的右半屏部分
/**********************************************************/
if(x==0) W=(whidth-(64-column))/DX;
if(x<=(KY-64)%DX) W=(whidth-(64-column))/DX;
else W=(whidth-(64-column))/DX-1;
for(i=0;i<W;i++)
{
for(k=0;k<DX;k++)
{
OutSI(0xb8|layer);
OutSI(CO|0x40);
OutSI(HY|0xC0);
OutSD(china_code[p]);
p++;
CO+=1;
}
p+=DX;
}
CO-=DX*W;
p-=W*2*DX;
for(i=0;i<W;i++)
{
for(k=0;k<DX;k++)
{
OutSI(0xb8|layer+1);
OutSI(CO|0x40);
OutSI(HY|0xC0);
OutSD(china_code[p+DX]);
p++;
CO+=1;
}
p+=DX;
}
W=KY-CO; //拉幕问题
for(i=0;i<W;i++)
{
OutSI(0xb8|layer);
OutSI(CO|0x40);
OutSI(HY|0xC0);
OutSD(china_code[p]);
p++;
CO+=1;
}
CO-=W;
p+=DX-W;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -