📄 fm12864_dreiver_for_parallel.c
字号:
/**********************************************************
* Copyright (C) 2007, 华中科技大学电工与电子科技创新中心*
* All Rights Reserved. *
* *
* 文件名: FM12864_driver_for_Parallel.c *
* 文件描述: 128*64点阵式液晶驱动主文件 *
* *
* 当前版本: 3.1 *
* 作者: Zeng Kevin(huakekaiwen@163.com) *
* 完成日期: 2007年8月8日下午 *
*********************************************************/
#include<FM12864.h>
/***************************************
说明: LCD读函数,完成LCD读操作的物理时序
RS: 0 - 读出忙标志及地址计数器的状态
1 - 从数据寄存器DR 读出指令
return: 读出的具体值
*****************************************/
unsigned char LcdRead(bit RS)
{
unsigned char rt ;
/* 1. 设置RS信号线 */
Lcd_RS = RS ;
/* 2. 设置RW信号线为读 */
Lcd_RW = 1 ;
/* 3. 释放Data口 */
Data = 0xff ;
/* 4. 设置LCD使能*/
LCD_E=1;
_nop_();
/* 5. 通过Data端口读值 */
rt = Data ;
/* 6. 锁存 */
LCD_E=0;
return rt ;
}
/***************************************
说明: LCD写函数,完成LCD写操作的物理时序
value: 写的具体值
RS: 0 - 写指令到指令寄存器IR
1 - 写指令到数据寄存器DR
*****************************************/
void LcdWrite(unsigned char value , bit RS)
{
/* 1. 设置RS信号线 */
Lcd_RS = RS ;
/* 2. 设置RW信号线为读 */
Lcd_RW = 0 ;
/* 3. 通过Data端口写值 */
Data = value ;
LCD_E=1;
_nop_();
_nop_();
LCD_E=0;
}/***************************************
说明: LCD写指令
value: 写的具体值
***************************************/
void LcdWriteCmd(unsigned char value)
{
/* 监测忙状态 */
while( LcdRead(0)&0x80 ) ;
LcdWrite(value , 0);
}
/***************************************
说明: LCD写数据
*****************************************/
void LcdWriteData(unsigned char value)
{
/* 监测忙状态 */
while( LcdRead(0)&0x80 ) ;
LcdWrite(value , 1);
}
/***************************************
说明: LCD读数据
*****************************************/
unsigned char LcdReadData()
{
/* 监测忙状态 */
while( LcdRead(0)&0x80 ) ;
return LcdRead(1);
}
/***************************************
说明: 超短延时,150us
*****************************************/
void Delay150us(void)
{
unsigned int i = 150;
while(i--);
}
/***************************************
说明: 短延时, 5ms
*****************************************/
void Delay5Ms(void)
{
unsigned int i = 5552;
while(i--);
}
/***************************************
说明: 可控延时 , (5*time)ms
*****************************************/
void Delay5_time_Ms(unsigned char time)
{
unsigned char i;
i=time;
while(i--)
Delay5Ms();
}
/***************************************
说明: LCD初始化函数,需要按照产品
说明书完成
*****************************************/
void LcdInit(void)
{/*延时>40ms,此处延时50ms*/
Delay5_time_Ms(10);
/*功能设定,控制字 30H,即设定8位MCU并行接口,选择基本功能*/
Function_1();
/*延时>100us,此处延时150us*/
Delay150us();
/*功能设定,控制字 30H,即设定8位MCU并行接口,选择基本功能*/
Function_1();
/*延时>37us,此处延时150us*/
Delay150us();
/*显示开/关,控制字0CH,即,整体显示开*/
Display_open();
/*延时>100us,此处延时150us*/
Delay150us();
/*清除屏幕控制字01H*/
Screen_clear();
/*延时>10ms,此处延时15ms*/
Delay5_time_Ms(3);
/*进入设定点控制字06H,即指定在显示数据的读取与写入
时,游标的移动方向右移,DDRAM 地址计数器(AC)加1*/
Cursor_move_right();
}
/*******************************
说明:设定字符的输入位置(x,y)
*******************************/
void Locate_CH_XY(unchar x , unchar y)
{unchar adress;
/*共4行,每行只能显示8个字符,故x<8,y<4*/
/*只取x的低3位,高5位无效,屏蔽*/
x%=0x8;
/*只取y的低2位,屏蔽高6位*/
y%=0x4;
/*当y=0,2时,adress=80H+4*y+x*/
/*当y=1,3时,adress=90H+4*(y-1)+x*/
adress=x+4*y;
if(y%2)
adress+=0x0c;
adress|=0x80;
/*写(x,y)的地址*/
LcdWriteCmd(adress);
}
/*******************************
说明:设定绘图的输入位置(x,y)
*******************************/
void Locate_Draw_XY(unchar x , unchar y)
{//选择扩展功能
Function_2();
//只取x的低3位,高5位无效,屏蔽
x&=0x7;
//Y方向有64个点,故Y<64
y&=0x3F;
if(y>31)
{y=y-32;
x=x+0x08;
}
x|=0x80;
y|=0x80;
//写Y的地址
LcdWriteCmd(y);
//写X的地址
LcdWriteCmd(x);
//选择基本功能
Function_1();
}
/*******************************
说明:画直角坐标系
x:圆心横坐标
y:圆心纵坐标
*******************************/
void Polt_coordinate_XY(unchar x , unchar y)
{unchar i;
Clear_GDRAM();
for(i=0;i<64;i++)
{Locate_Draw_XY(x,i);
LcdWriteData(0x80);
LcdWriteData(0x00);
}
Locate_Draw_XY(0,y);
for(i=0;i<16;i++)
LcdWriteData(0xFF);
for(i=1;i<5;i++)
{Locate_Draw_XY(7,y+i);
LcdWriteData(0x00);
LcdWriteData(1<<i);
Locate_Draw_XY(7,y-i);
LcdWriteData(0x00);
LcdWriteData(1<<i);
}
for(i=1;i<5;i++)
{Locate_Draw_XY(x-1,i);
LcdWriteData(0x00);
LcdWriteData(1<<(i-1));
Locate_Draw_XY(x,i);
LcdWriteData(0x80|(0x80>>i));
LcdWriteData(0x00);
}
}
/***************************************
说明: 图像RAM清零
/***************************************/
void Clear_GDRAM(void)
{unchar i,j;
for(i=0;i<64;i++)
{Locate_Draw_XY(0,i);
for(j=0;j<16;j++)
LcdWriteData(0x00);
}
}
/***************************************
说明: 显示字符串
x: 起始横 坐标
y: 起始纵坐标
speed: 字符显示速度,推荐值为2
*****************************************/
void Put_Str(unchar x , unchar y , unchar* str,unchar speed)
{ unsigned char i,temp_x,temp_y;
unint len=0;
temp_x=2*x;
temp_y=y;
/* 计算字符串长度 */
while (str[len]!='\0')
len++;
Locate_CH_XY(x,y);
/* 显示字符串 */
for (i=0;i<len;i++)
{if(temp_x>15)
{temp_x=0;
temp_y++;
if(temp_y<4)
Locate_CH_XY(0,temp_y);
else
break;
}
LcdWriteData(str[i]);
Delay5_time_Ms(speed);
temp_x++;
}
}
/********************************************
说明: 在全屏显示图片
*********************************************/
void Plot(unchar* str)
{unchar temp_x,temp_y;
unint i=0;
for(temp_y=0;temp_y<64;temp_y++)
{Locate_Draw_XY(0,temp_y);
for(temp_x=0;temp_x<16;temp_x++)
{LcdWriteData(str[i]);
i++;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -