機(jī)電之家資源網(wǎng)
單片機(jī)首頁(yè)|單片機(jī)基礎(chǔ)|單片機(jī)應(yīng)用|單片機(jī)開發(fā)|單片機(jī)文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓(xùn)信息
贊助商
128x64液晶KS0108控制器驅(qū)動(dòng)程序
128x64液晶KS0108控制器驅(qū)動(dòng)程序
 更新時(shí)間:2010-1-29 16:33:12  點(diǎn)擊數(shù):0
【字體: 字體顏色

#include "absacc.h"
#include "intrins.h"

//自定義庫(kù) 在"C:\comp51\UserLib\"文件夾中
#include ".\inc\ASCII816.h" //標(biāo)準(zhǔn)ASCII庫(kù)
#include ".\inc\HZTable.h" //漢字點(diǎn)陣庫(kù)(自做)
#include ".\inc\Menu.h" //菜單庫(kù)(自做)


// LCD128*64 數(shù)據(jù)線
#define LCD12864DataPort P1

// LCD128*64 I/O 信號(hào)管腳
sbit di =P3^1; // 數(shù)據(jù)\指令 選擇
sbit rw =P3^3; // 讀\寫 選擇
sbit en =P3^2; // 讀\寫使能
sbit cs1 =P3^4; // 片選1,低有效(前64列)
sbit cs2 =P3^5; // 片選2,低有效(后64列)

sbit reset=P0^7; // 復(fù)位

/*----------------------------------------------------------------------------------------------------*/
/* ****函數(shù)列表****

//開關(guān)顯示
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點(diǎn)陣
//旋轉(zhuǎn)90度:字模被豎著切分
//lin:行(0-7), column: 列(0-15)
//address : 字模區(qū)首地址
void Show88(unsigned char lin,unsigned char column,unsigned int address)

//顯示8*16字符
//旋轉(zhuǎn)90度:字模被豎著切分
//lin:行(0-3), column: 列(0-15)
//character:字符代碼(標(biāo)準(zhǔn)ASCII碼)
void ShowChar(unsigned char lin,unsigned char column,unsigned char character)

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

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

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

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

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


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


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

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

//初始化LCD
void InitLCD()

****函數(shù)列表結(jié)束**** */
/*----------------------------------------------------------------------------------------------------*/
/*--基本函數(shù)源程序------------------------------------------------------------------------------------*/
//延時(shí)
Lcd12864delay()
{
unsigned int i=500;
while(i--) {;}
}
/*----------------------------------------------------------------------------------------------------*/
//狀態(tài)檢查
void CheckState()
{
unsigned char dat;
di=0;
rw=1;
do{
LCD12864DataPort=0xff;
en=1; dat=LCD12864DataPort; en=0;
dat=0x90 & dat; //僅當(dāng)?shù)?,7位為0時(shí)才可操作
}while(!(dat==0x00));
}
/*----------------------------------------------------------------------------------------------------*/
//寫顯示數(shù)據(jù)
//dat:顯示數(shù)據(jù)
void WriteByte(unsigned char dat)
{
CheckState();
di=1; rw=0;
LCD12864DataPort=dat;
en=1; en=0;
}
/*-----------------------------------------------------------------------------------------------------*/
//向LCD發(fā)送命令
//command :命令
SendCommandToLCD(unsigned char command)
{
CheckState();
rw=0;
LCD12864DataPort=command;
en=1; en=0;
}
/*----------------------------------------------------------------------------------------------------*/
//設(shè)定行地址(頁(yè))--X 0-7
void SetLine(unsigned char line)
{
line=line & 0x07; // 0<=line<=7
line=line|0xb8; //1011 1xxx
SendCommandToLCD(line);
}
//設(shè)定列地址--Y 0-63
void SetColumn(unsigned char column)
{
column=column &0x3f; // 0=<column<=63
column=column | 0x40; //01xx xxxx
SendCommandToLCD(column);
}
//設(shè)定顯示開始行--XX
void SetStartLine(unsigned char startline) //0--63
{
startline=startline & 0x07;
startline=startline|0xc0; //1100 0000
SendCommandToLCD(startline);
}
//開關(guān)顯示
void SetOnOff(unsigned char onoff)
{
onoff=0x3e | onoff; //0011 111x
SendCommandToLCD(onoff);
}
/*---------------------------------------------------------------------------------------------------*/
//選擇屏幕
//screen: 0-全屏,1-左屏,2-右屏
void SelectScreen(unsigned char screen)
{ //北京顯示器:負(fù)有效 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點(diǎn)陣
//旋轉(zhuǎn)90度:字模被豎著切分
//lin:行(0-7), column: 列(0-15)
//address : 字模區(qū)首地址
void Show88(unsigned char lin,unsigned char column,unsigned int address)
{ unsigned char i;
if(column>16) {return;}
if(column<8) SelectScreen(1); //如果列數(shù)<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字符
//旋轉(zhuǎn)90度:字模被豎著切分
//lin:行(0-3), column: 列(0-15)
//character:字符代碼(標(biāo)準(zhǔn)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字符串
//!!!只能顯示在一行上即: 串長(zhǎng)+column <=15
//旋轉(zhuǎn)90度:字模被豎著切分
//lin:行(0-3), column: 列(0-15)
//address : 字模區(qū)首地址
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; //(只能顯示在一行上即: 串長(zhǎng)+column <=15)
ShowChar(lin,i+column,ch);
string++; i++;
}
}
*/
/*----------------------------------------------------------------------------------------------*/
//顯示一個(gè)漢字
//旋轉(zhuǎn)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);
}
/*----------------------------------------------------------------------------------------------*/
//顯示圖片
//旋轉(zhuǎn)90度 :字模被豎著切分
//startline :開始行
//startcolumn:開始列
//linechar :圖片行點(diǎn)除8(圖片以8*8點(diǎn)陣為單位)
//columnchar :圖片列點(diǎn)除8(圖片以8*8點(diǎn)陣為單位)
//address : 字模區(qū)首地址
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字節(jié))
//lin:行
//lineheadaddr: 此行漢字代碼區(qū)首地址
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; //!!編譯器有問題,須強(qiáng)制退出

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

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

byte=byte & 0x7f; //最高位置0,即:減去0x8000
hzcode=(unsigned int)byte<<8; //?? //高8位
hzcode=hzcode+linehead[i+1]; //加低8位,組合成整型數(shù)地址
ShowHZ( lin,i,hzcode);
i=i+2;
}
}
}
/*--------------------

--------------------------------------------------------------------------------*/
//顯示一屏漢字
//pageheadaddr:此屏漢字代碼地址區(qū)首地址
void ShowPage(unsigned char pagehead[][16])
{ unsigned char i;
for(i=0;i<4;i++) ShowLine(i,pagehead[i]); //1行8個(gè)漢字,16字節(jié)
}
/*----------------------------------------------------------------------------------------------------*/
//讀顯示數(shù)據(jù)
unsigned char ReadByte()
{
unsigned char dat;
CheckState();
di=1; rw=1;
LCD12864DataPort=0xff;
en=1; dat=LCD12864DataPort; en=0;
return(dat);
}

/*----------------------------------------------------------------------------------------------------*/
//反顯一個(gè)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); //如果列數(shù)<4(0,1,2,3),則寫在第一屏上
else SelectScreen(2); //否則 (4,5,6,7), 寫在第二屏上
//讀上部8列
column=column<<3; //每個(gè)方塊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]);
}
/*----------------------------------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------------------------------*/
//反顯一個(gè)字符
//lin:行(0-4), column: 列(0-15)
void ReverseShowChar(unsigned char lin,unsigned char column)
{ lin=lin<<1;
ReverseShow88(lin ,column);
ReverseShow88(lin+1,column);
}
/*----------------------------------------------------------------------------------------------------*/
//反顯一個(gè)漢字
//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; //延時(shí)
while(i--);

//reset=0;//復(fù)位
//reset=1;

SelectScreen(0);
SetOnOff(0); //關(guān)顯示

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

SelectScreen(0);
SetOnOff(1); //開顯示
SelectScreen(0);
SetStartLine(0); //開始行:0
}
/*----------------------------------------------------------------------------------------------------*/

void Reset() //液晶復(fù)位
{
//reset 低復(fù)位 _|-
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);

}

  • 上一篇: 1602LCM液晶顯示屏的驅(qū)動(dòng)函數(shù)和實(shí)例
  • 下一篇: 沒有了
  • 發(fā)表評(píng)論   告訴好友   打印此文  收藏此頁(yè)  關(guān)閉窗口  返回頂部
    熱點(diǎn)文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評(píng)論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機(jī)電之家 | 會(huì)員助手 | 免費(fèi)鏈接

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

    主辦:杭州市高新區(qū)(濱江)機(jī)電一體化學(xué)會(huì)
    中國(guó)行業(yè)電子商務(wù)100強(qiáng)網(wǎng)站

    網(wǎng)站經(jīng)營(yíng)許可證:浙B2-20080178-1