📄 lcd_0108.c
字号:
#include "LCD.H"
#define DefaultRow 0xc0
#define DefaultColumn 0x40
#define DefaultPage 0xb8
#define uchar unsigned char
#define uint unsigned int
uchar Dis_Buf[1024];
uchar AREA=1;
uchar error_flag=0;
//////////////////底层函数////////////////////////////////////////////////////////////////
/*************************************************/
/* LCD初始化函数 */
/*************************************************/
void InitialLcd(void)
{
MCUCR |= (1<<SRE); //使能总线
//XMCRA |= (1<<SRW00)|(1<<SRW01);//加入等待
SET_RST_OUTPUT(); //设RST为输出
SET_CSA_OUTPUT(); //设CSA为输出
SET_CSB_OUTPUT(); //设CSB为输出
SET_CSA(); //设置CSA CSB为无效状态
SET_CSB();
CLR_RST(); //拉地RST复位
LCDDelay(255); //延时
SET_RST(); //拉高
LCDDelay(255); //延时
ShowLcd(0x00); //关显示
ClearDisBuf(0x00); //清屏
UpdateDis();
LocateLcdPageColumn(0x00,0x00);//定位显示点
ShowLcd(0x01 ); //开显示
}
/*************************************************/
/* 判忙函数 出错由全局变量error_flag带出 */
/*************************************************/
void BusyOrNot()
{
uchar _data,i=0;
while(1)
{
_data = CMD_READ; //读命令状态
_data=0x90 & _data;
if(_data==0x00) break;//比较
if(i++==255){error_flag=1;return;}//超时错误
}
}
/*************************************************/
/* 向右区写命令 */
/*************************************************/
void WriteCommandToRightArea(uchar Command)
{
CLR_CSB(); //选中右区
BusyOrNot(); //判忙
CMD_WRITE = Command;//写命令
SET_CSB(); //释放右区
}
/*************************************************/
/* 向右区写数据 */
/*************************************************/
void WriteDataToRightArea(uchar _Data)
{
CLR_CSB(); //选中右区
BusyOrNot(); //判忙
DAT_WRITE = _Data; //写数据
SET_CSB(); //释放右区
}
/*************************************************/
/* 向左区写命令 */
/*************************************************/
void WriteCommandToLeftArea(uchar Command)
{
CLR_CSA(); //选中右区
BusyOrNot(); //判忙
CMD_WRITE = Command;//写命令
SET_CSA(); //释放右区
}
/*************************************************/
/* 向左区写数据 */
/*************************************************/
void WriteDataToLeftArea(uchar _Data)
{
CLR_CSA(); //选中右区
BusyOrNot(); //判忙
DAT_WRITE = _Data; //写数据
SET_CSA(); //释放右区
}
/*************************************************/
/* 清LCD屏 */
/*************************************************/
void ClearDisBuf(uchar val)
{
uint i;
for(i=0;i<1024;i++)Dis_Buf[i]=val;
}
/*************************************************/
/* 更新显示 */
/*************************************************/
void UpdateDis(void)
{
uchar Page,Column;
uchar *p = Dis_Buf;
for(Page=0,Column=0;Page<8;Page++)
{
LocateLcdPageColumn(Page,Column);//定位右区页和列
for(Column=0;Column<64;Column++)WriteDataToRightArea(*p++);//写右区
LocateLcdPageColumn(Page,Column);//定位左区页和列
for(Column=64;Column<128;Column++)WriteDataToLeftArea(*p++);//写左区
}
LocateLcdPageColumn(0x00,0x00);//定位显示点
ShowLcd(0x01 ); //开显示
}
/*************************************************/
/* 开关LCD显示 */
/*************************************************/
void ShowLcd(uchar on)//LCD的显示开关,on=0x00,关;on=0x01,开.
{
uchar temp;
temp=0x3E; //00111110B
temp+=on;
WriteCommandToRightArea(temp);
WriteCommandToLeftArea(temp);
}
//定位列
void LocateLcdColumn(uchar Column)
{
uchar temp;
temp = DefaultColumn;//01000000B
temp += Column;
if(Column>63)
{
temp -= 64; //为数据写入指示右区
WriteCommandToLeftArea(temp); //定位右区列
}
else WriteCommandToRightArea(temp);//定位左区列
}
//定位页
void LocateLcdPage(uchar Page)
{
uchar temp;
temp=DefaultPage; //10111000B;
temp+=Page;
WriteCommandToRightArea(temp);
WriteCommandToLeftArea(temp);
}
//定位页列
void LocateLcdPageColumn(uchar Page,uchar Column)
{
LocateLcdPage(Page);
LocateLcdColumn(Column);
}
////////////////以上为底层函数///////////////////////////////////////////////////////////////
/*************************************************/
/* 填充一个像素数据 x,y为坐标 val为0或1 */
/*************************************************/
void OnePixel(uchar x,uchar y,uchar val)
{
uchar *p = &Dis_Buf[ ((y>>3)<<7) + x ];//找到对应字节
if(val)*p |= (1<<(y%8)); //修改对应位
else *p &= ~(1<<(y%8));
}
unsigned char ReadPixel(uchar x,uchar y)
{
uchar *p = &Dis_Buf[ ((y>>3)<<7) + x ];//找到对应字节
if(*p & (1<<(y%8)))return 1;
else return 0;
}
void LCDDelay(uint n)
{
while(n--)asm("nop;");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -