8080并口协议驱动解析(以中景园为例)

本文深入探讨8080并口协议,并结合中景园设备,详细解析其驱动实现过程。针对树莓派、STM32及ARM平台,阐述如何进行硬件接口连接和软件编程,帮助读者理解并应用8080并口协议。
摘要由CSDN通过智能技术生成
#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
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值