?? lcd.c
字號:
/*************************************
* 控制器:KS0108
* MCU:AT89C52 ,晶體頻率:6MHz
* 取模方式:縱向字節倒序
* CS1和CS2為低電平有效
* copyright:tiany
* time:2008-9-20
**************************************/
#include <reg52.h>
#include "LCD.h"
//全局變量=====
uchar status;
uchar cbyte;
void Delay_us(uint DelayTime) //*******us延時*****//
{
while(DelayTime) DelayTime--;
}
/*--------------------------
*忙信號檢測
----------------------------*/
void LCD_Check_Busy(void)
{
/* while(1)
{
LCD_EN = 0;
LCD_RS = 0;
LCD_RW = 1;
LCD_BUS = 0xFF;
Delay_us(5);
LCD_EN = 1;
if(!LCD_Busy) break; /***在proteus中仿真查忙會引起死循環,程序的BUG!***/
// }
LCD_EN = 0;
}
/*----------------------------------------------------------------------------
寫入控制指令代碼。
函數入口參數:Command ------ 寫入的控制指令代碼 。
CS_Num ------ 左右半屏的選數值
----------------------------------------------------------------------------*/
void LCD_WriteCommand(uchar Command, uchar CS_Num)
{
LCD_Check_Busy();
if(CS_Num==L) /*選左半屏*/
{
LCD_CS1 = 0;
LCD_CS2 = 1;
}
else if(CS_Num==R) /*選右半屏*/
{
LCD_CS1 = 1;
LCD_CS2 = 0;
}
LCD_EN = 0;
LCD_RS = 0;
LCD_RW = 0;
LCD_BUS = Command;
LCD_EN = 1;
Delay_us(1);
LCD_EN = 0;
LCD_CS1 = 1;
LCD_CS2 = 1;
}
/*----------------------------------------------------------------------------
寫入定位信息
函數入口參數:hang ------ 寫入的行位置
lie ------ 寫入的列位置
----------------------------------------------------------------------------*/
void Locatexy(uchar hang,uchar lie)
{
uchar x, y, right;
switch(lie&0xc0)
{
case 0: { right = L;break;} //置左半屏標志
case 0x40:{ right = R;break;}//置右半屏標志
}
x=lie&0x3f|SETX; //把列數據變成列命令 40
y=hang&0x07|SETY;//把行數據變成行命令 b8
LCD_WriteCommand(y, right);/***送行命令***/
LCD_WriteCommand(x, right);/***送列命令***/
if(right==R)
status = R;
else
status = L;//置左又半區標志
}
/*----------------------------------------------------------------------------
寫入顯示數據。
函數入口參數: data --------寫入的顯示數據 。
hang,lie--------寫入定位位置
----------------------------------------------------------------------------*/
void LCD_WriteData(uchar Data,uchar hang,uchar lie)
{
Locatexy(hang,lie);//定位顯示位置
if(status==L) /*選擇左半屏*/
{
LCD_CS1 = 0;
LCD_CS2 = 1;
}
else if(status==R) /*選擇右半屏*/
{
LCD_CS1 = 1;
LCD_CS2 = 0;
}
LCD_Check_Busy();
LCD_EN = 0;
LCD_RS = 1;
LCD_RW = 0;
LCD_BUS = Data;
LCD_EN = 1;
Delay_us(1);
LCD_EN = 0;
LCD_CS1= 1;
LCD_CS2= 1;
}
//=========數據讀取====================
/*uchar LCD_ReadData(uchar hang,uchar lie)
{
uchar rdata;
Locatexy(hang,lie);//定位顯示位置
if(status==L)
{
LCD_Check_Busy();
LCD_CS1= 0;
LCD_CS2= 1;
}
else
{
LCD_Check_Busy();
LCD_CS1= 1;
LCD_CS2= 0;
}
P0 =0xFF; //數據送到P0口
LCD_EN = 0;
LCD_RS = 1;
LCD_RW = 1;
LCD_EN = 1;
Delay_us(1);
rdata=P0;
LCD_RS = 1;
LCD_RW = 1;
//P0 =0xFF; //數據送到P0口 要讀兩次,第二次的才正確
Delay_us(1);
rdata=P0;
LCD_EN = 0;
LCD_CS1= 1;
LCD_CS2= 1;
return rdata;
}*/
/*---------------------------------------------------------------------------
液晶模塊的清屏
---------------------------------------------------------------------------*/
void LCD_CLR(uchar Side_Num)
{
uchar i,k;
for(i=0;i<8;i++)
{
if(Side_Num==L)
for(k=0;k<64;k++)
{
LCD_WriteData(0x00,i,k);
}
else if(Side_Num==R)
for(k=64;k<128;k++)
{
LCD_WriteData(0x00,i,k);
}
}
}
/*---------------------------------------------------------------------------
初始化
---------------------------------------------------------------------------*/
void LCD_Initial(void)
{
LCD_WriteCommand(DISPOFF,L); /*顯示關*/
LCD_WriteCommand(DISPOFF,R);
Delay_us(1);
LCD_WriteCommand(DISPON,L); /*顯示開*/
LCD_WriteCommand(DISPON,R);
LCD_WriteCommand(DISPFIRST,L); /*起始行*/
LCD_WriteCommand(DISPFIRST,R);
LCD_CLR(L);
LCD_CLR(R);
}
/*---------------------------------------------------------------------------
輸出全屏圖片: 128*64
---------------------------------------------------------------------------*/
/*
void put_picture(uchar* pictureName)//128*64
{
uchar i,j;
uint x;
for(j=0;j<8;j++)
{
x=j*128;
for(i=0;i<128;i++)
{
cbyte=*(pictureName+x);
LCD_WriteData(cbyte,j,i);
x++;
}
}
}
*/
/*---------------------------------------------------------------------------
輸出半屏圖片: 64*64
---------------------------------------------------------------------------*/
void put_picture_half(uchar* pictureName,uchar Side_Num)//64*64
{
uchar i,j;
uint x;
for(j=0;j<8;j++)
{
x=j*64;
if(Side_Num==L)
{
for(i=0;i<64;i++)
{
cbyte=*(pictureName+x);
LCD_WriteData(cbyte,j,i);
x++;
}
}
else if(Side_Num==R)
{
for(i=64;i<128;i++)
{
cbyte=*(pictureName+x);
LCD_WriteData(cbyte,j,i);
x++;
}
}
}
}
/*---------------------------------------------------------------------------
輸出英文和數字:8*8
---------------------------------------------------------------------------*/
/*
void put_char(uchar* Data, uchar hang, uchar lie,uchar reverse)//8*8
{
uchar i;
uint x;
x=0;
for(i=0;i<8;i++)
{
if(reverse) cbyte=~(*(Data+x));
else cbyte=*(Data+x);
LCD_WriteData(cbyte,hang,lie);
x++;
lie++;
}
}*/
/*---------------------------------------------------------------------------
輸出漢字: 16*16
---------------------------------------------------------------------------*/
void put_chinese(uchar* Data, uchar hang, uchar lie,uchar reverse)//16*16
{
uchar i,j,lie0;
uint x;
x=0;
lie0=lie;
for(j=0;j<2;j++)
{
for(i=0;i<16;i++)
{
if(reverse) cbyte=~(*(Data+x));
else cbyte=*(Data+x);
LCD_WriteData(cbyte,hang,lie);
x++;
lie++;
}
lie=lie0;
hang++;
}
}
/*---------------------------------------------------------------------------
輸出數字和字母: 16*8
---------------------------------------------------------------------------*/
void put_num(uchar* Data, uchar hang, uchar lie,uchar reverse)//16*16
{
uchar i,j,lie0;
uint x;
x=0;
lie0=lie;
for(j=0;j<2;j++)
{
for(i=0;i<8;i++)
{
if(reverse) cbyte=~(*(Data+x));
else cbyte=*(Data+x);
LCD_WriteData(cbyte,hang,lie);
x++;
lie++;
}
lie=lie0;
hang++;
}
}
//===================================================
// 屏幕向上移動 有問題 ????
//===================================================
/*void MoveUp()
{
uint hang;
uchar lie;
//uchar hang2;
for(hang=0;hang<8;hang++)
{
for(lie=0;lie<128;lie++)
{
uchar buf;
//uchar lie2=lie+1;
buf =LCD_ReadData(hang,lie);
//if(hang==0)
//continue ;
//else
// hang2=hang-1;
LCD_WriteData(buf,hang,lie);
}
Delay_us(1000);
}
}*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -