?? smg12864l_m_exsample_c51.c
字號:
//子程序名稱:unsigned char code *getenglishcodepos(unsigned char ac).
//功能:根據當前ASCII字符碼查表后計算得到當前ASCII字符碼的字庫點陣位置.
//修改日期:2009.8.18
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
unsigned char code *getenglishcodepos(unsigned char ac)
{ unsigned char min,max,mid,midc;
min=0;
max=ENGLISHCHARNUMBER-1;
while(1)
{ if(max-min<2)
{ if(EnglishCode[min]==ac)
mid=min;
else if(EnglishCode[max]==ac)
mid=max;
else
mid=0;
break;
}
mid=(max+min)/2;
midc=EnglishCode[mid];
if(midc==ac)
break;
else if(midc>ac)
max=mid-1;
else
min=mid+1;
}
return EnglishCharDot+mid*ENGLISHCHARDOTSIZE;
}
//-------------------------------------------------------------------------------
//以下putsizeimage為圖形對象的基本子程序,putimage為圖形對象的擴充子程序
//-------------------------------------------------------------------------------
//子程序名稱:void putsizeimage(unsigned char XSIZE,unsigned YSIZE,
// unsigned char code *s)
//功能:在(XPOS,YPOS)位置繪制XSIZE列及YISZE行點陣的圖形*S.
//修改日期:2009.8.31
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
void putsizeimage(unsigned char XSIZE,unsigned char YSIZE,unsigned char code *s)
{ unsigned char k,lx,ly,a1,a2,y,Lcd_Mask;
k=YPOS&0x7;
YSIZE+=k;
y=YPOS;
s--;
for(lx=0;lx<XSIZE;lx++,XPOS++)
{ for(YPOS=y,ly=k;ly<YSIZE;)
{ unsigned char p;
a1=*s;
s++;
a2=*s;
if(CharImageReverse)
{ a1=~a1;
a2=~a2;
}
for(p=0;p<k;p++)
{ a2>>=1;
if((a1&0x1)==1)
a2+=0x80;
a1>>=1;
}
if((k==0) && (YSIZE<ly+8))
{ lcdpos();
ly+=8;
YPOS+=8;
}
else
{ lcdpos();
a1=lcdrd();
lcdpos();
ly+=8;
YPOS+=8;
Lcd_Mask=0xff;
p=YSIZE&0x7;
while(p>0)
{ Lcd_Mask>>=1;
YPOS--;
p--;
}
p=0xff;
while(YSIZE<ly)
{ ly--;
YPOS--;
p<<=1;
}
Lcd_Mask&=p;
a2&=Lcd_Mask;
a2|=a1&(~Lcd_Mask);
}
lcdwd(a2);
}
if((k!=0) && (YSIZE&0x7 != 0) && (k >= YSIZE&0x7)) s--;
}
YPOS=y;
}
//-------------------------------------------------------------------------------
//子程序名稱:void putimage(unsigned char code *s).
//功能:在(XPOS,YPOS)位置繪制XSIZE[*s]列及YISZE[*(s+1)]行點陣的圖形[*(s+2)].
//修改日期:2009.8.18
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
void putimage(unsigned char code *s) //顯示圖形子程序
{ unsigned char XSIZE,YSIZE;
XSIZE=*s;
s++;
YSIZE=*s;
s++;
putsizeimage(XSIZE,YSIZE,s);
}
//-------------------------------------------------------------------------------
//以下point為繪圖操作的基本子程序,line,lineto,rect為繪圖操作的擴充子程序.
//-------------------------------------------------------------------------------
//子程序名稱:void point(bit b).
//功能:按b的數據在(XPOS,YPOS)位置繪制點.
//修改日期:2009.8.18
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
void point(bit b)
{ unsigned char i,Lcd_Mask,j;
Lcd_Mask=0x01;
i=YPOS&0x7;
while(i>0)
{ Lcd_Mask<<=1;
i--;
}
lcdpos();
j=lcdrd();
lcdpos();
if(b)
lcdwd(j|Lcd_Mask);
else
lcdwd(j&(~Lcd_Mask));
}
//-------------------------------------------------------------------------------
//子程序名稱:void line(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,bit b)
//功能:按b的數據繪制(x0,y0)-(x1,y1)的直線
//修改日期:2009.8.18
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
void line(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,bit b)
{ unsigned char dx,dy;
unsigned int dk;
XPOS=x0;
YPOS=y0;
point(b);
dx=(x1>=x0)?x1-x0:x0-x1;
dy=(y1>=y0)?y1-y0:y0-y1;
if(dx==dy)
{ while(XPOS!=x1)
{ if(x1>x0) XPOS++;else XPOS--;
if(y1>y0) YPOS++;else YPOS--;
point(b);
}
}
else if (dx>dy)
{ dk=dy;
dy=0;
while(XPOS!=x1)
{ if(x1>x0) XPOS++;else XPOS--;
dy++;
if(y1>y0) YPOS=y0+(dk*dy+dx/2)/dx;else YPOS=y0-(dk*dy+dx/2)/dx;
point(b);
}
}
else
{ dk=dx;
dx=0;
while(YPOS!=y1)
{ if(y1>y0) YPOS++;else YPOS--;
dx++;
if(x1>x0) XPOS=x0+(dk*dx+dy/2)/dy;else XPOS=x0-(dk*dx+dy/2)/dy;
point(b);
}
}
}
//-------------------------------------------------------------------------------
//子程序名稱:void lineto(unsigned char x1,unsigned char y1,bit b)
//功能:按b的數據繪制(XPOS,YPOS)-(x1,y1)的直線
//修改日期:2009.8.18
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
void lineto(unsigned char x1,unsigned char y1,bit b)//繪制(XPOS,YPOS)-(X1,Y1)的直線
{ line(XPOS,YPOS,x1,y1,b);
}
//-------------------------------------------------------------------------------
//子程序名稱:void rect(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,bit b)
//功能:按b的數據繪制(x0,y0)-(x1,y1)的矩形
//修改日期:2009.8.18
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
void rect(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,bit b)
{ line(x0,y0,x1,y0,b);
line(x1,y0,x1,y1,b);
line(x1,y1,x0,y1,b);
line(x0,y1,x0,y0,b);
}
//-------------------------------------------------------------------------------
//以下lcdfill,lcdpos,lcdreset,setlcdvoltage為NT7532型硬件接口的12864液晶顯示模塊
//的基本子程序
//-------------------------------------------------------------------------------
//子程序名稱:void lcdfill(unsigned char d).
//功能:整屏顯示d表示的字節數據.
//修改日期:2009.08.31
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
void lcdfill(unsigned char d) //整屏顯示d代表的字節數據子程序
{ unsigned char j;
XPOS=0;
YPOS=0;
for(YPOS=0;YPOS<64;YPOS+=8) //8頁
{ lcdpos();
for(j=0;j<128;j++) //128列
lcdwd(d); //送圖形數據
}
YPOS=0;
}
//-------------------------------------------------------------------------------
//子程序名稱:void lcdpos(void).
//功能:設置坐標點(XPOS,YPOS)位置對應的內部RAM地址.
//修改日期:2009.08.31
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
void lcdpos(void) //設置坐標點(XPOS,YPOS)內部RAM地址的子程序
{ unsigned char Column;
Column=XPOS+4;
lcdwc(0xB0|((YPOS/8)&0x7)); //頁地址設置
lcdwc(0x10|(Column>>4)); //列的高四位設置
lcdwc(Column&0x0F); //列的低四位設置
}
//-------------------------------------------------------------------------------
//子程序名稱:void lcdreset(void)
//功能:液晶顯示控制器初始化
//修改日期:2009.08.31
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
void lcdreset(void) //液晶顯示控制器初始化子程序
{ lcdwc(0xA2); //設置LCD bias
lcdwc(0xA1); //設置ADC select
lcdwc(0xC0); //設置COM反向
lcdwc(0x2F); //設置電源控制模式
lcdwc(0x40); //設置顯示初始行
lcdwc(0xAF); //開顯示
}
//-------------------------------------------------------------------------------
//子程序名稱:void setlcdvoltage(unsigned char vol)
//功能:設置LCD電壓用來調節顯示的對比度
//修改日期:2009.08.31
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
void setlcdvoltage(unsigned char vol) //LCD電壓設置
{ lcdwc(0x81);
lcdwc(vol&0x3F); //范圍為0-63,上電默認值為32
}
//-------------------------------------------------------------------------------
//以下lcdwc,lcdwd,lcdrd為MCS51模擬口線接口的NT7532液晶顯示控制器的基本子程序,
//lcdwaitidle為內部子程序.
//-------------------------------------------------------------------------------
//子程序名稱:void lcdwd(unsigned char d).
//功能:向液晶顯示控制器寫圖形數據.
//修改日期:2009.08.31
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
void lcdwd(unsigned char d)
{ lcdwaitidle();
P1=d;
A0PIN=1;
CSPIN=0;
WRPIN=0;
_nop_();
WRPIN=1;
CSPIN=1;
}
//-------------------------------------------------------------------------------
//子程序名稱:unsigned char lcdrd(void).
//功能:從液晶顯示控制器中讀圖形數據.
//修改日期:2009.08.31
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
unsigned char lcdrd(void) //讀圖形數據子程序
{ unsigned char d;
lcdwaitidle(); //檢測液晶顯示控制器是否空閑
P1=0xff;
A0PIN=1;
CSPIN=0;
RDPIN=0;
_nop_();
d=P1;
RDPIN=1;
CSPIN=1;
CSPIN=1; //DUMMY READ
CSPIN=0;
RDPIN=0;
_nop_();
d=P1;
RDPIN=1;
CSPIN=1;
return d;
}
//-------------------------------------------------------------------------------
//子程序名稱:lcdwc(unsigned char c).
//功能:向液晶顯示控制器送指令.
//修改日期:2009.08.31
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
void lcdwc(unsigned char c)
{ lcdwaitidle();
P1=c;
A0PIN=0;
CSPIN=0;
WRPIN=0;
_nop_();
WRPIN=1;
CSPIN=1;
}
//-------------------------------------------------------------------------------
//子程序名稱:voidlcdwaitidle(void).
//功能:忙檢測,在對液晶顯示控制器操作的每一條指令之前,需檢測液晶顯示器是否空閑.
//修改日期:2009.08.31
//修改人:chujianjun@sunman.cn,tanchao@sunman.cn
//-------------------------------------------------------------------------------
void lcdwaitidle(void) //忙檢測子程序
{ unsigned char i;
P1=0xff;
A0PIN=0;
CSPIN=0;
RDPIN=0;
for(i=0;i<20;i++) //
if( (P1&0x80) != 0x80 ) break; //D7=0 空閑退出
RDPIN=1;
CSPIN=1;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -