ADI Blackfin DSP处理器-BF533的开发详解29:TOUCH_LINE(屏幕画线)(含源代码)

news2024/9/22 5:32:54

硬件准备

ADSP-EDU-BF533:BF533开发板
AD-HP530ICE:ADI DSP仿真器

软件准备

Visual DSP++软件

硬件链接

在这里插入图片描述

硬件设计原理图

在这里插入图片描述

功能介绍

代码实现了读取触摸屏坐标,并将触摸屏坐标换算为液晶屏的显示坐标,将像素点显示到触摸坐标的位置,实现了通过触摸屏在液晶屏上进行简单的线条绘画。

代码设置了防触摸屏坐标误触发机制,通过算法尽量减少触摸屏野点。使触发坐标更准确。

运行代码,通过用手指或者其他光滑的物体在液晶屏上划动,可以看到液晶屏上显示出划动的轨迹。

代码使用说明

触摸屏野点算法:

为确保触摸屏显示坐标准确,通常采用野点处理算法,代码中每次采取 9 个坐标点,然后对其取平均值和差值,排除偏离实际坐标较大的坐标值,将准确的坐标输出。

触摸屏坐标与液晶屏坐标换算:
X 坐标换算: tem_x = (tem_x-0xb0)*100/763;
Y 坐标换算: tem_y = (tem_y-0x150) *100/1288;

如感觉坐标定位不准确,可适当修改上面的换算参数值。

在指定坐标显示一个点:
因液晶屏最终显示的数据格式为 RGB565,所以显示点的数据为 16bit ,由两个 8bit 的数据分别送入。
void play_point(unsigned int x,unsigned int y,unsigned char pdispbuf)
{
pdispbuf[2
x+0+y960] = 0xff ;
pdispbuf[2
x+1+y*960] = 0xff;
}

代码调试步骤

  1. 编译并运行代码
  2. 用手指在液晶屏上划动
  3. 观察液晶屏显示
  4. 液晶屏上会显示出手指划动的轨迹。

程序源码

#include <cdefBF533.h>

extern DisplayBuffer[][];
extern unsigned char DisplayBuffer_565[272][1440] ;

void SPIinit(void)
{

*pSPI_BAUD=10; 
*pSPI_FLG |=FLS2;  	
*pSPI_CTL = 0x1001|CPHA| CPOL;
*pSPI_CTL = (*pSPI_CTL | SPE);		

}

unsigned char spi_byte_rw(unsigned char value)
{
unsigned char incoming=0;
while(!(*pSPI_STAT & SPIF));
*pSPI_TDBR = value;
while(*pSPI_STAT & RXS)
incoming = *pSPI_RDBR;
return(incoming);
}

int read_y(void)
{
int y_dat = 0;
int temp = 0;
delay(0xff);
*pSPI_FLG &= ~FLG2;
delay(0xff);
spi_byte_rw(0x90);
delay(0xff);
spi_byte_rw(0x00);
y_dat = (spi_byte_rw(0x00)&0xff)<<1;
temp = (spi_byte_rw(0x00)&0xff)<<1;
y_dat = (y_dat<<8)|temp;
y_dat >>=4;
*pSPI_FLG |= FLG2;
delay(0xff);

return y_dat;

}

int read_x(void)
{
int x_dat = 0;
int temp = 0;
delay(0xff);
*pSPI_FLG &= ~FLG2;
delay(0xff);
spi_byte_rw(0xd4);
delay(0xff);
spi_byte_rw(0x00);
x_dat = (spi_byte_rw(0x00)&0xff)<<1;
temp = (spi_byte_rw(0x00)&0xff)<<1;
x_dat = (x_dat<<8)|temp;
x_dat>>=4;
*pSPI_FLG |= FLG2;
delay(0xff);

return x_dat;	

}

#include <cdefBF533.h>

section(“sdram0_bank1”) unsigned char DisplayBuffer[272][1440] ;
section(“sdram0_bank1”) unsigned char DisplayBuffer_565[272][1440] ;
section(“sdram0_bank1”) unsigned char TempBuffer_img[272][1440] ;
section(“sdram0_bank1”) unsigned char Inputdata[391734];

void InitDMA(void)
{
int addr;
addr = &DisplayBuffer_565;
addr -= 1920;
*pDMA0_START_ADDR = addr;

*pDMA0_X_COUNT = 480;
*pDMA0_X_MODIFY = 2;
*pDMA0_Y_COUNT = 286;
*pDMA0_Y_MODIFY = 2;	
*pDMA0_CONFIG = 0x1034;

}

void InitPPI(void)
{
*pPPI_CONTROL = 0x781e;
*pPPI_DELAY = 0;
*pPPI_COUNT = 479;
*pPPI_FRAME = 286;
}

void InitTimer(void)
{
*pTIMER1_PERIOD = 525;
*pTIMER1_WIDTH = 41;
*pTIMER1_CONFIG = 0x00a9;
*pTIMER2_PERIOD = 150150;
*pTIMER2_WIDTH = 5250;
*pTIMER2_CONFIG = 0x00a9;
}

void PPI_TMR_DMA_Enable(void)
{
*pDMA0_CONFIG |= 0x1;
asm(“ssync;”);
InitTimer();
*pPPI_CONTROL |= 0x1;
asm(“ssync;”);
*pTIMER_ENABLE|= 0x0006;
asm(“ssync;”);
}

void PPI_TMR_DMAR_Disable(void)
{
*pDMA0_CONFIG &= (~0x1);
*pPPI_CONTROL &= (~0x1);
}

void bgrtorgb24(void)
{
int i,j;
int a,b,c;
for(i=0;i<272;i++)
{
for(j=0;j<1440;j++)
{
TempBuffer_img[i][j] = Inputdata[i1440+j+54];
}
}
for(i=0;i<272;i++)
{
for(j=0;j<480;j++)
{
a = TempBuffer_img[i][j
3];
b = TempBuffer_img[i][j3+1];
c = TempBuffer_img[i][j
3+2];
TempBuffer_img[i][j3] = c;
TempBuffer_img[i][j
3+1] = b;
TempBuffer_img[i][j*3+2] = a;
}
}

for(i=0;i<272;i++)
{
	for(j=0;j<1440;j++)
	{
		DisplayBuffer[i][j] = (TempBuffer_img[271-i][j]); 
	}
}

}

void color_bar(void)
{
int i,j;

	for(i=0;i<272;i++)
{
	for(j=0;j<40;j++)
		{
			DisplayBuffer[i][j*3+0] = 0x00;
			DisplayBuffer[i][j*3+1] = 0x00;
			DisplayBuffer[i][j*3+2] = 0x00;
		}
	for(j=40;j<80;j++)
		{
			DisplayBuffer[i][j*3+0] = 0xff;
            DisplayBuffer[i][j*3+1] = 0x00;                                                                                                                                                                                                                                                                                               				DisplayBuffer[i][j*3+1] = 0x00;
			DisplayBuffer[i][j*3+2] = 0x00;//red
		}
	for(j=80;j<120;j++)
		{
			DisplayBuffer[i][j*3+0] = 0x00;
			DisplayBuffer[i][j*3+1] = 0xff;
			DisplayBuffer[i][j*3+2] = 0x00;//green
		}
	for(j=120;j<160;j++)
		{
			DisplayBuffer[i][j*3+0] = 0x00;
			DisplayBuffer[i][j*3+1] = 0x00;
			DisplayBuffer[i][j*3+2] = 0xff;//blue
		}
	for(j=160;j<200;j++)
		{
			DisplayBuffer[i][j*3+0] = 0xff;
			DisplayBuffer[i][j*3+1] = 0xff;
			DisplayBuffer[i][j*3+2] = 0x0;//red+green
		}
	for(j=200;j<240;j++)
		{
			DisplayBuffer[i][j*3+0] = 0x00;
			DisplayBuffer[i][j*3+1] = 0xff;
			DisplayBuffer[i][j*3+2] = 0xff;//red+blue
		}
	for(j=240;j<280;j++)
		{
			DisplayBuffer[i][j*3+0] = 0xff;
			DisplayBuffer[i][j*3+1] = 0x00;
			DisplayBuffer[i][j*3+2] = 0xff;//green+blue
		}
	for(j=280;j<320;j++)
		{
			DisplayBuffer[i][j*3+0] = 0xff;
			DisplayBuffer[i][j*3+1] = 0xff;
			DisplayBuffer[i][j*3+2] = 0xff;
		}
		
	for(j=320;j<360;j++)
		{
			DisplayBuffer[i][j*3+0] = 0x00;
			DisplayBuffer[i][j*3+1] = 0xff;
			DisplayBuffer[i][j*3+2] = 0x00;//green
		}
	for(j=360;j<400;j++)
		{
			DisplayBuffer[i][j*3+0] = 0x00;
			DisplayBuffer[i][j*3+1] = 0x00;
			DisplayBuffer[i][j*3+2] = 0xff;//blue
		}
	for(j=400;j<440;j++)
		{
			DisplayBuffer[i][j*3+0] = 0xff;
			DisplayBuffer[i][j*3+1] = 0xff;
			DisplayBuffer[i][j*3+2] = 0x0;//red+green
		}
	for(j=440;j<480;j++)
		{
			DisplayBuffer[i][j*3+0] = 0x00;
			DisplayBuffer[i][j*3+1] = 0xff;
			DisplayBuffer[i][j*3+2] = 0xff;//red+blue
		}
	}		

}

void RGB888_RGB565(unsigned char *src, int src_len, unsigned char *dst)
{

int i = 0;
int j = 0;

if (src_len % 3 != 0)
{
    return;
}
for (i = 0; i < src_len; i += 3)
{
     dst[j+1] = src[i+2] &0xf8; //B 
     dst[j+1] |= ((src[i+1]>>5) & 0x07);//GH
     dst[j] = ((src[i+1]<<3) & 0xe0);  //GL  
     dst[j] |= ((src[i]>>3) &0x1f); 	//r
    j += 2;  
    
}

}

unsigned char palette[3]={0xff,0xff,0x00};

void play_point(unsigned int x,unsigned int y,unsigned char pdispbuf)
{
pdispbuf[2
x+0+y960] = 0xff ;
pdispbuf[2
x+1+y*960] = 0xff;
}

void osd(unsigned int x,unsigned int y,unsigned char *pdispbuf)
{
int i,j,k;
unsigned char temp;
if(x > 479)
x = 479;
if(y > 271)
y = 271;
play_point(x,y,pdispbuf);

}

#include <cdefBF533.h>

void Set_PLL(int pmsel,int pssel)
{
int new_PLL_CTL;
*pPLL_DIV = pssel;
asm(“ssync;”);
new_PLL_CTL = (pmsel & 0x3f) << 9;
*pSIC_IWR |= 0xffffffff;
if (new_PLL_CTL != *pPLL_CTL)
{
*pPLL_CTL = new_PLL_CTL;
asm(“ssync;”);
asm(“idle;”);
}
}

void Init_SDRAM(void)
{
*pEBIU_SDRRC = 0x00000817;
*pEBIU_SDBCTL = 0x00000013;
*pEBIU_SDGCTL = 0x0091998d;
ssync();
}

void Init_EBIU(void)
{
*pEBIU_AMBCTL0 = 0x7bb07bb0;
*pEBIU_AMBCTL1 = 0x7bb07bb0;
*pEBIU_AMGCTL = 0x000f;
}

void Init_Timers0(int dat)
{
*pTIMER0_CONFIG = 0x0019;
*pTIMER0_WIDTH = dat;
*pTIMER0_PERIOD = 2000;
}

void Enable_Timers0(void)
{
*pTIMER_ENABLE|= 0x0001;
asm(“ssync;”);
}

void Disable_Timers0(void)
{
*pTIMER_DISABLE |= 0x0001;
}

void delay(unsigned int tem)
{
int i;
for(i=0;i<tem;i++)
asm(“nop;”);
}

#include <cdefBF533.h>

extern unsigned char DisplayBuffer[272][1440] ;
unsigned char DisplayBuffer_temp[272][1440] ;
extern unsigned char DisplayBuffer_565[272][960] ;
unsigned short ptx[9];
unsigned short pty[9];
unsigned short pax[3];
unsigned short pay[3];
extern unsigned char Inputdata[];

void main(void)
{
int i;
unsigned int tem_x = 0,tem_y=0;
signed short dlXDiff0,dlXDiff1,dlXDiff2;
signed short dlYDiff0,dlYDiff1,dlYDiff2;

Set_PLL(16,4);
Init_EBIU();
Init_SDRAM();

LCDBK_Disable();	
SPIinit();
InitDMA();
InitPPI();
InitTimer();
PPI_TMR_DMA_Enable();
Init_Timers0(1999);//1~1999 控制背光亮度
Enable_Timers0();
LCD_Enable();	
LCDBK_Enable();


while(1)
{
	for(i=0;i<9;i++)
	{
		ptx[i] = read_x();
		pty[i] = read_y();
	}

	pax[0]=(ptx[0]+ptx[1]+ptx[2])/3;
	pax[1]=(ptx[3]+ptx[4]+ptx[5])/3;
	pax[2]=(ptx[6]+ptx[7]+ptx[8])/3;

	dlXDiff0 = pax[ 0 ] - pax[ 1 ];
	dlXDiff1 = pax[ 1 ] - pax[ 2 ];
	dlXDiff2 = pax[ 2 ] - pax[ 0 ];

	dlXDiff0 = dlXDiff0 > 0 ? dlXDiff0 : -dlXDiff0;
	dlXDiff1 = dlXDiff1 > 0 ? dlXDiff1 : -dlXDiff1;
	dlXDiff2 = dlXDiff2 > 0 ? dlXDiff2 : -dlXDiff2;

	if ( dlXDiff0 < dlXDiff1 )
	{
		if ( dlXDiff2 < dlXDiff0 )
		{
			tem_x = ( ( pax[ 0 ] + pax[ 2 ] ) >> 1 ) ;
		}
		else
		{
			tem_x = ( ( pax[ 0 ] + pax[ 1 ] ) >> 1 );
		}
	}
	else if ( dlXDiff2 < dlXDiff1 )
	{
		tem_x = ( ( pax[ 0 ] + pax[ 2 ] ) >> 1 ) ;
	}
	else
	{
		tem_x= ( ( pax[ 1 ] + pax[ 2 ] ) >> 1 ) ;
	}

	pay[0]=(pty[0]+pty[1]+pty[2])/3;
	pay[1]=(pty[3]+pty[4]+pty[5])/3;
	pay[2]=(pty[6]+pty[7]+pty[8])/3;

	dlYDiff0 = pay[ 0 ] - pay[ 1 ];
	dlYDiff1 = pay[ 1 ] - pay[ 2 ];
	dlYDiff2 = pay[ 2 ] - pay[ 0 ];

	dlYDiff0 = dlYDiff0 > 0 ? dlYDiff0 : -dlYDiff0;
	dlYDiff1 = dlYDiff1 > 0 ? dlYDiff1 : -dlYDiff1;
	dlYDiff2 = dlYDiff2 > 0 ? dlYDiff2 : -dlYDiff2;

	if ( dlYDiff0 < dlYDiff1 )
	{
		if ( dlYDiff2 < dlYDiff0 )
		{
			tem_y = ( ( pay[ 0 ] + pay[ 2 ] ) >> 1 ) ;
		}
		else
		{
			tem_y = ( ( pay[ 0 ] + pay[ 1 ] ) >> 1 );
		}
	}
	else if ( dlYDiff2 < dlYDiff1 )
	{
		tem_y = ( ( pay[ 0 ] + pay[ 2 ] ) >> 1 ) ;
	}
	else
	{
		tem_y= ( ( pay[ 1 ] + pay[ 2 ] ) >> 1 ) ;
	}
	
	if(tem_x!=0)
		tem_x = (tem_x-0xb0)*100/763; 
	if(tem_y!=0xfff)
		tem_y = (tem_y-0x150) *100/1288;

	osd(tem_x,tem_y,DisplayBuffer_565);		
}	

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/79851.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学习Python中turtle模块的基本用法(4:绘制科赫曲线和谢尔宾斯基三角形)

科赫曲线和谢尔宾斯基三角形是常见的分形图形&#xff08;详细介绍见参考文献1&#xff09;&#xff0c;本文使用turtle库绘制这两类图形。 科赫曲线 科赫曲线的详细介绍见参考文献2&#xff0c;其中的绘图思路是“画正三角形&#xff0c;并把每一边三等分,取三等分后的一边中…

【LeetCode】Day194-超级丑数

题目 313. 超级丑数【中等】 题解 之前做过丑数&#xff0c;规定丑数是质因数只包含2,3,5的正整数&#xff0c;而这道题丑数升级为超级丑数&#xff0c;规定为包含的质因数是在primes数组中的正整数 丑数的题解用动态规划&#xff0c;那么超级丑数也可以利用相同的方法解答…

CSS -- CSS元素显示模式总结(块元素,行内元素,行内块元素)

文章目录CSS 的元素显示模式1 什么是元素显示模式2 块元素3 行内元素4 行内块元素5 元素的显示模式总结CSS 的元素显示模式 1 什么是元素显示模式 作用&#xff1a;网页的标签非常多&#xff0c;在不同地方会用到不同类型的标签&#xff0c;了解他们的特点可以更好的布局我们…

[附源码]JAVA毕业设计-学生宿舍故障报修管理信息系统-(系统+LW)

[附源码]JAVA毕业设计-学生宿舍故障报修管理信息系统-&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff…

开源即巅峰,《Java程序性能优化实战》GitHub三小时标星已超34k

蓦然回首自己做开发已经十年了&#xff0c;这十年中我获得了很多&#xff0c;技术能力、培训、出国、大公司的经历&#xff0c;还有很多很好的朋友。但再仔细一想&#xff0c;这十年中我至少浪费了五年时间&#xff0c;这五年可以足够让自己成长为一个优秀的程序员&#xff0c;…

项目设置分页条件查询接口

一、分页 1、HospPlusConfig中配置分页插件1 /** 2 * 分页插件 3 */ 4 Bean 5 public PaginationInterceptor paginationInterceptor() { 6 return new PaginationInterceptor(); 7 }2、分页Controller方法 HospitalSetController中添加分页方法1 ApiOperation(value "分…

Python学习基础笔记四十二——序列化模块

1、序列化的概念&#xff1a; 序列&#xff1a;就是字符串。 序列化&#xff1a;将原本的字典、列表等内容转换成一个字符串数据类型的过程就叫做序列化。 反序列化&#xff1a;从字符串到数据类型的过程。 2、序列化的目的&#xff1a; 1、以某种存储形式使自定义的数据持…

servlet+Mysql实现的校园论坛管理系统(功能包含登录,首页帖子查看、发帖、个人帖子删除编辑、帖子评论回复、用户管理等)

博客目录servletMysql实现的校园论坛管理系统实现功能截图系统功能使用技术代码完整源码servletMysql实现的校园论坛管理系统 本系统是一个简单的校园论坛系统&#xff0c;学生可以在线发帖并进行帖子评论回复&#xff0c;同同时管理员可以对用户进行管理。 (文末查看完整源码…

win11: cmake+glfw+imgui

下载源码&#xff1a;imgui github地址 将需要的文件拖拽入项目外部库的imgui文件夹 backends文件夹里选择与环境适配的文件&#xff0c;我这里用了glfw和opengl3 目录结构&#xff1a; CMakeLists.txt cmake_minimum_required(VERSION 3.24) project(proforlearn) set(CM…

基于java+springmvc+mybatis+jsp+mysql的实验室计算机故障报修系统

项目介绍 本系统采用java语言开发&#xff0c;后端采用ssm框架&#xff0c;前端采用jsp技术&#xff0c;数据库采用mysql进行数据存储。 前端页面&#xff1a; 功能&#xff1a;首页、设备信息、公告资讯、个人中心、后台管理、联系客服 管理员后台页面&#xff1a; 功能&…

电子学会2020年12月青少年软件编程(图形化)等级考试试卷(二级)答案解析

目录 一、单选题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 二、判断题&#xff08;共10题&#xff0c;每题2分&#xff0c;共20分&#xff09; 三、编程题【该题由测评师线下评分】&#xff08;共2题&#xff0c;共30分&#xff09; 青少年软件…

业务流程监控:让多维度监控有了灵魂

需求 《可视化业务流程监控&#xff0c;是解决方案更是运维之道&#xff01;》一文让我们知道可以借助Grafana 两个插件&#xff1a;Diagram、FlowCharting&#xff0c;满足我们对于图形数据业务流程的可视化监控&#xff0c;但是在使用前需要我们做好以下两点工作&#xff1a…

修复自定义标题word题注错误:错误,文档中没有指定样式的文字以及编号无法随章节变化问题

一、单个修复指定章节号 假设采用自定义样式“毕业”&#xff0c;如果出现类似提示&#xff0c;可以具体操作如下&#xff1a; 光标定位与错误题注的位置&#xff0c;按shift F9 {STYLEREF 1 \s} - 2 将内容修改为 图 {STYLEREF "毕业" \s} - 2 右击&#xff0c;更…

被人叫做砖家模拟器的ChatGPT,它真的靠谱吗?

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 前言 最近很热门的聊天机器人ChatGPT&#xff0c;据说五天时间用户就破了百万&#xff0c;这几天在体验过程中发现了一些问题&#xff0c;今天我就以下列几个方面来跟大家简单的交流下ChatGPT。 ChatGPT怎么注册国…

【博客555】prometheus的step,durations,rate interval,scrape interval对数据查询结果的影响

prometheus的step&#xff0c;durations&#xff0c;rate interval&#xff0c;scrape interval对数据查询结果的影响 1、场景&#xff1a;在查询prometheus数据时出现很多诡异的现象 1、为什么同样的查询语句在不同的时间点查询&#xff0c;对过去某一时刻的数据展示却不一样…

网络拓扑配置案例练习(VRRP,浮动路由,DCHP,三层交换机配置)

网络拓扑配置案例网络拓扑配置案例练习网络拓扑需求描述具体操作命令交换机创建vlan&#xff0c;配置access、trunk口&#xff0c;划分vlanvrrp配置路由配置验证vrrp和浮动路由DHCP配置总结网络拓扑配置案例练习 在这篇文章中将记录网络的常见配置&#xff1a;VRRP&#xff0c…

vue-cli和vue有什么区别

目录 1、什么是 Vue&#xff1f; 2、什么是vue-cli&#xff1f; 3、区别和关联 &#x1f449; 区别 &#x1f449; 关联 &#x1f340; 扩展知识 “vue-cli”和vue的区别&#xff1a;vue是“vue.js”的简称&#xff0c;是一个成熟的用于构建用户界面的JavaScript渐进式框…

「Docker学习系列教程」9-Docker容器数据卷介绍

通过前面8篇文章的学习&#xff0c;我们已经学会了docker的安装、docker常用的命令已经docker镜像修改后提交的远程镜像仓库及提交到公司的私服仓库中。接下来&#xff0c;我们再来学学Docker另外一个重要的东西-容器数据卷。 我们先来看看一个场景&#xff1a;我们有多个dock…

18. 权重衰退的代码的从零实现和简洁实现

通过一个简单的例子来演示权重衰减。 %matplotlib inline import torch from torch import nn from d2l import torch as d2l0.01就是权重&#xff0c;xi是随机的输入&#xff0c;噪音是均值为0&#xff0c;方差为0.01的一个正态分布 n_train,n_test,num_inputs,batch_size 2…

Alibaba 官方微服务扛把子「SpringCloudAlibaba 全彩学习手册.PDF」,开源学习ing,

最近我在知乎上看过的一个热门回答&#xff1a; 初级 Java 开发面临的最大瓶颈在于&#xff0c;脱离不出自身业务带来的局限。日常工作中大部分时间在增删改查、写写接口、改改 bug&#xff0c;久而久之就会发现&#xff0c;自己的技术水平跟刚工作时相比没什么进步。 所以我们…