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

📄 12864driver_parallel.c

📁 12864中文液晶基于单片机的并行驱动程序。。。希望对大家有用
💻 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 + -