?? 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 + -