📄 lcd.c.bak
字号:
/*************************************
* 控制器: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;
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 CLR(uchar hang,uchar lie)
/*---------------------------------------------------------------------------
初始化
---------------------------------------------------------------------------*/
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++;
}
}
//===================================================
// 屏幕向上移动
//===================================================
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 + -