欧美视频综合-欧美视频中文字幕-欧美视频在线观在线看-欧美视频在线观看网站-直接观看黄网站免费视频-正在播放久久

機電之家資源網
單片機首頁|單片機基礎|單片機應用|單片機開發|單片機文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發
培訓信息
贊助商
經驗證可以使用的KS0108液晶驅動
經驗證可以使用的KS0108液晶驅動
 更新時間:2010-1-30 16:42:24  點擊數:0
【字體: 字體顏色
include "absacc.h"
#include "intrins.h"

//自定義庫 在"c:\comp51\userlib\"文件夾中
#include ".\inc\ascii816.h" //標準ascii庫
#include ".\inc\hztable.h" //漢字點陣庫(自做)
#include ".\inc\menu.h" //菜單庫(自做)


// lcd128*64 數據線
#define lcd12864dataport p1

// lcd128*64 i/o 信號管腳
sbit di =p3^1; // 數據\指令 選擇
sbit rw =p3^3; // 讀\寫 選擇
sbit en =p3^2; // 讀\寫使能
sbit cs1 =p3^4; // 片選1,低有效(前64列)
sbit cs2 =p3^5; // 片選2,低有效(后64列)

sbit reset=p0^7; // 復位


/*----------------------------------------------------------------------------------------------------*/
/* ****函數列表****

//開關顯示
void setonoff(unsigned char onoff)

//選擇屏幕
//screen: 0-全屏,1-左屏,2-右
void selectscreen(unsigned char screen)

//清屏
//screen: 0-全屏,1-左屏,2-右
void clearscreen(unsigned char screen)

//顯示8*8點陣
//旋轉90度:字模被豎著切分
//lin:行(0-7), column: 列(0-15)
//address : 字模區首地址
void show88(unsigned char lin,unsigned char column,unsigned int address)

//顯示8*16字符
//旋轉90度:字模被豎著切分
//lin:行(0-3), column: 列(0-15)
//character:字符代碼(標準ascii碼)
void showchar(unsigned char lin,unsigned char column,unsigned char character)

//顯示8*16字符串
//!!!只能顯示在一行上即: 串長+column <=15
//旋轉90度:字模被豎著切分
//lin:行(0-3), column: 列(0-15)
//address : 字模區首地址
void showstring(unsigned char lin,unsigned char column, unsigned char *string)

//顯示一個漢字
//旋轉90度:字模被豎著切分
//lin:行(0-3), column: 列(0-15)
//hzcode: 漢字代碼(自定義的)
void showhz(unsigned char lin,unsigned char column,unsigned int hzcode)

//顯示圖片
//旋轉90度 :字模被豎著切分
//startline :開始行
//startcolumn:開始列
//linechar :圖片行點除8(圖片以8*8點陣為單位)
//columnchar :圖片列點除8(圖片以8*8點陣為單位)
//address : 字模區首地址
void showpicture(unsigned char startline,unsigned char startcolumn,unsigned char linechar,unsigned char columnchar,unsigned int address)
//!!問題大戶
//顯示一行漢字
//lin:行
//lineheadaddr: 此行漢字代碼區首地址
void showline(unsigned char lin,unsigned int lineheadaddr)

//顯示一屏漢字
//pageheadaddr:此屏漢字代碼地址區首地址
void showpage(unsigned int pageheadaddr)

//反顯一個8*8字塊
//lin:行(0-3), column: 列(0-7)
void reverseshow88(unsigned char lin,unsigned char column)


//反顯一個字符
//lin:行(0-4), column: 列(0-15)
void reverseshowchar(unsigned char lin,unsigned char column)


//反顯一個漢字
//lin:行(0-3), column: 列(0-7)
reverseshowhz(unsigned char lin,unsigned char column)

//反顯一行漢字
//lin:行
reverseshow(unsigned char lin)

//初始化lcd
void initlcd()

****函數列表結束**** */
/*----------------------------------------------------------------------------------------------------*/
/*--基本函數源程序------------------------------------------------------------------------------------*/
//延時
lcd12864delay()
{
unsigned int i=500;
while(i--) {;}
}
/*----------------------------------------------------------------------------------------------------*/
//狀態檢查
void checkstate()
{
unsigned char dat;
di=0;
rw=1;
do{
lcd12864dataport=0xff;
en=1; dat=lcd12864dataport; en=0;
dat=0x90 & dat; //僅當第4,7位為0時才可操作
}while(!(dat==0x00));
}
/*----------------------------------------------------------------------------------------------------*/
//寫顯示數據
//dat:顯示數據
void writebyte(unsigned char dat)
{
checkstate();
di=1; rw=0;
lcd12864dataport=dat;
en=1; en=0;
}
/*-----------------------------------------------------------------------------------------------------*/
//向lcd發送命令
//command :命令
sendcommandtolcd(unsigned char command)
{
checkstate();
rw=0;
lcd12864dataport=command;
en=1; en=0;
}
/*----------------------------------------------------------------------------------------------------*/
//設定行地址(頁)--x 0-7
void setline(unsigned char line)
{
line=line & 0x07; // 0<=line<=7
line=line|0xb8; //1011 1xxx
sendcommandtolcd(line);
}
//設定列地址--y 0-63
void setcolumn(unsigned char column)
{
column=column &0x3f; // 0=<column<=63
column=column | 0x40; //01xx xxxx
sendcommandtolcd(column);
}
//設定顯示開始行--xx
void setstartline(unsigned char startline) //0--63
{
startline=startline & 0x07;
startline=startline|0xc0; //1100 0000
sendcommandtolcd(startline);
}
//開關顯示
void setonoff(unsigned char onoff)
{
onoff=0x3e | onoff; //0011 111x
sendcommandtolcd(onoff);
}
/*---------------------------------------------------------------------------------------------------*/
//選擇屏幕
//screen: 0-全屏,1-左屏,2-右屏
void selectscreen(unsigned char screen)
{ //北京顯示器:負有效 cs1: 0--右; cs2: 0--左
switch(screen)
{ case 0: cs1=0;//全屏
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
cs2=0;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
break;
case 1: cs1=1;//左屏
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
cs2=0;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
break;
case 2: cs1=0;//右屏
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
cs2=1;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
break;
}
}
/*---------------------------------------------------------------------------------------------------*/
//清屏
//screen: 0-全屏,1-左屏,2-右
void clearscreen(unsigned char screen)
{ unsigned char i,j;
selectscreen(screen);
for(i=0;i<8;i++)
{ setline(i);
for(j=0;j<64;j++)
{
writebyte(0x00);
}
}
}
/*--------------------------------------------------------------------------------------------------*/
//顯示8*8點陣
//旋轉90度:字模被豎著切分
//lin:行(0-7), column: 列(0-15)
//address : 字模區首地址
void show88(unsigned char lin,unsigned char column,unsigned int address)
{ unsigned char i;
if(column>16) {return;}
if(column<8) selectscreen(1); //如果列數<8(0,1,2,3,4,5,6,7)則寫在第一屏上
else {
selectscreen(2); //否則 (8,9,10,11,12,13,14,15)寫在第二屏上
column=column & 0x07; //防止越界
}
setline(lin);
setcolumn(column<<3);
for(i=0;i<8;i++) writebyte( cbyte[address+i] );
}
/*------------------------------------------------------------------------------------------------*/
//顯示8*16字符
//旋轉90度:字模被豎著切分
//lin:行(0-3), column: 列(0-15)
//character:字符代碼(標準ascii碼)
void showchar(unsigned char lin,unsigned char column,unsigned char character)
{ lin=lin<<1;
show88(lin ,column,ascii816[character-0x20] );
show88(lin+1,column,ascii816[character-0x20]+8 );
}
/*-----------------------------------------------------------------------------------------------*/
/*
//顯示8*16字符串
//!!!只能顯示在一行上即: 串長+column <=15
//旋轉90度:字模被豎著切分
//lin:行(0-3), column: 列(0-15)
//address : 字模區首地址
void showstring(unsigned char lin,unsigned char column, unsigned char *string)
{ unsigned char ch;
unsigned char i=0;

while(*string!='\0')
{
ch=*string;
if(i+column >15) break; //(只能顯示在一行上即: 串長+column <=15)
showchar(lin,i+column,ch);
string++; i++;
}
}
*/
/*----------------------------------------------------------------------------------------------*/
//顯示一個漢字
//旋轉90度:字模被豎著切分
//lin:行(0-3), column: 列(0-7)
//hzcode: 漢字代碼(自定義的)
//uchar code hztable
void showhz(unsigned char lin,unsigned char column,unsigned int hzcode)
{
lin=lin<<1; //lin*2

show88(lin,column,hztable[hzcode]);
show88(lin,column+1,hztable[hzcode]+8);
show88(lin+1,column,hztable[hzcode]+16);
show88(lin+1,column+1,hztable[hzcode]+24);
}
/*----------------------------------------------------------------------------------------------*/
//顯示圖片
//旋轉90度 :字模被豎著切分
//startline :開始行
//startcolumn:開始列
//linechar :圖片行點除8(圖片以8*8點陣為單位)
//columnchar :圖片列點除8(圖片以8*8點陣為單位)
//address : 字模區首地址
void showpicture(unsigned char startline,unsigned char startcolumn,unsigned char linechar,unsigned char columnchar,unsigned int address)
{ unsigned char i,j;
for(i=0;i<columnchar;i++)
for(j=0;j<linechar;j++)
show88(startline+i , startcolumn+j , address+(i*linechar+j)*8 );
}
/*----------------------------------------------------------------------------------------------*/
//顯示一行字符串(漢字,字母混排,一行16字節)
//lin:行
//lineheadaddr: 此行漢字代碼區首地址
void showline(unsigned char lin,unsigned char linehead[])
{ unsigned char i;
unsigned char byte;
unsigned int hzcode;
for( i=0; i<16; )
{ byte=linehead[i];
if(byte < 0x80) //字母
{
if(i>15) return; //!!編譯器有問題,須強制退出

showchar(lin, i , byte);
i=i+1;

}
else // byte >= 0x80(漢字)
{
if(i>15) return; //!!編譯器有問題,須強制退出

byte=byte & 0x7f; //最高位置0,即:減去0x8000
hzcode=(unsigned int)byte<<8; //?? //高8位
hzcode=hzcode+linehead[i+1]; //加低8位,組合成整型數地址
showhz( lin,i,hzcode);
i=i+2;
}
}
}
/*----------------------------------------------------------------------------------------------------*/
//顯示一屏漢字
//pageheadaddr:此屏漢字代碼地址區首地址
void showpage(unsigned char pagehead[][16])
{ unsigned char i;
for(i=0;i<4;i++) showline(i,pagehead[i]); //1行8個漢字,16字節
}
/*----------------------------------------------------------------------------------------------------*/
//讀顯示數據
unsigned char readbyte()
{
unsigned char dat;
checkstate();
di=1; rw=1;
lcd12864dataport=0xff;
en=1; dat=lcd12864dataport; en=0;
return(dat);
}

/*----------------------------------------------------------------------------------------------------*/
//反顯一個8*8字塊
//lin:行(0-3), column: 列(0-7)
void reverseshow88(unsigned char lin,unsigned char column)
{ unsigned char i;
unsigned char tab[8];

if(column<8) selectscreen(1); //如果列數<4(0,1,2,3),則寫在第一屏上
else selectscreen(2); //否則 (4,5,6,7), 寫在第二屏上
//讀上部8列
column=column<<3; //每個方塊8*8大小
setline(lin);
setcolumn(column);
tab[0]=readbyte(); //空讀!!!!! //?
for(i=0;i<8;i++) tab[i]=~readbyte();
//寫回
setline(lin);
setcolumn(column);
for(i=0;i<8;i++) writebyte(tab[i]);
}
/*----------------------------------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------------------------------*/
//反顯一個字符
//lin:行(0-4), column: 列(0-15)
void reverseshowchar(unsigned char lin,unsigned char column)
{ lin=lin<<1;
reverseshow88(lin ,column);
reverseshow88(lin+1,column);
}
/*----------------------------------------------------------------------------------------------------*/
//反顯一個漢字
//lin:行(0-3), column: 列(0-7)
reverseshowhz(unsigned char lin,unsigned char column)
{
lin=lin<<1;
column=column<<1;
reverseshow88(lin ,column );
reverseshow88(lin ,column+1);
reverseshow88(lin+1,column );
reverseshow88(lin+1,column+1);
}
/*----------------------------------------------------------------------------------------------------*/
//反顯一行漢字
//lin:行
reverseshow(unsigned char lin)
{ unsigned char i;
for(i=0;i<8;i++) reverseshowhz(lin,i);
}
/*----------------------------------------------------------------------------------------------------*/
void initlcd() //初始化lcd
{ unsigned char i=250; //延時
while(i--);

//reset=0;//復位
//reset=1;

selectscreen(0);
setonoff(0); //關顯示

clearscreen(1);//清屏
clearscreen(2);

selectscreen(0);
setonoff(1); //開顯示
selectscreen(0);
setstartline(0); //開始行:0
}
/*----------------------------------------------------------------------------------------------------*/

void reset() //液晶復位
{
//reset 低復位 _|-
reset=0;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
reset=1;

//全屏
cs1=0;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
cs2=0;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
sendcommandtolcd(0x3f);

}

  • 上一篇: ACM-12864漢字液晶顯示驅動程序
  • 下一篇: 沒有了
  • 發表評論   告訴好友   打印此文  收藏此頁  關閉窗口  返回頂部
    熱點文章
     
    推薦文章
     
    相關文章
    網友評論:(只顯示最新5條。)
    關于我們 | 聯系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機電之家 | 會員助手 | 免費鏈接

    點擊這里給我發消息66821730(技術支持)點擊這里給我發消息66821730(廣告投放) 點擊這里給我發消息41031197(編輯) 點擊這里給我發消息58733127(審核)
    本站提供的機電設備,機電供求等信息由機電企業自行提供,該企業負責信息內容的真實性、準確性和合法性。
    機電之家對此不承擔任何保證責任,有侵犯您利益的地方請聯系機電之家,機電之家將及時作出處理。
    Copyright 2007 機電之家 Inc All Rights Reserved.機電之家-由機電一體化網更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術支持

    主辦:杭州市高新區(濱江)機電一體化學會
    中國行業電子商務100強網站

    網站經營許可證:浙B2-20080178-1