📄 12864driver_parallel.c
字号:
#include "SPCE061A.h"
//12864并行驱动接口,rs--iob13,rw--iob14, e--iob15,8位的数据口接IOA8-IOA15
#define setblcdrs *P_IOB_Buffer=*P_IOB_Buffer|0x2000
#define clrlcdrs *P_IOB_Buffer=*P_IOB_Buffer&0xdfff
#define setblcdrw *P_IOB_Buffer=*P_IOB_Buffer|0x4000
#define clrlcdrw *P_IOB_Buffer=*P_IOB_Buffer&0xbfff
#define setblcde *P_IOB_Buffer=*P_IOB_Buffer|0x8000
#define clrlcde *P_IOB_Buffer=*P_IOB_Buffer&0x7fff
#define checkbusyon *P_IOA_Dir=*P_IOA_Dir&0x7fff //IOA第15位变为输入,以便查询忙状态。
#define checkbusyoff *P_IOA_Dir=*P_IOA_Dir|0x8000 //IOA第15位变为输出,退出查忙。
#define checkbusydr *P_IOA_Buffer=*P_IOA_Buffer|0xff00//将与lcd数据端连接的IO口设为高电平,为接收忙信号准备
#define lcdbusy *P_IOA_Data&0x8000//忙标志为,读出的结果1表示忙,0表示空闲
#define lcddatain *P_IOA_Buffer=(*P_IOA_Buffer&0x00ff)//将8位的数据从IOA8-IOA15
//#define uchar unsigned char
//#define uint unsigend int
void checkbusylcd(void)
{
checkbusyon;
checkbusydr;
clrlcdrs;
clrlcde;
setblcdrw;
setblcde;
delay(10);
while(lcdbusy)
{
*P_Watchdog_Clear=0x0001;
}
clrlcde;
checkbusyoff;
}
//------------------------------------------写指令
void write_instruction(unsigned int cmd)
{
checkbusylcd();
*P_Watchdog_Clear=0x0001;
clrlcde;
clrlcdrw;
clrlcdrs;
setblcde;
lcddatain|(cmd<<8);
clrlcde;
}
//--------------------------------------写数据
void write_data(unsigned int dat)
{
checkbusylcd();
*P_Watchdog_Clear=0x0001;
clrlcde;
clrlcdrw;
setblcdrs;
setblcde;
lcddatain|(dat<<8);
clrlcde;
}
//-------------------------------液晶初始化
void lcd_init(void)
{
delay(50000);
//delay(60000);
clrlcde;
clrlcdrw;
clrlcdrs;
setblcde;
lcddatain|0x3000;
delay(10);
clrlcde;
delay(1000);
setblcde;
lcddatain|0x3000;
delay(10);
clrlcde;
delay(1000);
setblcde;
lcddatain|0x3000;
delay(10);
clrlcde;
delay(1000);
setblcde;
lcddatain|0x0c00;
delay(10);
clrlcde;
delay(1000);
setblcde;
lcddatain|0x0100;
delay(10);
clrlcde;
delay(1000);
setblcde;
lcddatain|0x0600;
delay(10);
clrlcde;
delay(1000);
}
//----------------------------------------------------------------------
//12864液晶反白子程序
//X第几个字(1~8),Y第几行(1~4行),width反白的宽度(1~16)(单位:字符)
//若width==0则上次反白的位置变为正常显示,若width!=0,上次反白的位
//置变为正常显示,则这次反白的位置反白。
void fanbai(unsigned int x,unsigned int y,unsigned int width)
{
unsigned int xx,yy,i,j;
yy=0x80;
xx=0x80; //下半屏绘图区X,y轴地址
write_instruction(0x36); //扩展指令模式,形图开关开
for (i=0;i<32;i++) //上半屏处理显示空白
{
write_instruction(yy++);
write_instruction(xx);
for (j=0;j<16;j++)
{ write_data(0x00);}
}
yy=0x80;
xx=0x88; //下半屏绘图区X,轴地址
for (i=0;i<32;i++) //下半屏处理显示空白
{
write_instruction(yy++);
write_instruction(xx);
for (j=0;j<16;j++)
{write_data(0x00); }
}
write_instruction(0x30); //基本指令模式
//-------------------------------------------
if(width!=0) //如果width不等0,则反白选中区域并存此次的参数
{
if(y>2)
{
xx=x+0x87;
yy=((y-3)<<4)+0x80;
}
else
{
xx=x+0x7f;
yy=((y-1)<<4)+0x80;
}
//--------------------反白选中区域----------------------------
write_instruction(0x36); //扩展指令模式,形图开关开
for (i=0;i<16;i++) //一行处理显示
{
write_instruction(yy++);
write_instruction(xx);
for (j=0;j<width;j++)
{ write_data(0xff);}
}
write_instruction(0x30); //基本指令模式
}
}
//--------------------------------------------------显示图形,AP指向图形第一个点;
//显示时,从上到下,一行行显示
void show_picture(unsigned char *ap)
{
unsigned int y=0x80,x=0x80; //下半屏绘图区X,y轴地址
unsigned int i,j;
write_instruction(0x36); //扩展指令模式,形图开关开
for (i=0;i<32;i++) //上半屏处理显示
{
write_instruction(y++);
write_instruction(x);
for (j=0;j<16;j++)
{ write_data(*ap++);}
}
y=0x80;x=0x88; //下半屏绘图区X,轴地址
for (i=0;i<32;i++) //下半屏处理显示
{
write_instruction(y++);
write_instruction(x);
for (j=0;j<16;j++)
{write_data(*ap++);}
}
write_instruction(0x30); //基本指令模式
}
//-------------显示一行字或字符程序;X:从第几个字开始显示(1~8);Y:第几行(1~4);n:一行有几个字符
void show_group(unsigned int x,unsigned int y,unsigned char *p)
{
switch (y)
{
case 1:write_instruction(0x80+x-1);break;
case 2:write_instruction(0x90+x-1);break;
case 3:write_instruction(0x88+x-1);break;
case 4:write_instruction(0x98+x-1);break;
default:break;
}
while(*p)
{
write_data(*p++);
}
}
//绘图程序:图形大小16*16
//X第几个字(1~8),Y第几行(1~4行)
void bmp( unsigned char y, unsigned char x,unsigned char *ap)
{
unsigned char i,j,xx,yy;
if(y>2)
{
xx=x+0x87;
yy=((y-3)<<4)+0x80;
}
else
{
xx=x+0x7f;
yy=((y-1)<<4)+0x80;
}
write_instruction(0x36); //扩展指令模式,形图开关开
for (i=0;i<16;i++) //一行处理显示
{
write_instruction(yy++);
write_instruction(xx);
for (j=0;j<2;j++)
{ write_data(*ap++);}
}
write_instruction(0x30); //基本指令模式
}
//-------------------------------------X表示第几个字,Y表示第几行,Z表示字符;
void show_single(unsigned int x,unsigned int y,unsigned char z)
{
switch (y)
{
case 1:write_instruction(0x80+x-1);break;
case 2:write_instruction(0x90+x-1);break;
case 3:write_instruction(0x88+x-1);break;
case 4:write_instruction(0x98+x-1);break;
default:break;
}
write_data(z);
}
//---------------------------------------------------
//清屏指令
void cls(void)
{
write_instruction(0x1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -