linux串口触摸屏设计总结

时间:2019-05-12 08:04:34下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《linux串口触摸屏设计总结》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《linux串口触摸屏设计总结》。

第一篇:linux串口触摸屏设计总结

Linux serial touch 设计总结

概述:

最近在做嵌入式linux下串口触摸屏设计,遇到一些问题,经过查找资料和请教同事,总算把问题解决了,事后有把linux相关的内核代码仔细看了一遍,为了有点成果,特别写了个总结。如有任何问题请联系yxj_5421@163.com,转载请标明出处。

系统资源:

Linux:2.6.36

UI:QT+TSLIB 硬件资源不关心

设计方法:

有两种实现途径。

1、是将要使用的串口单独拿出来,作为一个platform总线设备实现,在嵌入式平台mach文件里面,加上串口中断号和寄存器首地址,然后将这个串口注册成一个platform总线设备。在驱动probe函数里面需要得到这个串口中断号以及寄存器映射地址,通过寄存器映射地址设置串口波特率,数据位,停止位等,通过中断号注册中断等,然后调用input_register_device注册一个input设备。在中断里面得到外面触摸屏的数据,然后根据input touch协议上报触摸数据。这种方法实现简单明了,不需要和linux的tty,serio等打交道。但是要求知道串口硬件spec,比如寄存器等,而且这个串口就只能给触摸屏使用了,不能作为tty使用。因为是嵌入式开发,因此很容易知道硬件spec,而且嵌入式平台一旦确定,那么这个串口肯定就是给触摸屏使用了。因此在嵌入式平台上,推荐使用这个方法。

是将串口作为一个serio总线设备,利用linux内核提供serio总线驱动,通过设置对应的串口,调用serport提供的函数将串口当做serio总线设备,在驱动里面需要按照serio总线设备驱动的框架来实现,这方面的例子linux里面有很多,比如touchright.c,在模块init函数里面调用serio_register_driver注册serio总线设备驱动,如果serio总线上对应的serio设备存在,就调用connect函数,在这个函数里面调用input_register_device注册一个input设备。具体驱动不再分析了,很简单,相信各位都能看的懂。

至此,两种方法都实现了串口触摸屏的驱动,讲到这里是不是就完了,非也,本文的重点还在后面,请看下面分析:

第一种方法只要驱动模块被加载,就会在/dev/input下面创建一个eventx节点,tslib就能访问这个节点,获得触摸坐标,然后送给qt。第二种方法驱动模块加载后,并没有创建eventx节点,也就是说connect函数没有被调用,按照linux驱动模型来看,就是serio总线上还没有对应的serio设备,因此驱动加载时没有对应的设备,就不会调用connect函数,这时的串口还是作为一个linux tty设备存在。

我遇到的问题就是serio驱动加载了,但是没有创建eventx节点,查找资料也只有一个说是要把tty设置成N_MOUSE,然后读,说的不清楚,也不知道怎么实现,经过自己摸索,终于把问题解决了。

2、Linux 启动后串口形式: Linux一启动是将串口作为tty来设置的。看下的调用:

start_kernel

init/main.c大家对这个函数不陌生吧,linux启动过程中重要的一个函数

console_init();

drivers/tty/tty_io.c

tty_register_ldisc(N_TTY, &tty_ldisc_N_TTY);drivers/tty/tty_idisc.c 给串口注册一个tty链路层处理函数ops。

现在我们需要写一个上层的应用程序,对这个tty进行设置,需要设置波特率,数据位,停止位等,最重要的是要将这个tty设备设置成一个serio总线设备,然后把它注册在serio总线上,请看下面的代码:

fd = open(device, O_RDWR | O_NOCTTY | O_NONBLOCK);

if(fd < 0){

setline(fd, type->flags, type->speed);ldisc = N_MOUSE;if(ioctl(fd, TIOCSETD, &ldisc)){

} fprintf(stderr, “inputattach: can't set line disciplinen”);return EXIT_FAILURE;

} fprintf(stderr, “inputattach: '%s'-%sn”, device, strerror(errno));return 1;

里面的device就是对应要使用的那个串口,linux里面一般是/dev/ttyS0,首先是打开串口 open(device, O_RDWR | O_NOCTTY | O_NONBLOCK)接着设置波特率等 setline(fd, CS8, B9600);static void setline(int fd, int flags, int speed){

} struct termios t;tcgetattr(fd, &t);t.c_cflag = flags | CREAD | HUPCL | CLOCAL;t.c_iflag = IGNBRK | IGNPAR;t.c_oflag = 0;t.c_lflag = 0;t.c_cc[VMIN ] = 1;t.c_cc[VTIME] = 0;cfsetispeed(&t, speed);cfsetospeed(&t, speed);tcsetattr(fd, TCSANOW, &t);devt = type->type |(id << 8)|(extra << 16);if(ioctl(fd, SPIOCSTYPE, &devt)){ fprintf(stderr, “inputattach: can't set device typen”);} return EXIT_FAILURE;

read(fd, NULL, 0);

接下来就是重点了

ldisc = N_MOUSE;if(ioctl(fd, TIOCSETD, &ldisc))

跟踪代码到内核层ioctl:

long tty_ioctl(struct file *file, unsigned int cmd, unsigned long arg)

drivers/tty/tty_io.c case TIOCSETD: return tiocsetd(tty, p);

drivers/tty/tty_io.c

tty_set_ldisc(tty, ldisc);drivers/tty/tty_idisc.c,ldisc等于N_MOUSE new_ldisc = tty_ldisc_get(ldisc);

ldops = get_ldops(disc);

这段代码需要得到N_MOUSE的链路层,先在tty_ldiscs里面查找是否有N_MOUSE链路层的处理函数ops,如果没有,就需要加载serport模块,看看这个模块init函数 retval = tty_register_ldisc(N_MOUSE, &serport_ldisc);注册一个N_MOUSE链路层的处理函数ops 创建一个新的N_MOUSE链路层new_ldisc,接着调用 tty_ldisc_assign(tty, new_ldisc);

把新的链路层放在tty里面 retval = tty_ldisc_open(tty, new_ldisc);打开这个新的链路层

至此,已经给串口增加了一个N_MOUSE的链路层,并且把链路层的处理函数也注册进去了。这个串口当前的链路层就是N_MOUSE。目前为止串口还只是个tty设备,并没有注册到serio总线上。继续看我们的应用程序:

devt = type->type |(id << 8)|(extra << 16);if(ioctl(fd, SPIOCSTYPE, &devt)){

fprintf(stderr, “inputattach: can't set device typen”);

return EXIT_FAILURE;} ret = ld->ops->open(tty)

ld->ops就是serport注册的serport_ldisc static int serport_ldisc_open(struct tty_struct *tty)drivers/input/serio/serport.c 这个函数里面会创建一个serport结构体,并初始化

调用

long tty_ioctl(struct file *file, unsigned int cmd, unsigned long arg)

drivers/tty/tty_io.c retval = ld->ops->ioctl(tty, file, cmd, arg);static int serport_ldisc_ioctl(struct tty_struct * tty, struct file * file, unsigned int cmd, unsigned long arg)设置

serport->id.proto = type & 0x000000ff;serport->id.id

=(type & 0x0000ff00)>> 8;serport->id.extra =(type & 0x00ff0000)>> 16;这里三个值一定要和serio总线驱动里面对应的值一致,serio总线就是靠它们来给设备和驱动建立联系的。

调用

read(fd, NULL, 0);跟踪代码到内核层tty_read:

static ssize_t tty_read(struct file *file, char __user *buf, size_t count,loff_t *ppos)(ld->ops->read)(tty, file, buf, count)

这个ld就是tty当前的链路层结构,上面我们已经设置N_MOUSE为tty的当前链路层,因此ld->ops就是serport注册的serport_ldisc static ssize_t serport_ldisc_read(struct tty_struct * tty, struct file * file, unsigned char __user * buf, size_t nr)

serio_register_port(serport->serio);

serio_init_port(serio);

serio_queue_event(serio, owner, SERIO_REGISTER_PORT);注册一个serio总线设备,关于serio总线,网络有很多资料介绍,这里就不说了。至此,我们的串口设备已经当做serio总线设备注册在serio总线上了,如果相应的驱动也在serio总线上,就会进行设备和驱动的匹配,然后调用驱动里面的connect函数,在这个函数里面就会创建input节点。我们的驱动和设备已经运行起来了,现在看看数据是如何传递的

先看具体串口中断函数: 我们以altera_uart.c为例: altera_uart_interrupt

altera_uart_rx_chars(pp)

tty_flip_buffer_push(port->state->port.tty);

flush_to_ldisc(&tty->buf.work);

disc->ops->receive_buf(tty, char_buf,flag_buf, count);disc->ops就是serport注册的serport_ldisc static void serport_ldisc_receive(struct tty_struct *tty, const unsigned char *cp, char *fp, int count)

serio_interrupt(serport->serio, cp[i], ch_flags);

ret = serio->drv->interrupt(serio, data, dfl);drv->interrupt就是我们驱动函数提供一个函数,它每次接受一个字符,在这个函数里面,接受到足够信息后,就能得到触摸屏坐标信息,然后通过input_report上报上去。看看数据处理流程图:

总结:

要想让基于serio总线驱动的串口触摸屏能正常工作,在linux内核需要加载驱动模块,serport模块。还需要一个上层应用程序,这个程序需要进行以下工作

1、打开你要使用的串口,比如

open(device, O_RDWR | O_NOCTTY | O_NONBLOCK)

device为/dev/ttyS0

2、设置串口波特率等,和你的串口触摸屏一致

3、给串口增加一个N_MOUSE链路层

4、设置你的串口触摸屏type,id,extra

5、读串口read(fd, NULL, 0);

第二篇:单片机串口总结

51单片机串口总结

有句话说“尽信书不如无书”,要学好单片机就要不断的、大胆的实验,要多怀疑,即使我们的怀疑最终被证明是错误的那么这也是进步(人们认识事物很多情况下来源于怀疑),当怀疑出现时就要去实践。有很多东西如果不通过实践是不可能掌握其中隐藏的奥秘,就拿51单片机串口通讯这一块,我认为掌握很好了,可以很轻松的实现数据的接收、发送,但这段时间当我重新学习串口时,我才发现里面还有很多小细节从没注意,更别说研究了。对于接收发送程序永远是按照别人的模式来编写程序,并没有真真正正的挖掘深层次的内容。我身边太多的人在临摹别人的程序,当然我不反对,但是希望自己多问几个问什么,单纯的会编程是学不好单片机的,毕竟单片机有自己独特的硬件结构。

开讲之前先简要说一下同步、异步通信:

同步通信:发送方时钟对接收方时钟控制,使双方达到完全同步。

异步通信:发送与接受设备使用各自的时钟控制数据的发送和接受过程(虽然时钟不同,但一般相差不大)。

51单片机串行口结构

从上图中我们看到,51单片机有两个物理上独立的接收、发送缓冲器SBUF,它们共用同一个地址99H,但是请注意:接收缓冲器只能读而不能写,发送缓冲器只写不读。单片机可以同时实现数据的发送与接收功能。

特别注意:接收器是双缓冲结构:当前一个字节从接收缓冲区取走之前,就已经开始接收第

二个字节(串行输入至移位寄存器),此时如果在第二个字节接收完毕而前一个字节还未被读走,那么就会丢失前一个字节。

51单片机串口控制寄存器

关于51单片机的控制寄存器各个位表示的含义在这里我只谈SM2。

SM2为多机控制位,主要用于工作方式2和3,当接收机的SM2=1时,可以利用接收到的RB8来控制是否激活RI(RB8=0不激活RI,收到的数据丢失;RB8=1时收到的数据进入SBUF,并激活RI ,进而在中断服务程序中将数据从SBUF中读走)。当SM2=0时,不论收到的RB8为何值都将使接收到的数据进入SBUF,并激活RI,通过控制SM2实现多机通信。

51单片机串口通讯方式

51串口通讯方式有3种,方式0、方式

1、方式2与方式3,他们的工作模式不尽相同。首先他们的波特率很容易忽视。方式0与方式2的波特率固定,而方式1和3的波特率由T1的溢出率决定。

方式0的波特率=f/12

系统晶振的12分频,换句话说12M晶振的情况下,其波特率可达1M,速度是很高的(当我们在选用串行器件并采用方式0时需要特别注意器件所能允许的最大时钟频率)。

方式2 =f/64或f/32(当SMOD=1时为f/32,SMOD=0时为f/64)。

曾经我用方式2进行MODBUS通信时,总是通讯失败,我仔细检查程序,没有发现逻辑错误,特别是当我参考别人的程序时,发现很少有人用方式2进行MODBUS通讯,所以当时自己妄下结论51单片机的串行方式2不可用,直到有一天夜里我突然想起方式2的波特率是固定的,试想晶振11.0592M/32或11.0592M/64怎么也不可能是9600啊,怎么可能通信成功。这才恍然大悟,看来还是自己太武断了,没有认真看书啊。有时我们认为我们犯这样的错误很低级,其实我们很多次都是因为这样的小细节导致我们整个系统不正常,正所谓“千里之堤毁于蚁穴”,这些细节真的伤不起啊。

方式1、3波特率=(2smod/32)*T1的溢出率,其中TI的溢出率=f/{12*[256-(TH1)]}.关于3种通讯方式其中有几点特别容易出错:

1、无论采用哪种通讯方式,数据发送和接受都是低位在先,高位在后。、3种方式作为输出,由于输出是CPU主动发送,不会产生重叠错误,当数据写入SBUF后,发送便启动(通过单片机内部逻辑控制,与程序无关),当该字节发送结束(SBUF空),置TI。不要理解为当数据一写入SBUF就置位TI,如果中断允许则在中断中发送数据,这就大错特错了。同样作为输入,可能会产生重叠错误(主要依赖于特定的环境),当一个字节的数据接收完毕(SBUF满)置位RI,表示缓冲区有数据提示CPU读取。

接下来通过一些实验具体说明串口通信中需要注意的地方 方式0输出

方式0主要功能是作为移位寄存器,将数据从SBUF中逐位移出,最常见的用法就是外接串入并出的移位寄存器,如74LS164。之前在做这一部分实验时总是利用单片机I/O端口模拟实现,现在想想在串口未被占用的情况下,方式0是最好的实现方式。

利用串口方式0,向74LS164输出字符“0”的编码,程序如下:

该程序采用了中断方式实现,结果是通过74LS164使数码管显示“0”。实验结果如下:

这里我说明几点: 如果采用查询方式,并且只发送一遍,那么程序最后的while(1);不可以省略,否则会出现数码管闪烁的现象(在KEIL环境下,main()函数也是作为一个调用函数,最后也有返回RET,它不像C中的main()函数,当执行完毕后就停止,而是重新复位执行,如此反复,这一点要特别注意)

这是查询方式下不加while(1);的现实效果 如果采用中断方式发送,请记得中断中清除TI,仅仅是为了解除中断标志,而不是等待发送结束,因为此时数据早已离开了SBUF跑到外边去了。3 74LS164最高25MHZ,采用方式0,没有问题。

方式0作为输入模式

以74ls165(最高时钟25MHZ)为例,可以满足要求。

对应结果如下:

(注意:74ls165线传送高位,而串口通信低位在先,所以显示的数据和实际数据高低位正好相反

P1.7---P1.0对应D0---D7)。

本程序只接收一次,也许有人会问,中断程序中REN=0,表示什么意思?可不可以改成ES=0?

这个问题很好,首先REN=0表示接收禁止,即不允许串口接收数据;ES=0是禁止中断和单片机是否接收数据没有关系,不接收数据自然中断允许也是徒劳,这两者有很大的区别。我们在很多接收程序中经常可以看到在判断RI标志后紧跟着清除标志位,我想问一下,为什么?)

如果我们也按照这种模式改写会怎样呢?

实验结果如下

两次结果差异怎么这么大?为什么会这样子?

为了便于理解,也为了说明问题方便,对中断程序做了如下处理:

结果又变了

是不是感觉很奇怪,究竟咋回事呢?

首先中断程序中当判断RI置位标志后紧跟着清零是为了接收下一个字节的数据,也为了避免单片机重复中断。

当51单片机串口方式0作输入时,在REN=1且RI=0的条件下就启动了单片机串口接收过程。如果有一个条件不满足就不能启动接收过程,以上出现的错误正式由于忽略了这个重要的因素造成的。在RI清零后由于REN仍然为1,单片机已经开始接收第二字节的数据,由于串口速度很快,RI仍会置位,而紧接着将REN清零只能阻止单片机接收数据,但是却

不能阻挡第二次中断。由于只接收了部分外部引脚数据(此时外部引脚为高电平,即逻辑1,其实单片机只接收了一位,对于12M晶振而言,方式0大约8us接收一个字节数据)。相反在RI=0与REN=0之间加上适当的延迟,就可以保证一个字节的数据全部接收完毕,故此时我们读上来的一个字节为0xff。

我在中断程序中添加了一个中断计数器(不加延迟),发现中断服务程序的确执行了两次

结果如下

加上延迟结果

这就验证了刚才的结论。

至于说可不可以换做ES=0,回答是可以的,尽管同样可以实现数据的读取,但是实质不同,当禁止中断后,单片机仍在接收外部数据,只是不再请求中断,自然的不再读取第2、3。。。字节的数据,那么P1将保留第一次中断时从SBUF中读出的数据。如果某一时刻打开中断发现结果不正常,如果理解了上面的机制就不会觉得惊讶了。建议:单次接收时,中断服务程序中REN清零放在RI之前。

还有一个问题非常重要:

如果我在中断服务程序中不清除RI,会怎样?

很少有人会这样用,但是经常有人忘记了(包括我)。课本上写得很清楚,务必在中断中用软件清除RI,为什么要这样呢?难道仅仅是为了接收下一次数据并且避免单片机不断的响应中断?的确如此,如果对于一个小系统而言,不清除中断标志,那么单片机将不停的中断,影响接下来任务的执行,系统必然瘫痪,而且不能正常的接收数据。总结:方式0作为发送方,只要向SBUF中写入数据就启动了发送过程;

方式0在座位接收模式时,REN=

1、RI=0的情况下就已经启动了接收过程。在中断程序中要注意两者清零的顺序。

还有一种情况要特别注意:单片机复位时SCON自动清零,如果单片机不工作在方式0,那么如果采用位操作SCON时也要注意REN=1与SM0、SM1的书写顺序,总之切记方式0启动发送、接收数据的条件。

方式1 方式1为10位异步通信模式。作为输出和方式0没有本质的区别,不同的是数据帧的形式,但是对于接受模式则有点不同,当REN=1且RI=0时,单片机并不启动接收过程。而是以已选择波特率的16倍速率采样RXD引脚的电平,当检测到输入引脚发生1---0负跳变时,则说明起始位有效,才开始接受本帧数据。方式1模式下 单片机可以工作在全双工以及半双工方式。下面举两个例子

半双工

主机发送某一字符,从机接收到数据后返回数据加1的值 比如 主机发送“1“,从机收到后回复主机”2“。实验结果如下:

方式1工作方式主要注意: 1 波特率可变。数据接收以起始位为标志,停止位结束。当RI=0且SM2=0或接收到有效停止位时,单片机将接收到的数据移入SBUF中,两个条件缺一不可。

方式2和方式3 方式2和3不同的只是波特率,这里以方式3为例

作为输出模式同方式1没有区别,只是增加了第八位数据位,第八位数据可以用作校验位或在多机通信中用作数据/地址帧的判别位。

首先我们来做模拟主从奇偶校验模式

主机发送一帧数据,并发送奇偶校验位,从机接收数据后,判断数据是否正确,如果正

确,接收指示灯亮,并且回送主机数据加1,反之回送0;主机接收从机信息,如果校验正确点亮LED指示灯.(从机、主机接收数据无论校验正确与否,均显示接收到的字节数据)。奇校验模式 演示结果如下:

(注:从接接收不正确,返回0)

主从机接收正确效果

之前我们已经介绍了SM2的具体用法,主要用于多机通信,将SM2作为数据/地址帧 的判别位,在接收地址时令SM2=1,当接收到的第八位数据为1时激活RI产生中断,然后比较地址,如果地址符合则清除SM2准备接受数据信息,反之不理睬。

特别注意 当RI=0且SM2=0(或SM2=1时接收到第9位数据为1)时,单片机将接收到的数据移入SBUF中,两个条件缺一不可。

在这里我只举一个简单的例子 一个主机,两个从机 起始时,主机从机的SM2均置位,所有的从机等待主机发送地址帧,主机令TB8=1,发送地址帧。所用的从机将接受到的地址和自己的地址比较,如果符合,点亮LED指示灯,清除SM2(准备接受主机发送的数据帧),并将自己的地址发送到主机。主机接收从机发送的地址信息,如果地址符合则数码管显示从机地址并开始准备发送数据,反之发复位信号,TB8=1。从机接收数据先判断RB8,如果RB8=1,则复位,重新开始接收主机发送的地址帧,反之通过P1口外接数码管显示接收到的数据。实验结果如下:

注意:如果主机没有得到正确的地址,则将按照一定的速率发送地址帧,直到接收正确的地址为止,该试验主机向从机2发送信息。

另外在这里我补充两点: 我们可以很方便的利用串口通信的工作方式2或3实现奇偶校验,注意技巧,当为偶校验时TB8=P,奇校验时TB8=~P;

2当单片机利用中断发送大量数据时,尽量采用中断发送,因为单片机在写入SBUF数据后由硬件将数据发送完,在发送过程中,单片机还可以做很多事情,利用中断发送数据可以提高CPU利用率。尤其在低波特率时效果更明显。

第三篇:嵌入式论文关于触摸屏设计

嵌入式实验课程设计

目 基于嵌入式的触摸屏控制实验

电子工程系

信息工程

20092309022

杨 金 磊

指导教师

董立军

二O一二 年 六 月 八 日

目 录

1.要求.............................................................2 1.1设计目的......................................................1 1.2 设计意义......................................................2 1.3 设计内容......................................................2 1.4 主要任务......................................................2 2.正文.............................................................3 2.1触摸屏工作原理(触摸屏接口工作模式)..........................3 2.2、设计总体方案.................................................4 2.3、设计所需工具.................................................5 2.4、平台构建过程.................................................5

2.4.1、硬件平台搭建.............................................5 2.4.2根文件系统的制作...........................................7(1)根文件系统.................................................7 3.程序............................................................11 3.1.程序流程图:.................................................11 3.2.分析驱动.....................................................11 3.2.1、触摸屏设备驱动中数据结构................................11 3.2.2、触摸屏驱动模块加载和卸载函数............................13 3.2.3、触摸屏设备驱动的读函数..................................15 3.2.4、触摸屏设备驱动的轮询与异步通知..........................15 3.2.5源程序触摸屏驱动代码:....................................16 3.2.6、实验结果显示:..........................................27 4.心得............................................................28 4.1 课程设计心得体会:...........................................28 5.参考文献........................................................28

5.1【参考文献】..................................错误!未定义书签。

第一章 要求

1.1 设计目的

(1)基于WINDOWS操作系统,以及实验箱,利用触摸屏返回触点坐标值及动作信息。

(2)坐标及动作的具体显示:触摸笔动作,触点X坐标值,触点Y坐标值。

1.2 设计意义

(1)熟悉嵌入式系统开发平台

(2)掌握ARM嵌入式操作系统下的各个指令的使用方法(3)了解触摸屏的原理

1.3 设计内容

(1)系统的正确移植和使用(2)根文件系统的正确移植和使用(3)驱动程序的编译与装载

(4)嵌入式系统下应用程序的交叉编译及下载与调试

1.4 主要任务

(1)熟悉实验的流程(2)理解驱动程序源代码

(3)调用驱动程序的某些函数,编译与调试应用程序

第二章 正文

2.1触摸屏工作原理(触摸屏接口工作模式)

(1)普通转换模式

普通转换模式(AUTO_PST = 0,XY_PST = 0)是用作一般目的下的ADC转换。这个模式可以通过设置ADCCON和ADCTSC来进行对AD转换的初始化;而后读取ADCDAT0(ADC数据寄存器0)的XPDATA域(普通ADC转换)的值来完成转换。(2)分离的X/Y轴坐标转换模式:X轴坐标转换和Y轴坐标转换。

X轴坐标转换(AUTO_PST=0且XY_PST=1)将X轴坐标转换数值写入到ADCDAT0寄存器的XPDATA域。转换后,触摸屏接口将产生中断源(INT_ADC)到中断控制器。

Y轴坐标转换(AUTO_PST=0且XY_PST=2)将X轴坐标转换数值写入到ADCDAT1寄存器的YPDATA域。转换后,触摸屏接口将产生中断源(INT_ADC)到中断控制器。

(3)自动(连续)X/Y轴坐标转换模式。

自动(连续)X/Y轴坐标转换模式(AUTO_PST=1且XY_PST= 0)以下面的步骤工作:

触摸屏控制器将自动地切换X轴坐标和Y轴坐标并读取两个坐标轴方向上的坐标。触摸屏控制器自动将测量得到的X轴数据写入到ADCDAT0寄存器的XPDATA域,然后将测量到的Y轴数据到ADCDAT1的YPDATA域。自动(连续)转换之后,触摸屏控制器产生中断源(INT_ADC)到中断控制器。(4)等待中断模式

当触摸屏控制器处于等待中断模式下时,它实际上是在等待触摸笔的点击。在触摸笔点击到触摸屏上时,控制器产生中断信号(INC_TC)。中断产生后,就可以通过设置适当的转换模式(分离的X/Y轴坐标转换模式或自动X/Y轴

坐标转换模式)来读取X和Y的位置。(5)静态(Standby)模式

当ADCCON寄存器的STDBM位被设为1时,Standby模式被激活。在该模式下,A/D转换操作停止,ADCDAT0寄存器的XPDATA域和ADCDAT1寄存器的YPDATA(正常ADC)域保持着先前转换所得的值。

2.2、设计总体方案

2.2.1 软件

(1)Embest Online Flash Programmer For ARM: Embest Flash在线编程器(2)HYPER TERMINAL(超级终端):传送vivi.nand;

传送vivi.nand

vivi> load flash kernel x <回车> 烧写更新内核,传送zImage文件;等待传送内核:

vivi>load flash root j <回车> 烧写更新文件系统;烧写新的文件系统 load flash root j

(3)EmbestIDE Pro for ARM: 应用于嵌入式软件开发的新一代集成开发环境,是一个高度集成的图形界面操作环境,包含编辑器、编译汇编链接器、调试器、工程管理、Flash 编程等工具;支持的开发语言包括标准C和汇编语言。(4)cygwin: 4

一个在windows平台上运行的unix模拟环境,它对于学习unix/linux操作环境,或者从unix到windows的应用程序移植,或者进行某些特殊的开发工作,尤其是使用gnu工具集在windows上进行嵌入式系统开发,把gcc,gdb,gas等开发工具进行了改进,能够生成并解释win32的目标文件。2.2.2 硬件

S3C2410处理器是Samsung公司基于ARM公司的ARM920T处理器核,32位微控制器。该处理器拥有:独立的16KB指令Cache和16KB数据Cache,MMU,支持TFT的LCD控制器,NAND闪存控制器,3路UART,4路DMA,4路带PWM的Timer,I/O口,RTC,8路10位ADC,Touch Screen接口,IIC-BUS 接口,IIS-BUS 接口,2个USB主机,1个USB设备,SD主机和MMC接口,2路SPI。S3C2410处理器最高可运行在203MHz。

2.3、设计所需工具

2.3.1 软件: Embest Online Flash Programmer For ARM,HYPER TERMINAL(超级终端),EmbestIDE Pro for ARM,cygwin 2.3.2 硬件:s3c2410开发板,Embest实验箱

2.4、平台构建过程

2.4.1、硬件平台搭建

硬件流程图:

(1)Vivi烧写过程

1)首先把SW104断开,Flash Programmer的Program,在File选择Open打开要烧写的配置文件S3C2410&NandFLash_vivi.cfg,在Flash Programmer的Program页中选择要烧写的文件vivi.bon&load.bin。点击按钮 Progarm 开始烧写,直到烧写成功

2)连接串口线到 PC 机 COM1,运行光盘中提供的 Windows 超级终端Hyper Terminal.ht 把开发板重新加电,程序运行后,在超级终端上可以看到串口输出Wating,表示正在等待用户从超级终端下载文件。这时,请点击超级终端菜单“传送”选择 Xmodem 方式下载 vivi.nand 文件,点击 OK 后等待下载烧写结束即可。(2)内核zImage烧写

1)首先SW104设为短接(从Nand Flash启动),并确定已经烧写vivi.nand,加电。)在vivi启动等待中,敲入空格键进入vivi界面环境,并输入以下命令:vivi> load flash kernel x <回车> 烧写更新内核约1分钟即可烧写完毕)点击超级终端菜单中的“传送”,选“发送文件”zImage” 并选择xModem方式传送)烧写结束,重起实验板,观测超级终端窗口提示信息就可以启动linux内核,(3)新文件系统的烧写

1)首先SW104设为短接(从Nand Flash启动),确定已经成功烧写vivi.nand,加电运行可以看到vivi启动信息,输入空格进入命令状态;

2)双击运行Download.pjf(该文件在/tmp/edukit-2410/image/中)工程(将启动Embest IDE环境),点击连接Remote connect,程序应该正在运行(命令按钮STOP为红色);在串口输入help,看看有没有反应,如果没反应,点击IDE 按钮:Reset->Start(F5);再输入help测试,直到有反应为止;

3)如果可以输出一些信息,再点击IDE中的Stop,配置Debug的Download地 6

址为0x30000000,并点击IDE菜单Project选择Settings项,在Download页下拉Category到Download项,在Download File选择root.cramfs文件,点击确定后:

点击IDE菜单DEBUG选择Download下载文件系统映象 下载完毕后,点击Start(F5)然后在超级终端里输入: load flash root j(烧写更新文件系统)

注意:只能在“vivi的烧写”操作完成后,才可以按以上方法正确烧写root映象到Nand Flash。

重起实验板,观测超级终端窗口提示信息,引导整个系统启动到linux行命令输入状态。

2.4.2根文件系统的制作(1)根文件系统

根文件系统是Linux系统的核心部分,包含系统使用的软件和库,以及所有用来为用户提供支持架构和用户使用的应用软件,并作为储存数据读写结果的区域。在Linux系统启动时,首先完成内核安装及环境初始化,最后会寻找一个文件系统作为根文件系统被加载。Linux系统中使用“/”来唯一表示根文件系统的安装路径。嵌入式系统中通常可以悬着的根文件系统有:Romfs、CRAMFS、RAMFS、JFFS2、EXT2等,甚至还可以使用NFS作为根文件系统。

(2)cramfs文件系统

Cramfs是Linux创始人Linux torvalds开发的一个适用于嵌入式系统的小文件系统。Cramfs是一个只读文件系统,采用zlib压缩,压缩比一般可以达到1:2,但仍可以做到高效的随机读取。Linux系统中,通常把需要修改的目录压缩存放,并在系统引导的时候再将压缩文件解开。因为cramfs不会影响系统读取文件的速度,而且是一个高度压缩的文件系统,因此非常广泛应用于嵌入式系统中。

(3)cygwin简介

Cygwin是一个在windows平台上运行的unix/Linux模拟环境,是cygnus solutions公司开发的自由软件。Cygwin中,“/”表示根目录,即cygwin的安装目录。我们常用的set_env_linux.sh中定义的目录有:

SOURCEDIR:/tmp/edukit-2410存储了vivi、linux、fs等源代码和例程 WORKDIR:/usr/local/src/edukit-2410工作区。

一般情况下都要把已经规划好的目录结构转换成一个映象文件,即使用命令工具 mkcramfs(cygwin下为 mkcramfs.exe),把相应的 cramfs 目录树压缩为单一的映象文件。其命令格式为:

mkcramfs [-h] [-e edition] [-i file] [-n name] dirname outfile 可以使用我们提供的 mkcramfs.exe 在 cygwin 下编译生成文件系统映象文件 root.cramfs,再固化到开发系统 FLASH 上运行。

(4)常用的Linux行命令

1)、cd 改变当前目录(文件夹)。例如下,cd/ 返回到根目录 cd..退回到上级目录

cd/tmp/edukit-2410/进入/tmp/edukit-2410/文件夹 2)、ls 列出当前目录中的内容。Ls 简单格式列表 ls–l 使用详细格式列表。3)、pwd 显示当前所在的目录。

(5)tar工具命令

tar 程序用于储存或展开 tar 存档文件。命令格式:

tar [-参数] [文件名][路径]-x :extract |--get 从存档展开文件-v :--verbose 详细显示处理的文件-j :--有 bz2 属性的必须包含

-f :--file [HOSTNAME:]F 指定存档或设备(缺省为 /dev/rmt0)

(6)解压原文件系统(命令+解压目录的存放)

1)先将 root.cramfs.tar.bz2文件放在C:cygwin目录中 2)解压文件系统

运行cygwin,执行以下命令解压安装:

$> source /tmp/edukit-2410/set_env_linux.sh Linux编译环境变量设置 $> cd /

$> tar-xvjf root.cramfs.tar.bz2 $> ls „ root „

root文件夹中就是我们想要的cramfs文件系统 3)如果在根目录中产生root文件夹,解压成功 4)在root目录中新建xx文件夹,用于存放应用程序

进入该目录后执行以下命令编译链接测试程序: $> cd root $>mkdir xx

(7)编译应用程序 ts.c(命令+生成文件格式+存放位置): 将编写好的ts.c程序放在C:cygwin目录中 进入该目录后执行以下命令编译链接测试程序: $> cd / $> arm-linux-gcc-o ts ts.c(也可以编写Makefile来编译)

生成文件: ts 如下图所示

将ts文件放入root 下的xx文件夹中

(8)新文件系统的制作: 把刚才编译输出的ts文件拷贝到文件系统所在的工作目录root目录下,执行以下命令生成新的文件系统映象:

$> cd /

$> mkcramfs root root.new

刚刚编译生成的文件系统映象 root.new 中已经包含测试程序即生成文件。解压文件系统在root目录中新建xx文件夹,用于存放应用 将编写好的ts.c程序放在C:cygwin目录中 生成文件: ts 如下图所示

新文件系统的制作

生成文件:

第三章 程序

3.1.程序流程图:

3.2.分析驱动

触摸屏驱动在/kernel/drivers/char/s3c2410-ts.c 文件中。

3.2.1、触摸屏设备驱动中数据结构

(1)触摸屏的file_operations static struct file_operations s3c2410_fops={ owner: THIS_MODULE, open: s3c2410_ts_open, read: s3c2410_ts_read,release: s3c2410_ts_release, #ifdef USE_ASYNC fasync: s3c2410_ts_fasync,//异步通知

#endif poll: s3c2410_ts_poll,//轮询 };(2)触摸屏设备结构体的成员与按键设备结构体的成员类似,也包含一个缓冲区,同时包括自旋锁、等待队列和fasync_struct指针 typedef struct { unsigned int penStatus;/* PEN_UP, PEN_DOWN, PEN_SAMPLE */ TS_RET buf[MAX_TS_BUF];/* protect against overrun(环形缓冲区)*/ unsigned int head, tail;/* head and tail for queued events(环形缓冲区的头尾)*/ wait_queue_head_t wq;//* 等待队列数据结构 spinlock_t lock;//* 自旋锁

#ifdef USE_ASYNC struct fasync_struct *aq;#endif #ifdef CONFIG_PM struct pm_dev *pm_dev;//友善之臂专有的,我后面的代码删除了这段 #endif } TS_DEV;

(3)触摸屏结构体中包含的TS_RET值的类型定义,包含X、Y坐标和状态(PEN_DOWN、PEN_UP)等信息,这个信息会在用户读取触摸信息时复制到用户空 间

typedef struct { 12

unsigned short pressure;//* 压力,这里可定义为笔按下,笔抬起,笔拖曳

unsigned short x;//* 横坐标的采样值 unsigned short y;//* 纵坐标的采样值 unsigned short pad;//* 填充位 } TS_RET;

(4)在触摸屏设备驱动中,将实现open()、release()、read()、fasync()和poll()函数,因此,其文件操作结构体定义

触摸屏驱动文件操作结构体:static struct file_operations s3c2410fops={} _3.2.2、触摸屏驱动模块加载和卸载函数

(1)在触摸屏设备驱动的模块加载函数中,要完成申请设备号、添加cdev、申请中断、设置触摸屏控制引脚(YPON、YMON、XPON、XMON)等多项工作 触摸屏设备驱动的模块加载函数

static int __init s3c2410_ts_init(void)触摸屏设备驱动模块卸载函数

static void __exit s3c2410_ts_exit(void)(2)可知触摸屏驱动中会产生两类中断,一类是触点中断(INT-TC),一类是X/Y位置转换中断(INT-ADC)。在前一类中断发生后,若之前处于PEN_UP状态,则应该启动X/Y位置转换。另外,将抬起中断也放在INT-TC处理程序中,它会调用tsEvent()完成等待队列和信号的释放 触摸屏设备驱动的触点/抬起中断处理程序

static void s3c2410_isr_tc(int irq, void *dev_id, struct pt_regs *reg)

当X/Y位置转换中断发生后,应读取X、Y的坐标值,填入缓冲区 触摸屏设备驱动X/Y位置转换中断处理程序

static void s3c2410_isr_adc(int irq, void *dev_id, struct pt_regs *reg)触摸屏设备驱动中获得X、Y坐标

static inline void s3c2410_get_XY(void)(3)tsEvent最终为tsEvent_raw(),这个函数很关键,当处于PEN_DOWN状态时调用该函数,它会完成缓冲区的填充、等待队列的唤醒以及异步通知信号的释放;否则(处于PEN_UP状态),将缓冲区头清0,也唤醒等待队列并释放信号

触摸屏设备驱动的tsEvent_raw()函数 static void tsEvent_raw(void)(4)在包含了对拖动轨迹支持的情况下,定时器会被启用,周期为10ms,在每次定时器处理函数被引发时,调用start_ts_adc()开始X/Y位置转换过程

触摸屏设备驱动的定时器处理函数

static void tstimerhandler(unsigned long data)(5)在触摸屏设备驱动的打开函数中,应初始化缓冲区、penStatus和定期器、等待队列及tsEvent时间处理函数指针 触摸屏设备驱动的打开函数

static int s3c2410tsopen(struct inode *inode, struct file *filp)

_

_

_

_ 14

(6)触摸屏设备驱动的释放函数非常简单,删除为用于拖动轨迹所使用的定时器即可

触摸屏设备驱动的释放函数

static int s3c2410tsrelease(struct inode *inode, struct file *filp)

_

_3.2.3、触摸屏设备驱动的读函数

触摸屏设备驱动的读函数实现缓冲区中信息向用户空间的复制,当缓冲区有内容时,直接复制;否则,如果用户阻塞访问触摸屏,则进程在等待队列上睡眠,否则,立即返回-EAGAIN 触摸屏设备驱动的读函数

static ssize_t s3c2410_ts_read(struct file *filp, char *buffer, sizet count, lofft *ppos)_

_3.2.4、触摸屏设备驱动的轮询与异步通知

在触摸屏设备驱动中,通过s3c2410_ts_poll()函数实现了轮询接口,这个函数的实现非常简单。它将等待队列添加到poll_table,当缓冲区有数据时,返回资源可读取标志,否则返回0 触摸屏设备驱动的poll()函数

static unsigned int s3c2410_ts_poll(struct file *filp, struct polltablestruct *wait)而为了实现触摸屏设备驱动对应用程序的异步通知,设备驱动中要实现s3c2410_ts_fasync()函数 触摸屏设备驱动的fasync()函数 __

static int s3c2410_ts_fasync(int fd, struct file *filp, int mode)3.2.5源程序触摸屏代码:

/* * s3c2410-ts.c * * touchScreen driver for SAMSUNG S3C2410 * * Author: Janghoon Lyu * Date : $Date: 2002/06/04 07:11:00 $ * * $Revision: 1.1.2.6 $ * * Based on pt036001b-ts.c * * This file is subject to the terms and conditions of the GNU General Public * License.See the file COPYING in the main directory of this archive * for more details.* * History: * * 2002-05-27: Janghoon Lyu *PM.* */

#include #include #include #include

#include #include #include #include #include #include #include

#include

#ifdef CONFIG_PM #include #endif

/* debug macros */ #undef DEBUG #ifdef DEBUG #define DPRINTK(x...)printk(“s3c2410-ts: ” ##x)#else #define DPRINTK(x...)#endif

#define PEN_UP 0

#define PEN_DOWN 1 #define PEN_FLEETING 2 #define MAX_TS_BUF 16 /* how many do we want to buffer */

#undef USE_ASYNC 1 #define DEVICE_NAME “s3c2410-ts” #define TSRAW_MINOR 1

typedef struct { unsigned int penStatus;/* PEN_UP, PEN_DOWN, PEN_SAMPLE */ TS_RET buf[MAX_TS_BUF];/* protect against overrun */ unsigned int head, tail;/* head and tail for queued events */ wait_queue_head_t wq;spinlock_t lock;#ifdef USE_ASYNC struct fasync_struct *aq;#endif #ifdef CONFIG_PM struct pm_dev *pm_dev;#endif } TS_DEV;

static TS_DEV tsdev;

#define BUF_HEAD(tsdev.buf[tsdev.head])#define BUF_TAIL(tsdev.buf[tsdev.tail])#define INCBUF(x,mod)((++(x))&((mod)-1))

static int tsMajor = 0;

static void(*tsEvent)(void);

#define HOOK_FOR_DRAG #ifdef HOOK_FOR_DRAG #define TS_TIMER_DELAY(HZ/100)/* 10 ms */ static struct timer_list ts_timer;#endif

#define wait_down_int(){ ADCTSC = DOWN_INT | XP_PULL_UP_EN |

XP_AIN | XM_HIZ | YP_AIN | YM_GND |

XP_PST(WAIT_INT_MODE);} #define wait_up_int(){ ADCTSC = UP_INT | XP_PULL_UP_EN | XP_AIN | XM_HIZ |

YP_AIN | YM_GND | XP_PST(WAIT_INT_MODE);} #define mode_x_axis(){ ADCTSC = XP_EXTVLT | XM_GND | YP_AIN | YM_HIZ |

XP_PULL_UP_DIS | XP_PST(X_AXIS_MODE);} #define mode_x_axis_n(){ ADCTSC = XP_EXTVLT | XM_GND | YP_AIN | YM_HIZ |

XP_PULL_UP_DIS | XP_PST(NOP_MODE);} #define mode_y_axis(){ ADCTSC = XP_AIN | XM_HIZ | YP_EXTVLT | YM_GND |

XP_PULL_UP_DIS | XP_PST(Y_AXIS_MODE);} #define start_adc_x(){ ADCCON = PRESCALE_EN | PRSCVL(49)|

ADC_INPUT(ADC_IN5)| ADC_START_BY_RD_EN |

ADC_NORMAL_MODE;

ADCDAT0;} #define start_adc_y(){ ADCCON = PRESCALE_EN | PRSCVL(49)|

ADC_INPUT(ADC_IN7)| ADC_START_BY_RD_EN |

ADC_NORMAL_MODE;

ADCDAT1;} #define disable_ts_adc(){ ADCCON &= ~(ADCCON_READ_START);}

static int adc_state = 0;static int x, y;/* touch screen coorinates */

static void tsEvent_raw(void){ if(tsdev.penStatus == PEN_DOWN){

BUF_HEAD.x = x;

BUF_HEAD.y = y;

BUF_HEAD.pressure = PEN_DOWN;

#ifdef HOOK_FOR_DRAG

ts_timer.expires = jiffies + TS_TIMER_DELAY;

add_timer(&ts_timer);#endif } else { #ifdef HOOK_FOR_DRAG

del_timer(&ts_timer);#endif

BUF_HEAD.x = 0;

BUF_HEAD.y = 0;

BUF_HEAD.pressure = PEN_UP;}

tsdev.head = INCBUF(tsdev.head, MAX_TS_BUF);wake_up_interruptible(&(tsdev.wq));

#ifdef USE_ASYNC if(tsdev.aq)

kill_fasync(&(tsdev.aq), SIGIO, POLL_IN);#endif

#ifdef CONFIG_PM pm_access(tsdev.pm_dev);#endif }

static int tsRead(TS_RET * ts_ret){ spin_lock_irq(&(tsdev.lock));ts_ret->x = BUF_TAIL.x;ts_ret->y = BUF_TAIL.y;ts_ret->pressure = BUF_TAIL.pressure;tsdev.tail = INCBUF(tsdev.tail, MAX_TS_BUF);spin_unlock_irq(&(tsdev.lock));

return sizeof(TS_RET);}

static ssize_t s3c2410_ts_read(struct file *filp, char *buffer, size_t count, loff_t *ppos){ TS_RET ts_ret;

retry: if(tsdev.head!= tsdev.tail){

int count;

count = tsRead(&ts_ret);

if(count)copy_to_user(buffer,(char *)&ts_ret, count);

return count;} else {

if(filp->f_flags & O_NONBLOCK)

return-EAGAIN;

interruptible_sleep_on(&(tsdev.wq));

if(signal_pending(current))

return-ERESTARTSYS;

goto retry;}

return sizeof(TS_RET);}

#ifdef USE_ASYNC static int s3c2410_ts_fasync(int fd, struct file *filp, int mode){ return fasync_helper(fd, filp, mode, &(tsdev.aq));} #endif

static unsigned int s3c2410_ts_poll(struct file *filp, struct poll_table_struct *wait){ poll_wait(filp, &(tsdev.wq), wait);return(tsdev.head == tsdev.tail)? 0 :(POLLIN | POLLRDNORM);}

static inline void start_ts_adc(void){ adc_state = 0;mode_x_axis();start_adc_x();}

static inline void s3c2410_get_XY(void){ if(adc_state == 0){

adc_state = 1;

disable_ts_adc();

y =(ADCDAT0 & 0x3ff);

mode_y_axis();

start_adc_y();} else if(adc_state == 1){

adc_state = 0;

disable_ts_adc();

x =(ADCDAT1 & 0x3ff);

tsdev.penStatus = PEN_DOWN;

DPRINTK(“PEN DOWN: x: %08d, y: %08dn”, x, y);

wait_up_int();

tsEvent();} }

static void s3c2410_isr_adc(int irq, void *dev_id, struct pt_regs *reg){ #if 0 DPRINTK(“Occured Touch Screen Interruptn”);DPRINTK(“SUBSRCPND = 0x%08lxn”, SUBSRCPND);#endif spin_lock_irq(&(tsdev.lock));if(tsdev.penStatus == PEN_UP)s3c2410_get_XY();#ifdef HOOK_FOR_DRAG else s3c2410_get_XY();#endif spin_unlock_irq(&(tsdev.lock));}

static void s3c2410_isr_tc(int irq, void *dev_id, struct pt_regs *reg){ #if 0 DPRINTK(“Occured Touch Screen Interruptn”);DPRINTK(“SUBSRCPND = 0x%08lxn”, SUBSRCPND);#endif spin_lock_irq(&(tsdev.lock));if(tsdev.penStatus == PEN_UP){ start_ts_adc();} else { tsdev.penStatus = PEN_UP;DPRINTK(“PEN UP: x: %08d, y: %08dn”, x, y);wait_down_int();tsEvent();

} spin_unlock_irq(&(tsdev.lock));}

#ifdef HOOK_FOR_DRAG static void ts_timer_handler(unsigned long data){ spin_lock_irq(&(tsdev.lock));if(tsdev.penStatus == PEN_DOWN){

start_ts_adc();} spin_unlock_irq(&(tsdev.lock));} #endif

static int s3c2410_ts_open(struct inode *inode, struct file *filp){ tsdev.head = tsdev.tail = 0;tsdev.penStatus = PEN_UP;#ifdef HOOK_FOR_DRAG init_timer(&ts_timer);ts_timer.function = ts_timer_handler;#endif tsEvent = tsEvent_raw;init_waitqueue_head(&(tsdev.wq));

MOD_INC_USE_COUNT;return 0;}

static int s3c2410_ts_release(struct inode *inode, struct file *filp){ #ifdef HOOK_FOR_DRAG del_timer(&ts_timer);#endif MOD_DEC_USE_COUNT;return 0;}

static struct file_operations s3c2410_fops = { owner: THIS_MODULE, open: s3c2410_ts_open, read: s3c2410_ts_read,release: s3c2410_ts_release,#ifdef USE_ASYNC fasync: s3c2410_ts_fasync, #endif poll: s3c2410_ts_poll, };

void tsEvent_dummy(void){} #ifdef CONFIG_PM static int s3c2410_ts_pm_callback(struct pm_dev *pm_dev, pm_request_t req,void *data){ switch(req){

case PM_SUSPEND:

tsEvent = tsEvent_dummy;

break;

case PM_RESUME:

tsEvent = tsEvent_raw;

wait_down_int();

break;} return 0;} #endif

#ifdef CONFIG_DEVFS_FS static devfs_handle_t devfs_ts_dir, devfs_tsraw;#endif static int __init s3c2410_ts_init(void){ int ret;

tsEvent = tsEvent_dummy;

ret = register_chrdev(0, DEVICE_NAME, &s3c2410_fops);if(ret < 0){ printk(DEVICE_NAME “ can't get major numbern”);return ret;} tsMajor = ret;

/* set gpio to XP, YM, YP and YM */ #if 0 set_GPIO_mode(GPIO106_nYPON_MD);

set_GPIO_mode(GPIO105_YMON_MD);set_GPIO_mode(GPIO104_nXPON_MD);set_GPIO_mode(GPIO103_XMON_MD);

GPUP(GPIO106_nYPON)|= GPIO_bit(GPIO106_nYPON);GPUP(GPIO105_YMON)&= GPIO_bit(GPIO105_YMON);GPUP(GPIO104_nXPON)|= GPIO_bit(GPIO104_nXPON);GPUP(GPIO103_XMON)&= GPIO_bit(GPIO103_XMON);#else set_gpio_ctrl(GPIO_YPON);set_gpio_ctrl(GPIO_YMON);set_gpio_ctrl(GPIO_XPON);set_gpio_ctrl(GPIO_XMON);#endif

/* Enable touch interrupt */ ret = request_irq(IRQ_ADC_DONE, s3c2410_isr_adc, SA_INTERRUPT,DEVICE_NAME, s3c2410_isr_adc);if(ret)goto adc_failed;ret = request_irq(IRQ_TC, s3c2410_isr_tc, SA_INTERRUPT,DEVICE_NAME, s3c2410_isr_tc);if(ret)goto tc_failed;

/* Wait for touch screen interrupts */ wait_down_int();

#ifdef CONFIG_DEVFS_FS devfs_ts_dir = devfs_mk_dir(NULL, “touchscreen”, NULL);devfs_tsraw = devfs_register(devfs_ts_dir, “0raw”, DEVFS_FL_DEFAULT,tsMajor, TSRAW_MINOR, S_IFCHR | S_IRUSR | S_IWUSR,&s3c2410_fops, NULL);#endif

#ifdef CONFIG_PM #if 0 tsdev.pm_dev = pm_register(PM_GP_DEV, PM_USER_INPUT,s3c2410_ts_pm_callback);#endif tsdev.pm_dev = pm_register(PM_DEBUG_DEV, PM_USER_INPUT,s3c2410_ts_pm_callback);#endif printk(DEVICE_NAME “ initializedn”);

return 0;tc_failed: free_irq(IRQ_ADC_DONE, s3c2410_isr_adc);adc_failed: return ret;}

static void __exit s3c2410_ts_exit(void){ #ifdef CONFIG_DEVFS_FS

devfs_unregister(devfs_tsraw);devfs_unregister(devfs_ts_dir);#endif unregister_chrdev(tsMajor, DEVICE_NAME);#ifdef CONFIG_PM pm_unregister(tsdev.pm_dev);#endif free_irq(IRQ_ADC_DONE, s3c2410_isr_adc);free_irq(IRQ_TC, s3c2410_isr_tc);}

module_init(s3c2410_ts_init);module_exit(s3c2410_ts_exit);触摸屏应用程序

#include #include #include /* 文件操作 */

#define PEN_UP 0 /* 触摸笔抬笔,即触摸屏不被压下 */ #define PEN_DOWN 1 /* 触摸笔下笔,即触摸屏被压下 */ #define PEN_FLEETING 2 /* 触摸笔拖动 */

typedef struct { unsigned short pressure;/* 触摸笔动作 */ unsigned short x;

/* 触点x座标值 */ unsigned short y;

/* 触点y座标值 */ unsigned short pad;}TS_RET;

int main(){ int fd,ret,i;

unsigned char suba;TS_RET tsret;

fd = open(“/dev/touchscreen/0raw”, O_RDWR);/* 打开设备 */ if(fd ==-1){ printf(“nCan't open I2C device!n”);exit(-1);}

while(1){

ret = read(fd,(char *)&tsret, sizeof(TS_RET));

if(ret!= sizeof(TS_RET))

{

printf(“read touch screen error!”);

close(fd);

exit(-1);

}

else

{

printf(“pressure is: %dn”, tsret.pressure);

printf(“x is: %dn”, tsret.x);

printf(“y is: %dn”, tsret.y);

} }

close(fd);return 0;} 3.3.应用程序的调试

使用s3c2410_ts.c触摸屏驱动编写应用程序,读取触摸屏的触点坐标值及动作信息(触点x坐标值,y坐标及是否有压力值press),并在串口中断打印出来

对触摸屏设别的操作有打开设备,关闭设备,读操作等。编写应用程序读取触摸屏的触点坐标值及动作信息时,只需利用触摸屏驱动程序便可实现,先打开触摸屏设备,然后调用读函数即可。

其中,触摸笔动作取值如下: #define PEN_UP 0 #define PEN_DOWN

/* 触摸笔抬笔,即触摸屏不被压下 */ /* 触摸笔下笔,即触摸屏被压下 */

#define PEN_FLEETING 2 结构体定义如下: typedef struct { unsigned short pressure;unsigned short x;unsigned short y;unsigned short pad;}TS_RET 打开应用程序:

/* 触摸笔拖动 */

/* 触摸笔动作 */ /* 触点x座标值 */ /* 触点y座标值 */

3.2.6、实验结果显示:

第四部分 感想

第四章 心得

4.1 课程设计心得体会:

经过个人的努力和老师以及同学们的帮助和指导,我顺利的完成了本次《嵌入式系统原理》课程设计。本次课程设计为我提供了一个理论与实践相结合的机会,既锻炼了我的动手能力,又加深理解了在课堂所学习的理论知识。通过本次课程设计,将课本上的理论知识和实际应用有机结合起来,培养了我又动脑,又动手,独立思考分析问题的能力,提高了我运用所学知识解决实际问题的综合素质。通过本次课程设计我明白了只有不断的努力,不断的学习,才能在将来遇到的问题中能够游刃有余,才能够不会捉襟见肘。

参考文献 程昌南,方强等.《ARM Linux入门与实践 》【M】.北京:北京航空航天大学出版社,2008.10 2 张晓林等.《嵌入式系统设计与实践》【M】.北京:北京航空航天大学出版社,2006.1 3 李俊等.《嵌入式Linux设备驱动开发详解》【M】.北京:北京人民邮电出版社,2008.3 4 黄智伟,邓月明,王彦.《ARM9嵌入式系统设计基础教程》.北京:北京航空航天大学出版社,2008.8

第四篇:触摸屏材料总结和触摸屏发展趋势

触摸屏材料总结和触摸屏发展趋势

目前触摸屏的应用范围从以往的银行自动柜员机、工控计算机等小众商用市场,迅速扩展到手机、PDA、GPS(全球定位系统)、MP3,甚至平板电脑(UMPC)等大众消费电子领域。展望未来,触控操作简单、便捷,人性化的触摸屏有望成为人机互动的最佳界面而迅速普及。

目前的触控技术尚存在屏幕所使用的材源透光较差影响显示画面的清晰度,或者长期使用后出现坐标漂移、影响使用精度等问题。而且,全球主要触摸屏生产大厂多集中在日、美、韩等国家以及我国台湾地区;主要技术、关键零组件和原材料更是基本掌握在日、美厂商手中,中国大陆的触摸屏/触控面板产业还基本处于起步阶段。但正因如此,整个触控行业未来的上升空间还非常大,它也有望成为我国电子企业今后创新发展、大有作为的重要领域。

触摸屏起源于20世纪70年代,早期多被装于工控计算机、POS机终端等工业或商用设备之中。2007年iPhone手机的推出,成为触控行业发展的一个里程碑。苹果公司把一部至少需要20个按键的移动电话,设计得仅需三四个键就能搞定,剩余操作则全部交由触控屏幕完成。除赋予了使用者更加直接、便捷的操作体验之外,还使手机的外形变得更加时尚轻薄,增加了人机直接互动的亲切感,引发消费者的热烈追捧,同时也开启了触摸屏向主流操控界面迈进的征程。

目前,触摸屏应用范围已变得越来越广泛,从工业用途的工厂设备的控制/操作系统、公共信息查询的电子查询设施、商业用途的提款机,到消费性电子的移动电话、PDA、数码相机等都可看到触控屏幕的身影。当然,这其中应用最为广泛的仍是手机。根据调研机构ABIResearch报告指出,2008年采用触控式屏幕的手机出货量将超过1亿部,预计2012年安装触控界面的手机出货量将超过5亿部。

而且有迹象表明,触摸屏在消费电子产品中的应用范围正从手机屏幕等小尺寸领域向具有更大屏幕尺寸的笔记本电脑拓展。目前,戴尔、惠普、富士通、华硕等一线笔记本电脑品牌厂商都计划推出具备触摸屏的笔记本电脑或UMPC。当然,目前关于配备触摸屏的笔记本电脑是否能从10英寸以下的低价笔记本电脑或UMPC,扩大到14英寸以上的主流笔记本电脑市场,业界仍存争论。因为对于主流笔记本电脑或台式机来说,消费者多已习惯了使用键盘及鼠标进行输入,不像小尺寸笔记本电脑,因可容纳的键盘数量有限,需触摸屏加以辅助,达到更直观的人机沟通目的。而且现在Windows系统尚不支持多点触控功能,如由PC厂商单独导入多点触控功能,在软件上的努力与投资又将极为可观,因此预计到2010年支持多点触控的新操作系统Windows7上市之前,配备触摸屏的笔记本电脑仍将局限于12.1英寸以下。但即便如此,触摸屏市场未来的发展前景也十分诱人。根据市场调研机构的预测,到2010年触摸屏产值将达到35亿美元。

依照感应方式的不同,触摸屏大致可以分为电阻式、电容式、红外线式、超音波式四类。其中电阻式与电容式目前的市场前景最被看好,其他技术短期内恐很难赶上。

就技术原理来看,电阻式触摸屏只能算是一种“类触控”技术。它采用两层镀有导电功能的ITO(铟锡氧化物)PET塑料膜,PET本身具有一定的透明度与耐用性,两片ITO设有微粒支点,使屏幕在未被压按时两层ITO间有一定的空隙,处于未导电的状态。当操作者以指尖或笔尖压按屏幕(外层PET膜)时,压力将使PET膜内凹,因变形而使铟锡氧化物导电层接触导电,再通过侦测X轴、Y轴电压变化换算出对应的压力点,完成整个屏幕的触按处理机制。由于此种技术成本低廉,现已大量应用于电子产品之上。目前电阻式触摸屏有4线、5线、6线与8线等多种类型,线数越多,代表可侦测的精密度越高,但成本也会相对提高。

不过,仔细考量电阻式触控技术的原理就会发现,通过触按屏幕触发ITO薄膜导电的侦测机制,在物理上有其局限性:电阻式技术想要增加侦测面积与分辨率,最直接的方法就是增加线数,但线数的提高也代表着处理运算信息量的增加,这对处理器将是一大负担,同时成本的提升也是问题。另外,PET膜再怎么强化,材质的耐压性、耐磨性、抗变形能力,毕竟有其极限,长时间运用一定会减低铟锡氧化物导电层接触导通效率,触按点也会因经常使用的就是那几处,造成特定区域过度使用磨损,而降低透明度。

电容式触摸屏与电阻式比较,架构相对简单。由于电容式触摸屏中的投射电容式(电容式触摸屏主要分为投射电容式与表面电容式两种)可支持当前流行的多点触控功能,并拥有更高的屏幕透光率、更低的整体功耗、更长的使用寿命等优点,正不断挑战电阻式触摸屏的市场地位。

据isuppli公司预测,2008年全球具备触控功能的手机,仍以电阻式触控技术为主,产值可达4900万美元,预计2012年将达6500万美元;而投射电容式触控技术2008年产值虽然只有1000万美元,占整个市场份额的17%,但估计2012年投射电容式产值将突破2000万美元,市场比重跃升至23%。

但是电容式触控也有许多值得关注的问题:比如液晶屏非常靠近铟锡氧化物模板,新的技术甚至直接将两者做在同一个真空堆栈中,形成一个模组。而为了达到触点侦测功效,铟锡氧化物模板又需不断地扫描像素,会持续散发干扰信号,影响整个模组的操作。另外,厂商虽然会对触摸屏的表面进行硬化处理,可是为了不隔绝掉ITO的表面电流,硬化镀层非常薄,当施加在触摸屏上的外力过大时,依然有伤到ITO的可能,对触摸屏造成损伤,降低使用寿命。因此,针对提高使用寿命问题,有厂商开发出了超声波式或红外线式触摸屏。特别是在导通线路精细度方面是制约电容屏发展的瓶颈问题,直接购买镀膜设备成本会增加很多,但是最近uninwell International最近推出的光刻银浆可以解决这方便的问题,此种材料可以将线细和线距控制在0.05mm以内,使得电容屏的投资成本大大降低。

红外线与超声波式触控技术的作用原理相仿。不过受限于传感器的尺寸,这两项技术目前多用于20英寸以上的屏幕,如医疗、ATM等装置上,同时产品的成本也会较高。

由于市场需求迅速增长,触控产业近年来也迅速蹿红,许多厂商纷纷投身其中。从触摸屏的产业状况来看,产业链大约可以分为上游零组件、原材料供应与材料加工,如玻璃基板制造、ITO薄膜制造、PET制造、化学材料供应、控制IC供应等;中游触摸屏/触控面板的制造;下游则大多是一些系统整合与终端厂商,如模组厂商、显示器厂商、家电厂商以及代理商等。

如果不算基本属于应用层面的下游厂商,目前中国大陆以及中国台湾地区的厂商主要致力于在产业链中游的触摸屏/触控面板制造领域拓展,且以电阻式产品为主,如大陆的富阳光电、华意电路、北泰显示、凰泽光电、深越光电、沃森电子、东莞冠智电子、广州恒利达等。深越光电除了提供电阻式触摸屏之外,还提供电容式与超声波式产品。同时有消息称,莱宝高科的触摸屏项目将切入ITO薄膜以及ITO导电玻璃的制造。我国台湾地区厂商切入时点较早,现在也已涌现出时纬科技、接口光电、洋华光电、奇菱科技、富晶通、嵩远光电、仕钦科技、远诺光电、宇宙光电、理义科技、胜华科技等一批触摸屏制造企业。

但触摸屏上游的零组件与材料供应基本上仍掌握在日本、美国供货商手中。比如玻璃基板的主要制造商有日商旭硝子、美商康宁;PET制造商为3M,住友、东丽;化学材料供货商为Uninwell,日矿、三井;胶材中的银胶有Uninwell,breakover-quick,Longtone,伊必艾科技、杜邦、3M,绝缘胶有藤仓、住友、杜邦、3M,双面胶有3M、日东电工,印刷胶有东洋纺等;ITOFilm制造为日东电工、尾池工业、帝人化成、东洋纺等。只有在控制IC领域,我国台湾地区的义隆电子与禾瑞亚还有较大的发言权。其次在ITO玻璃的制造中,台厂正太、冠华也有了较强的供应能力,但目前占该材料成本比重最多的ITOFilm供应几乎都是以日本厂商为主。

尽管触摸屏的实际应用越来越多,应用范围越来越广阔,可实际上该项技术仍然存在许多需要完善的地方,只有设计出更先进、智能、体贴的人机界面,使进行触控操作时更加直观、精准,同时又不影响系统的反应速度,才能有望成为人机交互的主流界面。最典型的例子就是触控操作中的回馈问题。在手机应用中,触摸屏很大程度上已经可以代替按键。可是从消费者的使用习惯角度出发,传统的按键仍然具有一个触摸屏所没有的特性——— 触感回馈。通过按键,很多使用者即使在不看键盘的情况下,也可以凭借触感判断拨打电话、发送短信,但目前通过触控屏幕却没有能力完成这项工作,使用者只有盯着屏幕,用手指瞄准,才能操作。未来,需要在虚拟按键上加入适当的按键回馈机制,例如声音或是震动装置,以更贴近消费者的使用习惯。

再者,触摸屏还有寿命和体积等问题。一般情况下,触摸屏的使用期限,肯定要远低于按键键盘,如果在屏幕上贴上保护膜,又会降低触摸屏操作的灵敏度和精确度。如果产品还有小型化的设计需求,那么过小的屏幕,会让触控操作更加困难,形成负面效果。

此外,许多业者现在还在致力开发如内嵌式触摸屏,应用于电子纸、OLED(有机发光二极管)等上的触摸屏等研发。可见,触摸屏行业的技术提升空间仍然很大,仍有很多潜在的市场需求尚待开发。因此也可看出,触摸屏作为一项新近兴起的输入控制界面,中国企业在这一领域仍然大有可为。

第五篇:基于plc的触摸屏总结

基于plc的触摸屏专业技能总结

专业:电子信息工程

学号:0414110111 姓名:王国发

这学期我们进行了有关PLC的科研技能训练,科研技能训练是大学中必不可少的一个环节,因为科研技能使培养学生的科研能力、创新意识和创新能力,通过科研技能训练,使学生掌握科学研究的过程和方法,能够初步掌握进行科学研究、科技论文写作的方法步骤,全面掌握 进行科技活动必备的素质要求,激发学生的专业热情和学习兴趣,为学生撰写毕业论文、进行毕业设计奠定基础,并能培养学生的科研组织能力和专业知识综合 运用能力,提高其与专业有关的综合素质,并且能提高创新能力!

一、触摸屏的现状与应用

PLC(Programmable Logical Controller)通常称为可编程逻辑控制器,是一种以微处理器为基础,综合了现代计算机技术、自动控制技术和通信技术发展起来的一种通用的工业自动控制装置,由于它拥有体积小、功能强、程序设计简单、维护方便等优点,特别是它适应恶劣工业环境的能力和它的高可靠性,使它的应用越来越广泛,已经被称为现代工业的三大支柱(即PLC、机器人和CAD/CAM)之一。

PLC基于电子计算机,但并不等同于计算机。普通计算机进行入出信息交换时,大多只考虑信息本身,信息入出的物理过程一般不考虑的。而PLC则要考虑信息入出的可靠性、实时性、以及信息的实际使用。特别要考虑怎样适应于工业环境,如便于安装便于门内外感应采集信号,便于维修和抗干扰等问题,入出信息变换及可靠地物理实现,可以说是PLC实现控制的两个基本点。PLC可以通过他的外设或通信接口与外界交换信息。其功能要比继电器控制装置多得多、强得多。PLC有丰富的指令系统,有各种各样的I/O接口、通信接口,有大容量的内存,有可靠的自身监控系统,因而具有以下基本功能:

1逻辑处理功能; 2数据运算功能; 3准确定时功能; 4高速计数功能;

5中断处理(可以实现各种内外中断)功能; 6程序与数据存储功能; 7联网通信功能 ; 8自检测、自诊断功能。

可以说,凡普通小型计算机能实现的功能,PLC几乎都可以做到。像 PLC这样,集丰富功能于一身,是别的电控制器所没有的,更是传统的继电器控制电路所无法比拟的。丰富的功能为PLC 的广泛应用提供了可能,同时,也为自动门行业的远程化、信息化、智能化创造了条件。

人机界面是在操作人员和机器设备之间做双向沟通的桥梁,用户可以自由的组合文字、按钮、图形、数字等处理或监控管理及应付随时可能变化信息的多功能显示屏幕。随着机械设备的飞速发展,以往的操作界面需由熟练的操作员才能操作,而且操作困难,无法提高工作效率。但是使用人机界面能够明确指示并告知操作员设备目前的状况,使操作变的简单生动,并且可以减少操作上的失误,即使是新手也可以轻松的操作整个机器设备。使用人机界面还可以使机器的配线标准化、简单化,同时也能减少PLC控制器所需的I/O点数,降低生产的成本。同时由于面板控制的小型化及高性能,相对的提高了整套设备的附加价值。

触摸屏是“图形操作终端”“GOT”在工业控制中的通俗叫法,这种液晶显示器具有人体感应功能,当手指触摸到触摸屏上的图形时,可发出操作指令。

一、触摸屏的简要结构、原理 1.电阻式触摸屏原理

触摸屏工作时,上下导体层相当于电阻网络,当某一层电极加上电压时,会在该网络上形成电压梯度。如有外力使得上下两层在某一点接触,则在电极未加电压的另一层可以测得接触点处的电压,从而知道接触点处的坐标。

2.电容式触摸屏原理(1)表面电容触摸屏通过人体的感应电流来进行工作。它采用一层铟锡氧化物(ITO),外围至少有四个电极。当一个接地的物体靠近时,例如手指,流经这四个电极的电流与手指到四角的距离成正比,控制器通过对这四个电流比例的精确计算,得出触摸点的位置。

(2)投射电容式触摸屏。当手指靠近从一个电极到另一个电极的电场线时,相邻电极耦合产生的电容产生变化,控制器收集变化信息,从而计算出位置。这种触摸屏的最大优势是实现了多点触控,使得用户的操作更加便捷。

(3)红外线触摸屏原理

在屏幕周边,成对安装红外线发射器和红外线接受器,形成紧贴屏幕前密布X、Y方向上的红外线矩阵,通过不停的扫描是否有红外线被物体阻挡检测并定位用户的触摸。

(4)声波式触摸屏原理

表面声波触摸屏是利用声波可以在刚体表面传播的特性设计而成。以X轴为例,控制电路产生发射信号(电信号),该电信号经玻璃屏上的X轴发射换能器转换成超声波,超声波在前进途中遇到45度倾斜的反射线后产生反射,产生和入射波成90度、和Y轴平行的分量,该分量传至玻璃屏X方向的另一边也遇到45度倾斜的反射线,经反射后沿和发射方向相反的方向传至X轴接收换能器。X轴接收换能器将回收到的声波转换成电信号。控制电路对该电信号进行处理得到表征玻璃屏声波能量分布的波形。有触摸时,手指会吸收部分声波能量,回收到的信号会产生衰减,程序分析衰减情况可以判断出X方向上的触摸点坐标。同理可以判断出Y轴方向上的坐标,X、Y两个方向的坐标一确定,触摸点自然就被唯一地确定下来。

各类触摸屏横向比较

 电阻式:触摸屏处于一种对外界完全隔离的工作环境,不怕灰尘、水汽和油污,可以用任何物体来触摸。精度非常高,可用来作图,书写。价格合理。

 电容式:最大优势是能实现多点触控,操作最随意。不足的是精度较低,受周围环境电场影响可能产生漂移,价格较高。

 红外线式:红外触摸屏不受电流、电压和静电干扰,但对光照较为敏感。价格较低,维护方便。

 声波式:屏幕多为钢化玻璃,清晰度高,透光率好。高度耐久,抗刮伤性良好。多用于各种公共场合如ATM,自动售票机等。

二、触摸屏的画面制作及基本操作

1、GOT的接线及与计算机、PLC的连接 作为PLC的图形操作终端,GOT必须与PLC联机使用,通过操作人员手指与触摸屏上的图形元件的接触发出PLC的操作指令或者显示PLC运行中的各种信息。

2.GOT的画面功能(用户画面功能、系统画面)(1)用户画面功能(用户制作的画面)(2)系统画面功能 ① 监视功能

② 数据采样功能 ③ 报警功能 ④ 其他功能

三、触摸屏的选用

由于在此系统中,触摸屏要担任监控各部分运行状态,而且还用于控制作用,所以在此担任的任务还是比较重的。所以在此选定的触摸屏为MT506T型号。

①可实时显示设备和系统的运行状态。

②通过触摸向PLC发出指令和数据,再通过PLC完成对系统或设备的控制。

③可做成多幅多种监控画面,替代了传统的电气操作盘及显示记录仪表等,且功能更加强大。

四、触摸屏程序设计

本系统的触摸屏人机交互界面的开发平台,采用MT506触摸屏的编程软件实现。该软件类似于组态软件,采用图形化的编程方法,只需将相关元件拖到预先定义的画面上,根据需要设置相关参数、合理配置PLC写入地址即可完成操作。

五‘GT-Designer2 画面制作软件介绍

三菱触摸屏的用户画面制作软件有FX-PCS-DU/WIN-C和GT-Designer等,前者主要用于制作F900系列触摸屏的画面,后者用于高档触摸屏(如A900系列、GT11系列、GT15系列)画面的制作,也可用于F900系列触摸屏。

触摸屏作为一种新型的人机界面,从一出现就受到关注,它的简单易用,强大的功能及优异的稳定性使它非常适合用于工业环境,甚至可以用于日常生活之中,应用非常广泛,比如:自动化停车设备、自动洗车机、天车升降控制、生产线监控等,甚至可用于智能大厦管理、会议室声光控制、温度调整。

随着科技的飞速发展,越来越多的机器与现场操作都趋向于使用人机界面,PLC控制器强大的功能及复杂的数据处理也呼唤一种功能及与之匹配而操作又简单的人机的出现,触摸屏的应运而生无疑是21世纪自动化领域里的一个巨大的革新。

通过科研技能训练,我发现要干好一件事情必须要不怕困难,坚持到底,只有这样才会战胜困难,赢得最后的胜利。作为信息时代的大学生,我们应该有这种不怕辛苦,勇于创新的精神。另外,理工科的学生不是只有会计算和实验就够了的,培养表达能力也很重要,要懂得把自己的想法恰如其分的表达清楚,梳理成文章,让感兴趣的人很好的欣赏自己的创作。所以通过科研技能训练,让我在原有水平上有了一个量的提高,对我以后的发展和专业水平的提高有很大的帮助,我想我会一直努力用理论联系实际的方法不断提高自己,奔向人生最高处。

下载linux串口触摸屏设计总结word格式文档
下载linux串口触摸屏设计总结.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    单片机串口通信方式总结

    IIC总线通信协议————数据传输高位在前p233 1,起始和停止条件 开始信号:SCL为高电平,SDA由高电平向低电平跳变,开始传送数据。 void start() // 开始位 { SDA = 1; //SDA初始化......

    基于触摸屏的丝网印刷技术的设计应用

    基于MCGS触摸屏的丝网印刷控制系统 李文铅,刘鹤 摘要:本课题研究主要是在原有的半自动丝网印刷机的手动控制的基础上,应用PLC控制技术、变频控制技术、人机交互技术等设计出以......

    串口调试助手使用说明和技术总结大全

    串口调试助手的技术报告 1. 软件简介 串口调试助手是在Windows平台下开发的,工具是VC++6.0。串口调试助手版支持常用的300 ~ 115200bps波特率,能设置校验、数据位和停止位,能以......

    北尔触摸屏使用总结(精选五篇)

    北尔触摸屏使用总结 盐锅峡工程采用的北尔触摸屏,为首次使用,现总结如下: 优点: 1. 触摸屏画面相对easyview美观一些 与easyview相比较,画面要美观一些,功能也要比easyview多一些,......

    基于多单片机的串口扩展设计论文[5篇材料]

    1 前言笔者在用单片机开发一款称重仪表时,功能较多,对串口的需求很高。需要的串口数量多,至少要五个串口,包括称重传感器通信串口,电脑上位机通信串口,GIM900A 通信串口,大屏幕数码......

    STC单片机串口在线烧录芯片问题总结

    STC单片机串口在线烧录芯片问题总结在一个偶然和朋友聊天中了解了STC单片机芯片,从此一发不可收拾。当时我看中STC芯片的一个主要原因是因为它有AD转换功能和在线烧录功能。......

    台达DOPB10E615触摸屏与PLC通信总结

    台达DOPB10E615触摸屏与PLC通信总结 触摸屏与s7300通信可以有direct MPI 、ISO TCP通信、with PC adapter通信,现对前两种通信方式设置过程进行介绍。 1、所需软件 ①Screen......

    STC12C5A60S2串口通信keil与proteus调试 自己总结

    STC12C5A60S2串口调试 需要软件: 在keil里安装。在debug里设置仿真器为: 点击MCU连接程序: RS232: 虚拟终端: 程序: #include "STC12C5A60S2.h" #include "intrins.h" typedef un......