#include "lcd.h"
#include "stdlib.h"
#include "lcdfont.h"
#include "usart.h"
#include "delay.h"
//管理LCD重要参数
//默认为竖屏
_lcd_dev lcddev;
//写寄存器函数
//regval:寄存器值
void LCD_WR_REG(u16 reg)
{
#if LCD_USE8BIT_MODEL==1//使用8位并行数据总线模式
LCD_RS_CLR;
LCD_CS_CLR;
DATAOUT(reg);
LCD_WR_CLR;
LCD_WR_SET;
LCD_CS_SET;
LCD_RS_SET;
#else //使用16位并行数据总线模式
LCD_RS_CLR;
LCD_CS_CLR;
DATAOUT(reg);
LCD_WR_CLR;
LCD_WR_SET;
LCD_RS_SET;
LCD_CS_SET;
#endif
}
//写LCD数据
//data:要写入的值
void LCD_WR_data(u16 data)
{
#if LCD_USE8BIT_MODEL==1//使用8位并行数据总线模式
LCD_CS_CLR;
DATAOUT(data);
LCD_WR_CLR;
LCD_WR_SET;
LCD_CS_SET;
#else //使用16位并行数据总线模式
LCD_CS_CLR;
DATAOUT(data);
LCD_WR_CLR;
LCD_WR_SET;
LCD_CS_SET;
#endif
}
//写LCD数据
//data:要写入的值
void LCD_WR_DATA(u16 data)
{
#if LCD_USE8BIT_MODEL==1//使用8位并行数据总线模式
LCD_CS_CLR;
DATAOUT(data>>8);
LCD_WR_CLR;
LCD_WR_SET;
DATAOUT(data);
LCD_WR_CLR;
LCD_WR_SET;
LCD_CS_SET;
#else //使用16位并行数据总线模式
LCD_CS_CLR;
DATAOUT(data);
LCD_WR_CLR;
LCD_WR_SET;
LCD_CS_SET;
#endif
}
//读LCD数据
//返回值:读到的值
u16 LCD_RD_DATA(void)
{
u16 data=0,data0=0;
LCD_DATA_IN();
#if LCD_USE8BIT_MODEL==1//使用8位并行数据总线模式
LCD_CS_CLR;
LCD_RD_CLR;
data=DATAIN;
LCD_RD_SET;
LCD_RD_CLR;
data0=DATAIN;
LCD_RD_SET;
LCD_CS_SET;
data&=0xff;
data=data0|data<<8;
#else //使用16位并行数据总线模式
LCD_CS_CLR;
LCD_RD_CLR;
data=DATAIN;
LCD_RD_SET;
LCD_CS_SET;
#endif
LCD_DATA_OUT();
return data;
}
/******************************************************************************
函数说明:设置起始和结束地址
入口数据:x1,x2 设置列的起始和结束地址
y1,y2 设置行的起始和结束地址
返回值: 无
******************************************************************************/
void LCD_Address_Set(u16 x1,u16 y1,u16 x2,u16 y2)
{
LCD_WR_REG(0x2a);//列地址设置
LCD_WR_data(x1>>8);
LCD_WR_data(x1&0xff);
LCD_WR_data(x2>>8);
LCD_WR_data(x2&0xff);
LCD_WR_REG(0x2b);//行地址设置
LCD_WR_data(y1>>8);
LCD_WR_data(y1&0xff);
LCD_WR_data(y2>>8);
LCD_WR_data(y2&0xff);
LCD_WR_REG(0x2c);//储存器写
}
/******************************************************************************
函数说明:设置光标位置
入口数据:x,y 光标位置
返回值: 无
******************************************************************************/
void LCD_SetCursor(u16 x,u16 y)
{
LCD_WR_REG(0x2a);//列地址设置
LCD_WR_data(x>>8);
LCD_WR_data(x&0xff);
LCD_WR_REG(0x2b);//行地址设置
LCD_WR_data(y>>8);
LCD_WR_data(y&0xff);
}
//LCD开启显示
void LCD_DisplayOn(void)
{
LCD_WR_REG(0X29); //开启显示
}
//LCD关闭显示
void LCD_DisplayOff(void)
{
LCD_WR_REG(0X28); //关闭显示
}
//读取个某点的颜色值
//x,y:坐标
//返回值:此点的颜色
u16 LCD_ReadPoint(u16 x,u16 y)
{
u16 rgb;
LCD_SetCursor(x,y);
LCD_WR_REG(0X2E);
#if LCD_USE8BIT_MODEL==1//使用8位并行数据总线模式
LCD_DATA_IN();
LCD_RS_SET;
LCD_CS_CLR;
LCD_RD_CLR;
rgb=DATAIN;
LCD_RD_SET;
LCD_RD_CLR;
#else //使用16位并行数据总线模式
rgb=LCD_RD_DATA();//dummy read
#endif
rgb=LCD_RD_DATA();//实际坐标颜色
return rgb;
}
void LCD_Clear(u16 color)
{
u16 i,j;
LCD_Address_Set(0,0,lcddev.width-1,lcddev.height-1);//设置显示范围
for(i=0;i<lcddev.width;i++)
{
for(j=0;j<lcddev.height;j++)
{
LCD_WR_DATA(color);
}
}
}
/******************************************************************************
函数说明:在指定区域填充颜色
入口数据:xsta,ysta 起始坐标
xend,yend 终止坐标
color 要填充的颜色
返回值: 无
******************************************************************************/
void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color)
{
u16 i,j;
LCD_Address_Set(xsta,ysta,xend-1,yend-1);//设置显示范围
for(i=ysta;i<yend;i++)
{
for(j=xsta;j<xend;j++)
{
LCD_WR_DATA(color);
}
}
}
/******************************************************************************
函数说明:在指定位置画点
入口数据:x,y 画点坐标
color 点的颜色
返回值: 无
******************************************************************************/
void LCD_DrawPoint(u16 x,u16 y,u16 color)
{
LCD_Address_Set(x,y,x,y);//设置光标位置
LCD_WR_DATA(color);
}
/******************************************************************************
函数说明:画线
入口数据:x1,y1 起始坐标
x2,y2 终止坐标
color 线的颜色
返回值: 无
******************************************************************************/
void LCD_DrawLine(u16 x1,u16 y1,u16 x2,u16 y2,u16 color)
{
u16 t;
int xerr=0,yerr=0,delta_x,delta_y,distance;
int incx,incy,uRow,uCol;
delta_x=x2-x1; //计算坐标增量
delta_y=y2-y1;
uRow=x1;//画线起点坐标
uCol=y1;
if(delta_x>0)incx=1; //设置单步方向
else if (delta_x==0)incx=0;//垂直线
else {
incx=-1;delta_x=-delta_x;}
if
8080并口协议驱动解析(以中景园为例)
最新推荐文章于 2024-06-28 20:54:44 发布
本文深入探讨8080并口协议,并结合中景园设备,详细解析其驱动实现过程。针对树莓派、STM32及ARM平台,阐述如何进行硬件接口连接和软件编程,帮助读者理解并应用8080并口协议。
摘要由CSDN通过智能技术生成