?? drive_functions.h
字號:
/*這個是12864圖形液晶驅動程序,包括畫點,劃直線,畫幾何圖形,寫點陣漢字等
您可以把它復制到您的工程中,用#include'drive_function' 直接調用它
如果您感覺自己程序寫的比較好了,我建議你試著去移植操作系統如uc/os,uclinux
而不要自己發太多時間去寫操作界面。這樣效果更好!
*/
#define uchar unsigned char
#define uint unsigned int
uchar chip_select=1;
uchar color=0x00;
bit black_flag=0; //黑屏顯示標志位
sbit DI=P2^7;
sbit RW=P2^6;
sbit E=P2^5;
sbit CS1=P2^4;
sbit CS2=P2^3;
sbit RST=P2^2;
bit busy_bit=1;
bit menu=0;
uchar line=0;
uchar select=0;
#define LCD P0
#include<math.h>
#define Graphic_Clear 0x01 //檫除點
#define Graphic_Not 0x02 //反相點
#define Graphic_Draw 0x03 //畫點
void delay_ns(uchar ns)
{
while(ns--);
}
void delay_ms(uint ms)
{
uchar i;
while(ms--)
for(i=0;i<120;i++);
}
/************************* if 0 read command,else read data ****************/
uchar read(bit flag)
{
uchar stat;
LCD=0xFF;
RW=1;
DI=flag;
E=1;
E=0;
E=1; //E的下降沿,然后E持續拉高讀才有效
stat=LCD;
E=0;
return(stat);
}
/*************************** check busy ************************/
bit CheckBusy(void)
{
uchar state=0;
state=read(0);
busy_bit=(bit)(state>>7);
return(busy_bit);
}
/************************* if 0 write command,else write data ****************/
void write(bit flag,uchar dat)
{
while(CheckBusy());
LCD=0xFF;
RW=0;
DI=flag;
LCD=dat;
E=1;
E=0;
}
/************************* set display page ****************/
void SetPage(uchar page)
{
CS1=1;
CS2=0;
write(0,page+0xb8);
CS1=0;
CS2=1;
write(0,page+0xb8);
}
/************************ set display column *****************/
void SetColumn(uchar column)
{
CS1=1;
CS2=0;
write(0,column+0x40);
CS1=0;
CS2=1;
write(0,column+0x40);
}
/***************************** write data ************************/
void WriteData(uchar dsp_data)
{
if(chip_select==1)
{
CS1=1;
CS2=0;
}
else{
CS1=0;
CS2=1;
}
write(1,dsp_data);
}
/**************************** read data ***********************/
uchar ReadData(void)
{
uchar dsp_data;
while(CheckBusy());
if(chip_select==1)
{
CS2=0;
CS1=1;
}
else{
CS2=1;
CS1=0;
}
dsp_data=read(1);
return(dsp_data);
}
/******************** clear LCD *******************************/
void ClearLCD(void)
{
uchar page,column;
if(black_flag==1)color=0xFF; //設置清屏顏色
else color=0x00;
for(page=0;page<8;page++)
{
SetPage(page);
SetColumn(0);
for(column=0;column<64;column++)
{
chip_select=1;
WriteData(color); //clear chip1
chip_select=2;
WriteData(color); //clear chip2
}
}
}
/***********************在LCD上任意坐標畫點********************************/
void DrawPoint(uchar X,uchar Y,uchar Type)
{ //X,Y化點的坐標Type畫點的類型:反相點,檫除點,畫點
uchar DX = Y/8; //計算出屬于哪個字節
uchar BX = Y%8; //計算出屬于字節哪一位
uchar TempData = 0;
if (X > 63)
{
chip_select=2;
X -= 64;
}
else
{
chip_select=1;
}
SetPage(DX); //設行地址
SetColumn(X); //設列地址
TempData = ReadData(); //讀出所畫點所在字節的內容
switch (Type) //對該字節進行相應操作
{
case Graphic_Clear:
TempData &= ~(1<<BX);
break;
case Graphic_Not:
TempData ^= (1 << BX);
break;
case Graphic_Draw:
TempData |= (1 << BX);
break;
default: break;
}
SetPage(DX); //設置行地址
SetColumn(X); //設置列地址
WriteData(TempData); //把修改后的字節送回LCD,達到畫點目的
}
/***********************在LCD上任意坐標寫字********************************/
void DisWord(uchar add_y,uchar add_x,uchar k,uchar *p) //k=1,ascal;k=2,漢字。
{
uchar i,j,w;
j=add_x*2+0xb8;
w=(add_y<8/k?add_y:add_y-8/k)*8*k+0x40;
CS1=(add_y<8/k);
CS2=!(add_y<8/k);
write(0,j);
write(0,w);
for(i=0;i<16*k;i++)
{
if(i==8*k)
{
write(0,j+1);
write(0,w);
}
write(1,*p++);
}
}
/*****************任意兩點間劃直線**********************************/
DrawLine(uchar x1,uchar y1,uchar x2,uchar y2,uchar type)
{
uchar dx,dy,temp;
uint kkk;
if(x1>127) x1=127;
if(y1>63) y1=63;
if(x2>127) x2=127;
if(y2>63) y2=63;
if(x1==x2&&y1<y2)
{
for(dy=y1;dy<=y2;dy++) DrawPoint(x1,dy,type);
}
if(x1<x2&&y1==y2)
{
for(dx=x1;dx<=x2;dx++) DrawPoint(dx,y1,type);
}
if(x1>x2&&y1==y2)
{
temp=x1;x1=x2;x2=temp;
for(dx=x1;dx<=x2;dx++) DrawPoint(dx,y1,type);
}
if(x1==x2&&y1>y2)
{
temp=y1;y1=y2;y2=temp;
for(dy=y1;dy<=y2;dy++) DrawPoint(x1,dy,type);
}
if(x1<x2&&y1<y2)
for(dx=x1;dx<=x2;dx++)
{
kkk=(dx-x1)*(y2-y1);
dy=y1+kkk/(x2-x1);DrawPoint(dx,dy,type);
}
if(x1>x2&&y1>y2) //此向量尚有問題
for(dx=x2;dx<=x1;dx++)
{
kkk=(dx-x2)*(y1-y2);
dy=y2+kkk/(x1-x2);DrawPoint(dx,dy,type);
}
if(x1<x2&&y1>y2)
for(dx=x1;dx<=x2;dx++)
{
kkk=(dx-x1)*(y1-y2);
dy=y1-kkk/(x2-x1);DrawPoint(dx,dy,type);
}
if(x1>x2&&y1<y2)
for(dy=y1;dy<=y2;dy++)
{
kkk=(dy-y1)*(x1-x2);
dx=x1-kkk/(y2-y1);DrawPoint(dx,dy,type);
}
}
/***********************************************************************/
void DrawSineWave(void)
{
uchar xn=0;
uchar yn=30;
uchar i;
uchar xi,yi;
for(i=0;i<128;i++)
{
xi=i;
yi=(sin(i*0.1)*30)+30;
DrawLine(xn,yn,xi,yi,Graphic_Draw); //在一系列零散的點上,兩點兩點之間連線,從而得到一條曲線
xn=i;
yn=yi;
}
}
void DrawCircle(void)
{
uchar xn,yn,xi,yi;
unsigned int j;
xn=cos(0)*30+96;
yn=sin(0)*30+32;
//xn=cos(0)*15+96;
////yn=sin(0)*15+32;
for(j=0;j<629;j++)
//for(j=0;j<324;j++)
{
xi=(cos(j*0.01)*30)+96;
yi=(sin(j*0.01)*30)+32;
DrawLine(xn,yn,xi,yi,Graphic_Draw); //在一系列零散的點上,兩點兩點之間連線,從而得到一條曲線
xn=xi;
yn=yi;
}
}
void initlcd(void)
{
CS1=1;
CS2=1;
RST=0; q
delay_ms(100);
RST=1;
delay_ms(100);
write(0,0x3e);
write(0,0xc0);
write(0,0x3f);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -