欧美色欧美亚洲高清在线观看,国产特黄特色a级在线视频,国产一区视频一区欧美,亚洲成a 人在线观看中文

  1. <ul id="fwlom"></ul>

    <object id="fwlom"></object>

    <span id="fwlom"></span><dfn id="fwlom"></dfn>

      <object id="fwlom"></object>

      linux串口觸摸屏設(shè)計(jì)總結(jié)

      時間:2019-05-12 08:04:34下載本文作者:會員上傳
      簡介:寫寫幫文庫小編為你整理了多篇相關(guān)的《linux串口觸摸屏設(shè)計(jì)總結(jié)》,但愿對你工作學(xué)習(xí)有幫助,當(dāng)然你在寫寫幫文庫還可以找到更多《linux串口觸摸屏設(shè)計(jì)總結(jié)》。

      第一篇:linux串口觸摸屏設(shè)計(jì)總結(jié)

      Linux serial touch 設(shè)計(jì)總結(jié)

      概述:

      最近在做嵌入式linux下串口觸摸屏設(shè)計(jì),遇到一些問題,經(jīng)過查找資料和請教同事,總算把問題解決了,事后有把linux相關(guān)的內(nèi)核代碼仔細(xì)看了一遍,為了有點(diǎn)成果,特別寫了個總結(jié)。如有任何問題請聯(lián)系yxj_5421@163.com,轉(zhuǎn)載請標(biāo)明出處。

      系統(tǒng)資源:

      Linux:2.6.36

      UI:QT+TSLIB 硬件資源不關(guān)心

      設(shè)計(jì)方法:

      有兩種實(shí)現(xiàn)途徑。

      1、是將要使用的串口單獨(dú)拿出來,作為一個platform總線設(shè)備實(shí)現(xiàn),在嵌入式平臺mach文件里面,加上串口中斷號和寄存器首地址,然后將這個串口注冊成一個platform總線設(shè)備。在驅(qū)動probe函數(shù)里面需要得到這個串口中斷號以及寄存器映射地址,通過寄存器映射地址設(shè)置串口波特率,數(shù)據(jù)位,停止位等,通過中斷號注冊中斷等,然后調(diào)用input_register_device注冊一個input設(shè)備。在中斷里面得到外面觸摸屏的數(shù)據(jù),然后根據(jù)input touch協(xié)議上報觸摸數(shù)據(jù)。這種方法實(shí)現(xiàn)簡單明了,不需要和linux的tty,serio等打交道。但是要求知道串口硬件spec,比如寄存器等,而且這個串口就只能給觸摸屏使用了,不能作為tty使用。因?yàn)槭乔度胧介_發(fā),因此很容易知道硬件spec,而且嵌入式平臺一旦確定,那么這個串口肯定就是給觸摸屏使用了。因此在嵌入式平臺上,推薦使用這個方法。

      是將串口作為一個serio總線設(shè)備,利用linux內(nèi)核提供serio總線驅(qū)動,通過設(shè)置對應(yīng)的串口,調(diào)用serport提供的函數(shù)將串口當(dāng)做serio總線設(shè)備,在驅(qū)動里面需要按照serio總線設(shè)備驅(qū)動的框架來實(shí)現(xiàn),這方面的例子linux里面有很多,比如touchright.c,在模塊init函數(shù)里面調(diào)用serio_register_driver注冊serio總線設(shè)備驅(qū)動,如果serio總線上對應(yīng)的serio設(shè)備存在,就調(diào)用connect函數(shù),在這個函數(shù)里面調(diào)用input_register_device注冊一個input設(shè)備。具體驅(qū)動不再分析了,很簡單,相信各位都能看的懂。

      至此,兩種方法都實(shí)現(xiàn)了串口觸摸屏的驅(qū)動,講到這里是不是就完了,非也,本文的重點(diǎn)還在后面,請看下面分析:

      第一種方法只要驅(qū)動模塊被加載,就會在/dev/input下面創(chuàng)建一個eventx節(jié)點(diǎn),tslib就能訪問這個節(jié)點(diǎn),獲得觸摸坐標(biāo),然后送給qt。第二種方法驅(qū)動模塊加載后,并沒有創(chuàng)建eventx節(jié)點(diǎn),也就是說connect函數(shù)沒有被調(diào)用,按照linux驅(qū)動模型來看,就是serio總線上還沒有對應(yīng)的serio設(shè)備,因此驅(qū)動加載時沒有對應(yīng)的設(shè)備,就不會調(diào)用connect函數(shù),這時的串口還是作為一個linux tty設(shè)備存在。

      我遇到的問題就是serio驅(qū)動加載了,但是沒有創(chuàng)建eventx節(jié)點(diǎn),查找資料也只有一個說是要把tty設(shè)置成N_MOUSE,然后讀,說的不清楚,也不知道怎么實(shí)現(xiàn),經(jīng)過自己摸索,終于把問題解決了。

      2、Linux 啟動后串口形式: Linux一啟動是將串口作為tty來設(shè)置的??聪碌恼{(diào)用:

      start_kernel

      init/main.c大家對這個函數(shù)不陌生吧,linux啟動過程中重要的一個函數(shù)

      console_init();

      drivers/tty/tty_io.c

      tty_register_ldisc(N_TTY, &tty_ldisc_N_TTY);drivers/tty/tty_idisc.c 給串口注冊一個tty鏈路層處理函數(shù)ops。

      現(xiàn)在我們需要寫一個上層的應(yīng)用程序,對這個tty進(jìn)行設(shè)置,需要設(shè)置波特率,數(shù)據(jù)位,停止位等,最重要的是要將這個tty設(shè)備設(shè)置成一個serio總線設(shè)備,然后把它注冊在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就是對應(yīng)要使用的那個串口,linux里面一般是/dev/ttyS0,首先是打開串口 open(device, O_RDWR | O_NOCTTY | O_NONBLOCK)接著設(shè)置波特率等 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);

      接下來就是重點(diǎn)了

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

      跟蹤代碼到內(nèi)核層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鏈路層的處理函數(shù)ops,如果沒有,就需要加載serport模塊,看看這個模塊init函數(shù) retval = tty_register_ldisc(N_MOUSE, &serport_ldisc);注冊一個N_MOUSE鏈路層的處理函數(shù)ops 創(chuàng)建一個新的N_MOUSE鏈路層new_ldisc,接著調(diào)用 tty_ldisc_assign(tty, new_ldisc);

      把新的鏈路層放在tty里面 retval = tty_ldisc_open(tty, new_ldisc);打開這個新的鏈路層

      至此,已經(jīng)給串口增加了一個N_MOUSE的鏈路層,并且把鏈路層的處理函數(shù)也注冊進(jìn)去了。這個串口當(dāng)前的鏈路層就是N_MOUSE。目前為止串口還只是個tty設(shè)備,并沒有注冊到serio總線上。繼續(xù)看我們的應(yīng)用程序:

      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 這個函數(shù)里面會創(chuàng)建一個serport結(jié)構(gòu)體,并初始化

      調(diào)用

      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)設(shè)置

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

      =(type & 0x0000ff00)>> 8;serport->id.extra =(type & 0x00ff0000)>> 16;這里三個值一定要和serio總線驅(qū)動里面對應(yīng)的值一致,serio總線就是靠它們來給設(shè)備和驅(qū)動建立聯(lián)系的。

      調(diào)用

      read(fd, NULL, 0);跟蹤代碼到內(nèi)核層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當(dāng)前的鏈路層結(jié)構(gòu),上面我們已經(jīng)設(shè)置N_MOUSE為tty的當(dāng)前鏈路層,因此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總線設(shè)備,關(guān)于serio總線,網(wǎng)絡(luò)有很多資料介紹,這里就不說了。至此,我們的串口設(shè)備已經(jīng)當(dāng)做serio總線設(shè)備注冊在serio總線上了,如果相應(yīng)的驅(qū)動也在serio總線上,就會進(jìn)行設(shè)備和驅(qū)動的匹配,然后調(diào)用驅(qū)動里面的connect函數(shù),在這個函數(shù)里面就會創(chuàng)建input節(jié)點(diǎn)。我們的驅(qū)動和設(shè)備已經(jīng)運(yùn)行起來了,現(xiàn)在看看數(shù)據(jù)是如何傳遞的

      先看具體串口中斷函數(shù): 我們以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就是我們驅(qū)動函數(shù)提供一個函數(shù),它每次接受一個字符,在這個函數(shù)里面,接受到足夠信息后,就能得到觸摸屏坐標(biāo)信息,然后通過input_report上報上去。看看數(shù)據(jù)處理流程圖:

      總結(jié):

      要想讓基于serio總線驅(qū)動的串口觸摸屏能正常工作,在linux內(nèi)核需要加載驅(qū)動模塊,serport模塊。還需要一個上層應(yīng)用程序,這個程序需要進(jìn)行以下工作

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

      open(device, O_RDWR | O_NOCTTY | O_NONBLOCK)

      device為/dev/ttyS0

      2、設(shè)置串口波特率等,和你的串口觸摸屏一致

      3、給串口增加一個N_MOUSE鏈路層

      4、設(shè)置你的串口觸摸屏type,id,extra

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

      第二篇:單片機(jī)串口總結(jié)

      51單片機(jī)串口總結(jié)

      有句話說“盡信書不如無書”,要學(xué)好單片機(jī)就要不斷的、大膽的實(shí)驗(yàn),要多懷疑,即使我們的懷疑最終被證明是錯誤的那么這也是進(jìn)步(人們認(rèn)識事物很多情況下來源于懷疑),當(dāng)懷疑出現(xiàn)時就要去實(shí)踐。有很多東西如果不通過實(shí)踐是不可能掌握其中隱藏的奧秘,就拿51單片機(jī)串口通訊這一塊,我認(rèn)為掌握很好了,可以很輕松的實(shí)現(xiàn)數(shù)據(jù)的接收、發(fā)送,但這段時間當(dāng)我重新學(xué)習(xí)串口時,我才發(fā)現(xiàn)里面還有很多小細(xì)節(jié)從沒注意,更別說研究了。對于接收發(fā)送程序永遠(yuǎn)是按照別人的模式來編寫程序,并沒有真真正正的挖掘深層次的內(nèi)容。我身邊太多的人在臨摹別人的程序,當(dāng)然我不反對,但是希望自己多問幾個問什么,單純的會編程是學(xué)不好單片機(jī)的,畢竟單片機(jī)有自己獨(dú)特的硬件結(jié)構(gòu)。

      開講之前先簡要說一下同步、異步通信:

      同步通信:發(fā)送方時鐘對接收方時鐘控制,使雙方達(dá)到完全同步。

      異步通信:發(fā)送與接受設(shè)備使用各自的時鐘控制數(shù)據(jù)的發(fā)送和接受過程(雖然時鐘不同,但一般相差不大)。

      51單片機(jī)串行口結(jié)構(gòu)

      從上圖中我們看到,51單片機(jī)有兩個物理上獨(dú)立的接收、發(fā)送緩沖器SBUF,它們共用同一個地址99H,但是請注意:接收緩沖器只能讀而不能寫,發(fā)送緩沖器只寫不讀。單片機(jī)可以同時實(shí)現(xiàn)數(shù)據(jù)的發(fā)送與接收功能。

      特別注意:接收器是雙緩沖結(jié)構(gòu):當(dāng)前一個字節(jié)從接收緩沖區(qū)取走之前,就已經(jīng)開始接收第

      二個字節(jié)(串行輸入至移位寄存器),此時如果在第二個字節(jié)接收完畢而前一個字節(jié)還未被讀走,那么就會丟失前一個字節(jié)。

      51單片機(jī)串口控制寄存器

      關(guān)于51單片機(jī)的控制寄存器各個位表示的含義在這里我只談SM2。

      SM2為多機(jī)控制位,主要用于工作方式2和3,當(dāng)接收機(jī)的SM2=1時,可以利用接收到的RB8來控制是否激活RI(RB8=0不激活RI,收到的數(shù)據(jù)丟失;RB8=1時收到的數(shù)據(jù)進(jìn)入SBUF,并激活RI ,進(jìn)而在中斷服務(wù)程序中將數(shù)據(jù)從SBUF中讀走)。當(dāng)SM2=0時,不論收到的RB8為何值都將使接收到的數(shù)據(jù)進(jìn)入SBUF,并激活RI,通過控制SM2實(shí)現(xiàn)多機(jī)通信。

      51單片機(jī)串口通訊方式

      51串口通訊方式有3種,方式0、方式

      1、方式2與方式3,他們的工作模式不盡相同。首先他們的波特率很容易忽視。方式0與方式2的波特率固定,而方式1和3的波特率由T1的溢出率決定。

      方式0的波特率=f/12

      系統(tǒng)晶振的12分頻,換句話說12M晶振的情況下,其波特率可達(dá)1M,速度是很高的(當(dāng)我們在選用串行器件并采用方式0時需要特別注意器件所能允許的最大時鐘頻率)。

      方式2 =f/64或f/32(當(dāng)SMOD=1時為f/32,SMOD=0時為f/64)。

      曾經(jīng)我用方式2進(jìn)行MODBUS通信時,總是通訊失敗,我仔細(xì)檢查程序,沒有發(fā)現(xiàn)邏輯錯誤,特別是當(dāng)我參考別人的程序時,發(fā)現(xiàn)很少有人用方式2進(jìn)行MODBUS通訊,所以當(dāng)時自己妄下結(jié)論51單片機(jī)的串行方式2不可用,直到有一天夜里我突然想起方式2的波特率是固定的,試想晶振11.0592M/32或11.0592M/64怎么也不可能是9600啊,怎么可能通信成功。這才恍然大悟,看來還是自己太武斷了,沒有認(rèn)真看書啊。有時我們認(rèn)為我們犯這樣的錯誤很低級,其實(shí)我們很多次都是因?yàn)檫@樣的小細(xì)節(jié)導(dǎo)致我們整個系統(tǒng)不正常,正所謂“千里之堤毀于蟻穴”,這些細(xì)節(jié)真的傷不起啊。

      方式1、3波特率=(2smod/32)*T1的溢出率,其中TI的溢出率=f/{12*[256-(TH1)]}.關(guān)于3種通訊方式其中有幾點(diǎn)特別容易出錯:

      1、無論采用哪種通訊方式,數(shù)據(jù)發(fā)送和接受都是低位在先,高位在后。、3種方式作為輸出,由于輸出是CPU主動發(fā)送,不會產(chǎn)生重疊錯誤,當(dāng)數(shù)據(jù)寫入SBUF后,發(fā)送便啟動(通過單片機(jī)內(nèi)部邏輯控制,與程序無關(guān)),當(dāng)該字節(jié)發(fā)送結(jié)束(SBUF空),置TI。不要理解為當(dāng)數(shù)據(jù)一寫入SBUF就置位TI,如果中斷允許則在中斷中發(fā)送數(shù)據(jù),這就大錯特錯了。同樣作為輸入,可能會產(chǎn)生重疊錯誤(主要依賴于特定的環(huán)境),當(dāng)一個字節(jié)的數(shù)據(jù)接收完畢(SBUF滿)置位RI,表示緩沖區(qū)有數(shù)據(jù)提示CPU讀取。

      接下來通過一些實(shí)驗(yàn)具體說明串口通信中需要注意的地方 方式0輸出

      方式0主要功能是作為移位寄存器,將數(shù)據(jù)從SBUF中逐位移出,最常見的用法就是外接串入并出的移位寄存器,如74LS164。之前在做這一部分實(shí)驗(yàn)時總是利用單片機(jī)I/O端口模擬實(shí)現(xiàn),現(xiàn)在想想在串口未被占用的情況下,方式0是最好的實(shí)現(xiàn)方式。

      利用串口方式0,向74LS164輸出字符“0”的編碼,程序如下:

      該程序采用了中斷方式實(shí)現(xiàn),結(jié)果是通過74LS164使數(shù)碼管顯示“0”。實(shí)驗(yàn)結(jié)果如下:

      這里我說明幾點(diǎn): 如果采用查詢方式,并且只發(fā)送一遍,那么程序最后的while(1);不可以省略,否則會出現(xiàn)數(shù)碼管閃爍的現(xiàn)象(在KEIL環(huán)境下,main()函數(shù)也是作為一個調(diào)用函數(shù),最后也有返回RET,它不像C中的main()函數(shù),當(dāng)執(zhí)行完畢后就停止,而是重新復(fù)位執(zhí)行,如此反復(fù),這一點(diǎn)要特別注意)

      這是查詢方式下不加while(1);的現(xiàn)實(shí)效果 如果采用中斷方式發(fā)送,請記得中斷中清除TI,僅僅是為了解除中斷標(biāo)志,而不是等待發(fā)送結(jié)束,因?yàn)榇藭r數(shù)據(jù)早已離開了SBUF跑到外邊去了。3 74LS164最高25MHZ,采用方式0,沒有問題。

      方式0作為輸入模式

      以74ls165(最高時鐘25MHZ)為例,可以滿足要求。

      對應(yīng)結(jié)果如下:

      (注意:74ls165線傳送高位,而串口通信低位在先,所以顯示的數(shù)據(jù)和實(shí)際數(shù)據(jù)高低位正好相反

      P1.7---P1.0對應(yīng)D0---D7)。

      本程序只接收一次,也許有人會問,中斷程序中REN=0,表示什么意思?可不可以改成ES=0?

      這個問題很好,首先REN=0表示接收禁止,即不允許串口接收數(shù)據(jù);ES=0是禁止中斷和單片機(jī)是否接收數(shù)據(jù)沒有關(guān)系,不接收數(shù)據(jù)自然中斷允許也是徒勞,這兩者有很大的區(qū)別。我們在很多接收程序中經(jīng)常可以看到在判斷RI標(biāo)志后緊跟著清除標(biāo)志位,我想問一下,為什么?)

      如果我們也按照這種模式改寫會怎樣呢?

      實(shí)驗(yàn)結(jié)果如下

      兩次結(jié)果差異怎么這么大?為什么會這樣子?

      為了便于理解,也為了說明問題方便,對中斷程序做了如下處理:

      結(jié)果又變了

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

      首先中斷程序中當(dāng)判斷RI置位標(biāo)志后緊跟著清零是為了接收下一個字節(jié)的數(shù)據(jù),也為了避免單片機(jī)重復(fù)中斷。

      當(dāng)51單片機(jī)串口方式0作輸入時,在REN=1且RI=0的條件下就啟動了單片機(jī)串口接收過程。如果有一個條件不滿足就不能啟動接收過程,以上出現(xiàn)的錯誤正式由于忽略了這個重要的因素造成的。在RI清零后由于REN仍然為1,單片機(jī)已經(jīng)開始接收第二字節(jié)的數(shù)據(jù),由于串口速度很快,RI仍會置位,而緊接著將REN清零只能阻止單片機(jī)接收數(shù)據(jù),但是卻

      不能阻擋第二次中斷。由于只接收了部分外部引腳數(shù)據(jù)(此時外部引腳為高電平,即邏輯1,其實(shí)單片機(jī)只接收了一位,對于12M晶振而言,方式0大約8us接收一個字節(jié)數(shù)據(jù))。相反在RI=0與REN=0之間加上適當(dāng)?shù)难舆t,就可以保證一個字節(jié)的數(shù)據(jù)全部接收完畢,故此時我們讀上來的一個字節(jié)為0xff。

      我在中斷程序中添加了一個中斷計(jì)數(shù)器(不加延遲),發(fā)現(xiàn)中斷服務(wù)程序的確執(zhí)行了兩次

      結(jié)果如下

      加上延遲結(jié)果

      這就驗(yàn)證了剛才的結(jié)論。

      至于說可不可以換做ES=0,回答是可以的,盡管同樣可以實(shí)現(xiàn)數(shù)據(jù)的讀取,但是實(shí)質(zhì)不同,當(dāng)禁止中斷后,單片機(jī)仍在接收外部數(shù)據(jù),只是不再請求中斷,自然的不再讀取第2、3。。。字節(jié)的數(shù)據(jù),那么P1將保留第一次中斷時從SBUF中讀出的數(shù)據(jù)。如果某一時刻打開中斷發(fā)現(xiàn)結(jié)果不正常,如果理解了上面的機(jī)制就不會覺得驚訝了。建議:單次接收時,中斷服務(wù)程序中REN清零放在RI之前。

      還有一個問題非常重要:

      如果我在中斷服務(wù)程序中不清除RI,會怎樣?

      很少有人會這樣用,但是經(jīng)常有人忘記了(包括我)。課本上寫得很清楚,務(wù)必在中斷中用軟件清除RI,為什么要這樣呢?難道僅僅是為了接收下一次數(shù)據(jù)并且避免單片機(jī)不斷的響應(yīng)中斷?的確如此,如果對于一個小系統(tǒng)而言,不清除中斷標(biāo)志,那么單片機(jī)將不停的中斷,影響接下來任務(wù)的執(zhí)行,系統(tǒng)必然癱瘓,而且不能正常的接收數(shù)據(jù)??偨Y(jié):方式0作為發(fā)送方,只要向SBUF中寫入數(shù)據(jù)就啟動了發(fā)送過程;

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

      1、RI=0的情況下就已經(jīng)啟動了接收過程。在中斷程序中要注意兩者清零的順序。

      還有一種情況要特別注意:單片機(jī)復(fù)位時SCON自動清零,如果單片機(jī)不工作在方式0,那么如果采用位操作SCON時也要注意REN=1與SM0、SM1的書寫順序,總之切記方式0啟動發(fā)送、接收數(shù)據(jù)的條件。

      方式1 方式1為10位異步通信模式。作為輸出和方式0沒有本質(zhì)的區(qū)別,不同的是數(shù)據(jù)幀的形式,但是對于接受模式則有點(diǎn)不同,當(dāng)REN=1且RI=0時,單片機(jī)并不啟動接收過程。而是以已選擇波特率的16倍速率采樣RXD引腳的電平,當(dāng)檢測到輸入引腳發(fā)生1---0負(fù)跳變時,則說明起始位有效,才開始接受本幀數(shù)據(jù)。方式1模式下 單片機(jī)可以工作在全雙工以及半雙工方式。下面舉兩個例子

      半雙工

      主機(jī)發(fā)送某一字符,從機(jī)接收到數(shù)據(jù)后返回?cái)?shù)據(jù)加1的值 比如 主機(jī)發(fā)送“1“,從機(jī)收到后回復(fù)主機(jī)”2“。實(shí)驗(yàn)結(jié)果如下:

      方式1工作方式主要注意: 1 波特率可變。數(shù)據(jù)接收以起始位為標(biāo)志,停止位結(jié)束。當(dāng)RI=0且SM2=0或接收到有效停止位時,單片機(jī)將接收到的數(shù)據(jù)移入SBUF中,兩個條件缺一不可。

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

      作為輸出模式同方式1沒有區(qū)別,只是增加了第八位數(shù)據(jù)位,第八位數(shù)據(jù)可以用作校驗(yàn)位或在多機(jī)通信中用作數(shù)據(jù)/地址幀的判別位。

      首先我們來做模擬主從奇偶校驗(yàn)?zāi)J?/p>

      主機(jī)發(fā)送一幀數(shù)據(jù),并發(fā)送奇偶校驗(yàn)位,從機(jī)接收數(shù)據(jù)后,判斷數(shù)據(jù)是否正確,如果正

      確,接收指示燈亮,并且回送主機(jī)數(shù)據(jù)加1,反之回送0;主機(jī)接收從機(jī)信息,如果校驗(yàn)正確點(diǎn)亮LED指示燈.(從機(jī)、主機(jī)接收數(shù)據(jù)無論校驗(yàn)正確與否,均顯示接收到的字節(jié)數(shù)據(jù))。奇校驗(yàn)?zāi)J?演示結(jié)果如下:

      (注:從接接收不正確,返回0)

      主從機(jī)接收正確效果

      之前我們已經(jīng)介紹了SM2的具體用法,主要用于多機(jī)通信,將SM2作為數(shù)據(jù)/地址幀 的判別位,在接收地址時令SM2=1,當(dāng)接收到的第八位數(shù)據(jù)為1時激活RI產(chǎn)生中斷,然后比較地址,如果地址符合則清除SM2準(zhǔn)備接受數(shù)據(jù)信息,反之不理睬。

      特別注意 當(dāng)RI=0且SM2=0(或SM2=1時接收到第9位數(shù)據(jù)為1)時,單片機(jī)將接收到的數(shù)據(jù)移入SBUF中,兩個條件缺一不可。

      在這里我只舉一個簡單的例子 一個主機(jī),兩個從機(jī) 起始時,主機(jī)從機(jī)的SM2均置位,所有的從機(jī)等待主機(jī)發(fā)送地址幀,主機(jī)令TB8=1,發(fā)送地址幀。所用的從機(jī)將接受到的地址和自己的地址比較,如果符合,點(diǎn)亮LED指示燈,清除SM2(準(zhǔn)備接受主機(jī)發(fā)送的數(shù)據(jù)幀),并將自己的地址發(fā)送到主機(jī)。主機(jī)接收從機(jī)發(fā)送的地址信息,如果地址符合則數(shù)碼管顯示從機(jī)地址并開始準(zhǔn)備發(fā)送數(shù)據(jù),反之發(fā)復(fù)位信號,TB8=1。從機(jī)接收數(shù)據(jù)先判斷RB8,如果RB8=1,則復(fù)位,重新開始接收主機(jī)發(fā)送的地址幀,反之通過P1口外接數(shù)碼管顯示接收到的數(shù)據(jù)。實(shí)驗(yàn)結(jié)果如下:

      注意:如果主機(jī)沒有得到正確的地址,則將按照一定的速率發(fā)送地址幀,直到接收正確的地址為止,該試驗(yàn)主機(jī)向從機(jī)2發(fā)送信息。

      另外在這里我補(bǔ)充兩點(diǎn): 我們可以很方便的利用串口通信的工作方式2或3實(shí)現(xiàn)奇偶校驗(yàn),注意技巧,當(dāng)為偶校驗(yàn)時TB8=P,奇校驗(yàn)時TB8=~P;

      2當(dāng)單片機(jī)利用中斷發(fā)送大量數(shù)據(jù)時,盡量采用中斷發(fā)送,因?yàn)閱纹瑱C(jī)在寫入SBUF數(shù)據(jù)后由硬件將數(shù)據(jù)發(fā)送完,在發(fā)送過程中,單片機(jī)還可以做很多事情,利用中斷發(fā)送數(shù)據(jù)可以提高CPU利用率。尤其在低波特率時效果更明顯。

      第三篇:嵌入式論文關(guān)于觸摸屏設(shè)計(jì)

      嵌入式實(shí)驗(yàn)課程設(shè)計(jì)

      目 基于嵌入式的觸摸屏控制實(shí)驗(yàn)

      電子工程系

      業(yè)

      信息工程

      學(xué)

      20092309022

      楊 金 磊

      指導(dǎo)教師

      董立軍

      二O一二 年 六 月 八 日

      目 錄

      1.要求.............................................................2 1.1設(shè)計(jì)目的......................................................1 1.2 設(shè)計(jì)意義......................................................2 1.3 設(shè)計(jì)內(nèi)容......................................................2 1.4 主要任務(wù)......................................................2 2.正文.............................................................3 2.1觸摸屏工作原理(觸摸屏接口工作模式)..........................3 2.2、設(shè)計(jì)總體方案.................................................4 2.3、設(shè)計(jì)所需工具.................................................5 2.4、平臺構(gòu)建過程.................................................5

      2.4.1、硬件平臺搭建.............................................5 2.4.2根文件系統(tǒng)的制作...........................................7(1)根文件系統(tǒng).................................................7 3.程序............................................................11 3.1.程序流程圖:.................................................11 3.2.分析驅(qū)動.....................................................11 3.2.1、觸摸屏設(shè)備驅(qū)動中數(shù)據(jù)結(jié)構(gòu)................................11 3.2.2、觸摸屏驅(qū)動模塊加載和卸載函數(shù)............................13 3.2.3、觸摸屏設(shè)備驅(qū)動的讀函數(shù)..................................15 3.2.4、觸摸屏設(shè)備驅(qū)動的輪詢與異步通知..........................15 3.2.5源程序觸摸屏驅(qū)動代碼:....................................16 3.2.6、實(shí)驗(yàn)結(jié)果顯示:..........................................27 4.心得............................................................28 4.1 課程設(shè)計(jì)心得體會:...........................................28 5.參考文獻(xiàn)........................................................28

      5.1【參考文獻(xiàn)】..................................錯誤!未定義書簽。

      第一章 要求

      1.1 設(shè)計(jì)目的

      (1)基于WINDOWS操作系統(tǒng),以及實(shí)驗(yàn)箱,利用觸摸屏返回觸點(diǎn)坐標(biāo)值及動作信息。

      (2)坐標(biāo)及動作的具體顯示:觸摸筆動作,觸點(diǎn)X坐標(biāo)值,觸點(diǎn)Y坐標(biāo)值。

      1.2 設(shè)計(jì)意義

      (1)熟悉嵌入式系統(tǒng)開發(fā)平臺

      (2)掌握ARM嵌入式操作系統(tǒng)下的各個指令的使用方法(3)了解觸摸屏的原理

      1.3 設(shè)計(jì)內(nèi)容

      (1)系統(tǒng)的正確移植和使用(2)根文件系統(tǒng)的正確移植和使用(3)驅(qū)動程序的編譯與裝載

      (4)嵌入式系統(tǒng)下應(yīng)用程序的交叉編譯及下載與調(diào)試

      1.4 主要任務(wù)

      (1)熟悉實(shí)驗(yàn)的流程(2)理解驅(qū)動程序源代碼

      (3)調(diào)用驅(qū)動程序的某些函數(shù),編譯與調(diào)試應(yīng)用程序

      第二章 正文

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

      (1)普通轉(zhuǎn)換模式

      普通轉(zhuǎn)換模式(AUTO_PST = 0,XY_PST = 0)是用作一般目的下的ADC轉(zhuǎn)換。這個模式可以通過設(shè)置ADCCON和ADCTSC來進(jìn)行對AD轉(zhuǎn)換的初始化;而后讀取ADCDAT0(ADC數(shù)據(jù)寄存器0)的XPDATA域(普通ADC轉(zhuǎn)換)的值來完成轉(zhuǎn)換。(2)分離的X/Y軸坐標(biāo)轉(zhuǎn)換模式:X軸坐標(biāo)轉(zhuǎn)換和Y軸坐標(biāo)轉(zhuǎn)換。

      X軸坐標(biāo)轉(zhuǎn)換(AUTO_PST=0且XY_PST=1)將X軸坐標(biāo)轉(zhuǎn)換數(shù)值寫入到ADCDAT0寄存器的XPDATA域。轉(zhuǎn)換后,觸摸屏接口將產(chǎn)生中斷源(INT_ADC)到中斷控制器。

      Y軸坐標(biāo)轉(zhuǎn)換(AUTO_PST=0且XY_PST=2)將X軸坐標(biāo)轉(zhuǎn)換數(shù)值寫入到ADCDAT1寄存器的YPDATA域。轉(zhuǎn)換后,觸摸屏接口將產(chǎn)生中斷源(INT_ADC)到中斷控制器。

      (3)自動(連續(xù))X/Y軸坐標(biāo)轉(zhuǎn)換模式。

      自動(連續(xù))X/Y軸坐標(biāo)轉(zhuǎn)換模式(AUTO_PST=1且XY_PST= 0)以下面的步驟工作:

      觸摸屏控制器將自動地切換X軸坐標(biāo)和Y軸坐標(biāo)并讀取兩個坐標(biāo)軸方向上的坐標(biāo)。觸摸屏控制器自動將測量得到的X軸數(shù)據(jù)寫入到ADCDAT0寄存器的XPDATA域,然后將測量到的Y軸數(shù)據(jù)到ADCDAT1的YPDATA域。自動(連續(xù))轉(zhuǎn)換之后,觸摸屏控制器產(chǎn)生中斷源(INT_ADC)到中斷控制器。(4)等待中斷模式

      當(dāng)觸摸屏控制器處于等待中斷模式下時,它實(shí)際上是在等待觸摸筆的點(diǎn)擊。在觸摸筆點(diǎn)擊到觸摸屏上時,控制器產(chǎn)生中斷信號(INC_TC)。中斷產(chǎn)生后,就可以通過設(shè)置適當(dāng)?shù)霓D(zhuǎn)換模式(分離的X/Y軸坐標(biāo)轉(zhuǎn)換模式或自動X/Y軸

      坐標(biāo)轉(zhuǎn)換模式)來讀取X和Y的位置。(5)靜態(tài)(Standby)模式

      當(dāng)ADCCON寄存器的STDBM位被設(shè)為1時,Standby模式被激活。在該模式下,A/D轉(zhuǎn)換操作停止,ADCDAT0寄存器的XPDATA域和ADCDAT1寄存器的YPDATA(正常ADC)域保持著先前轉(zhuǎn)換所得的值。

      2.2、設(shè)計(jì)總體方案

      2.2.1 軟件

      (1)Embest Online Flash Programmer For ARM: Embest Flash在線編程器(2)HYPER TERMINAL(超級終端):傳送vivi.nand;

      傳送vivi.nand

      vivi> load flash kernel x <回車> 燒寫更新內(nèi)核,傳送zImage文件;等待傳送內(nèi)核:

      vivi>load flash root j <回車> 燒寫更新文件系統(tǒng);燒寫新的文件系統(tǒng) load flash root j

      (3)EmbestIDE Pro for ARM: 應(yīng)用于嵌入式軟件開發(fā)的新一代集成開發(fā)環(huán)境,是一個高度集成的圖形界面操作環(huán)境,包含編輯器、編譯匯編鏈接器、調(diào)試器、工程管理、Flash 編程等工具;支持的開發(fā)語言包括標(biāo)準(zhǔn)C和匯編語言。(4)cygwin: 4

      一個在windows平臺上運(yùn)行的unix模擬環(huán)境,它對于學(xué)習(xí)unix/linux操作環(huán)境,或者從unix到windows的應(yīng)用程序移植,或者進(jìn)行某些特殊的開發(fā)工作,尤其是使用gnu工具集在windows上進(jìn)行嵌入式系統(tǒng)開發(fā),把gcc,gdb,gas等開發(fā)工具進(jìn)行了改進(jìn),能夠生成并解釋win32的目標(biāo)文件。2.2.2 硬件

      S3C2410處理器是Samsung公司基于ARM公司的ARM920T處理器核,32位微控制器。該處理器擁有:獨(dú)立的16KB指令Cache和16KB數(shù)據(jù)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主機(jī),1個USB設(shè)備,SD主機(jī)和MMC接口,2路SPI。S3C2410處理器最高可運(yùn)行在203MHz。

      2.3、設(shè)計(jì)所需工具

      2.3.1 軟件: Embest Online Flash Programmer For ARM,HYPER TERMINAL(超級終端),EmbestIDE Pro for ARM,cygwin 2.3.2 硬件:s3c2410開發(fā)板,Embest實(shí)驗(yàn)箱

      2.4、平臺構(gòu)建過程

      2.4.1、硬件平臺搭建

      硬件流程圖:

      (1)Vivi燒寫過程

      1)首先把SW104斷開,F(xiàn)lash Programmer的Program,在File選擇Open打開要燒寫的配置文件S3C2410&NandFLash_vivi.cfg,在Flash Programmer的Program頁中選擇要燒寫的文件vivi.bon&load.bin。點(diǎn)擊按鈕 Progarm 開始燒寫,直到燒寫成功

      2)連接串口線到 PC 機(jī) COM1,運(yùn)行光盤中提供的 Windows 超級終端Hyper Terminal.ht 把開發(fā)板重新加電,程序運(yùn)行后,在超級終端上可以看到串口輸出Wating,表示正在等待用戶從超級終端下載文件。這時,請點(diǎn)擊超級終端菜單“傳送”選擇 Xmodem 方式下載 vivi.nand 文件,點(diǎn)擊 OK 后等待下載燒寫結(jié)束即可。(2)內(nèi)核zImage燒寫

      1)首先SW104設(shè)為短接(從Nand Flash啟動),并確定已經(jīng)燒寫vivi.nand,加電。)在vivi啟動等待中,敲入空格鍵進(jìn)入vivi界面環(huán)境,并輸入以下命令:vivi> load flash kernel x <回車> 燒寫更新內(nèi)核約1分鐘即可燒寫完畢)點(diǎn)擊超級終端菜單中的“傳送”,選“發(fā)送文件”zImage” 并選擇xModem方式傳送)燒寫結(jié)束,重起實(shí)驗(yàn)板,觀測超級終端窗口提示信息就可以啟動linux內(nèi)核,(3)新文件系統(tǒng)的燒寫

      1)首先SW104設(shè)為短接(從Nand Flash啟動),確定已經(jīng)成功燒寫vivi.nand,加電運(yùn)行可以看到vivi啟動信息,輸入空格進(jìn)入命令狀態(tài);

      2)雙擊運(yùn)行Download.pjf(該文件在/tmp/edukit-2410/image/中)工程(將啟動Embest IDE環(huán)境),點(diǎn)擊連接Remote connect,程序應(yīng)該正在運(yùn)行(命令按鈕STOP為紅色);在串口輸入help,看看有沒有反應(yīng),如果沒反應(yīng),點(diǎn)擊IDE 按鈕:Reset->Start(F5);再輸入help測試,直到有反應(yīng)為止;

      3)如果可以輸出一些信息,再點(diǎn)擊IDE中的Stop,配置Debug的Download地 6

      址為0x30000000,并點(diǎn)擊IDE菜單Project選擇Settings項(xiàng),在Download頁下拉Category到Download項(xiàng),在Download File選擇root.cramfs文件,點(diǎn)擊確定后:

      點(diǎn)擊IDE菜單DEBUG選擇Download下載文件系統(tǒng)映象? 下載完畢后,點(diǎn)擊Start(F5)然后在超級終端里輸入: load flash root j(燒寫更新文件系統(tǒng))?

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

      重起實(shí)驗(yàn)板,觀測超級終端窗口提示信息,引導(dǎo)整個系統(tǒng)啟動到linux行命令輸入狀態(tài)。

      2.4.2根文件系統(tǒng)的制作(1)根文件系統(tǒng)

      根文件系統(tǒng)是Linux系統(tǒng)的核心部分,包含系統(tǒng)使用的軟件和庫,以及所有用來為用戶提供支持架構(gòu)和用戶使用的應(yīng)用軟件,并作為儲存數(shù)據(jù)讀寫結(jié)果的區(qū)域。在Linux系統(tǒng)啟動時,首先完成內(nèi)核安裝及環(huán)境初始化,最后會尋找一個文件系統(tǒng)作為根文件系統(tǒng)被加載。Linux系統(tǒng)中使用“/”來唯一表示根文件系統(tǒng)的安裝路徑。嵌入式系統(tǒng)中通常可以懸著的根文件系統(tǒng)有:Romfs、CRAMFS、RAMFS、JFFS2、EXT2等,甚至還可以使用NFS作為根文件系統(tǒng)。

      (2)cramfs文件系統(tǒng)

      Cramfs是Linux創(chuàng)始人Linux torvalds開發(fā)的一個適用于嵌入式系統(tǒng)的小文件系統(tǒng)。Cramfs是一個只讀文件系統(tǒng),采用zlib壓縮,壓縮比一般可以達(dá)到1:2,但仍可以做到高效的隨機(jī)讀取。Linux系統(tǒng)中,通常把需要修改的目錄壓縮存放,并在系統(tǒng)引導(dǎo)的時候再將壓縮文件解開。因?yàn)閏ramfs不會影響系統(tǒng)讀取文件的速度,而且是一個高度壓縮的文件系統(tǒng),因此非常廣泛應(yīng)用于嵌入式系統(tǒng)中。

      (3)cygwin簡介

      Cygwin是一個在windows平臺上運(yùn)行的unix/Linux模擬環(huán)境,是cygnus solutions公司開發(fā)的自由軟件。Cygwin中,“/”表示根目錄,即cygwin的安裝目錄。我們常用的set_env_linux.sh中定義的目錄有:

      SOURCEDIR:/tmp/edukit-2410存儲了vivi、linux、fs等源代碼和例程 WORKDIR:/usr/local/src/edukit-2410工作區(qū)。

      一般情況下都要把已經(jīng)規(guī)劃好的目錄結(jié)構(gòu)轉(zhuǎn)換成一個映象文件,即使用命令工具 mkcramfs(cygwin下為 mkcramfs.exe),把相應(yīng)的 cramfs 目錄樹壓縮為單一的映象文件。其命令格式為:

      mkcramfs [-h] [-e edition] [-i file] [-n name] dirname outfile 可以使用我們提供的 mkcramfs.exe 在 cygwin 下編譯生成文件系統(tǒng)映象文件 root.cramfs,再固化到開發(fā)系統(tǒng) FLASH 上運(yùn)行。

      (4)常用的Linux行命令

      1)、cd 改變當(dāng)前目錄(文件夾)。例如下,cd/ 返回到根目錄 cd..退回到上級目錄

      cd/tmp/edukit-2410/進(jìn)入/tmp/edukit-2410/文件夾 2)、ls 列出當(dāng)前目錄中的內(nèi)容。Ls 簡單格式列表 ls–l 使用詳細(xì)格式列表。3)、pwd 顯示當(dāng)前所在的目錄。

      (5)tar工具命令

      tar 程序用于儲存或展開 tar 存檔文件。命令格式:

      tar [-參數(shù)] [文件名][路徑]-x :extract |--get 從存檔展開文件-v :--verbose 詳細(xì)顯示處理的文件-j :--有 bz2 屬性的必須包含

      -f :--file [HOSTNAME:]F 指定存檔或設(shè)備(缺省為 /dev/rmt0)

      (6)解壓原文件系統(tǒng)(命令+解壓目錄的存放)

      1)先將 root.cramfs.tar.bz2文件放在C:cygwin目錄中 2)解壓文件系統(tǒng)

      運(yùn)行cygwin,執(zhí)行以下命令解壓安裝:

      $> source /tmp/edukit-2410/set_env_linux.sh? Linux編譯環(huán)境變量設(shè)置 $> cd /

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

      root文件夾中就是我們想要的cramfs文件系統(tǒng) 3)如果在根目錄中產(chǎn)生root文件夾,解壓成功 4)在root目錄中新建xx文件夾,用于存放應(yīng)用程序

      進(jìn)入該目錄后執(zhí)行以下命令編譯鏈接測試程序: $> cd root $>mkdir xx

      (7)編譯應(yīng)用程序 ts.c(命令+生成文件格式+存放位置): 將編寫好的ts.c程序放在C:cygwin目錄中 進(jìn)入該目錄后執(zhí)行以下命令編譯鏈接測試程序: $> cd / $> arm-linux-gcc-o ts ts.c(也可以編寫Makefile來編譯)

      生成文件: ts 如下圖所示

      將ts文件放入root 下的xx文件夾中

      (8)新文件系統(tǒng)的制作: 把剛才編譯輸出的ts文件拷貝到文件系統(tǒng)所在的工作目錄root目錄下,執(zhí)行以下命令生成新的文件系統(tǒng)映象:

      $> cd /

      $> mkcramfs root root.new

      剛剛編譯生成的文件系統(tǒng)映象 root.new 中已經(jīng)包含測試程序即生成文件。解壓文件系統(tǒng)在root目錄中新建xx文件夾,用于存放應(yīng)用 將編寫好的ts.c程序放在C:cygwin目錄中 生成文件: ts 如下圖所示

      新文件系統(tǒng)的制作

      生成文件:

      第三章 程序

      3.1.程序流程圖:

      3.2.分析驅(qū)動

      觸摸屏驅(qū)動在/kernel/drivers/char/s3c2410-ts.c 文件中。

      3.2.1、觸摸屏設(shè)備驅(qū)動中數(shù)據(jù)結(jié)構(gòu)

      (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)觸摸屏設(shè)備結(jié)構(gòu)體的成員與按鍵設(shè)備結(jié)構(gòu)體的成員類似,也包含一個緩沖區(qū),同時包括自旋鎖、等待隊(duì)列和fasync_struct指針 typedef struct { unsigned int penStatus;/* PEN_UP, PEN_DOWN, PEN_SAMPLE */ TS_RET buf[MAX_TS_BUF];/* protect against overrun(環(huán)形緩沖區(qū))*/ unsigned int head, tail;/* head and tail for queued events(環(huán)形緩沖區(qū)的頭尾)*/ wait_queue_head_t wq;//* 等待隊(duì)列數(shù)據(jù)結(jié)構(gòu) spinlock_t lock;//* 自旋鎖

      #ifdef USE_ASYNC struct fasync_struct *aq;#endif #ifdef CONFIG_PM struct pm_dev *pm_dev;//友善之臂專有的,我后面的代碼刪除了這段 #endif } TS_DEV;

      (3)觸摸屏結(jié)構(gòu)體中包含的TS_RET值的類型定義,包含X、Y坐標(biāo)和狀態(tài)(PEN_DOWN、PEN_UP)等信息,這個信息會在用戶讀取觸摸信息時復(fù)制到用戶空 間

      typedef struct { 12

      unsigned short pressure;//* 壓力,這里可定義為筆按下,筆抬起,筆拖曳

      unsigned short x;//* 橫坐標(biāo)的采樣值 unsigned short y;//* 縱坐標(biāo)的采樣值 unsigned short pad;//* 填充位 } TS_RET;

      (4)在觸摸屏設(shè)備驅(qū)動中,將實(shí)現(xiàn)open()、release()、read()、fasync()和poll()函數(shù),因此,其文件操作結(jié)構(gòu)體定義

      觸摸屏驅(qū)動文件操作結(jié)構(gòu)體:static struct file_operations s3c2410fops={} _3.2.2、觸摸屏驅(qū)動模塊加載和卸載函數(shù)

      (1)在觸摸屏設(shè)備驅(qū)動的模塊加載函數(shù)中,要完成申請?jiān)O(shè)備號、添加cdev、申請中斷、設(shè)置觸摸屏控制引腳(YPON、YMON、XPON、XMON)等多項(xiàng)工作 觸摸屏設(shè)備驅(qū)動的模塊加載函數(shù)

      static int __init s3c2410_ts_init(void)觸摸屏設(shè)備驅(qū)動模塊卸載函數(shù)

      static void __exit s3c2410_ts_exit(void)(2)可知觸摸屏驅(qū)動中會產(chǎn)生兩類中斷,一類是觸點(diǎn)中斷(INT-TC),一類是X/Y位置轉(zhuǎn)換中斷(INT-ADC)。在前一類中斷發(fā)生后,若之前處于PEN_UP狀態(tài),則應(yīng)該啟動X/Y位置轉(zhuǎn)換。另外,將抬起中斷也放在INT-TC處理程序中,它會調(diào)用tsEvent()完成等待隊(duì)列和信號的釋放 觸摸屏設(shè)備驅(qū)動的觸點(diǎn)/抬起中斷處理程序

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

      當(dāng)X/Y位置轉(zhuǎn)換中斷發(fā)生后,應(yīng)讀取X、Y的坐標(biāo)值,填入緩沖區(qū) 觸摸屏設(shè)備驅(qū)動X/Y位置轉(zhuǎn)換中斷處理程序

      static void s3c2410_isr_adc(int irq, void *dev_id, struct pt_regs *reg)觸摸屏設(shè)備驅(qū)動中獲得X、Y坐標(biāo)

      static inline void s3c2410_get_XY(void)(3)tsEvent最終為tsEvent_raw(),這個函數(shù)很關(guān)鍵,當(dāng)處于PEN_DOWN狀態(tài)時調(diào)用該函數(shù),它會完成緩沖區(qū)的填充、等待隊(duì)列的喚醒以及異步通知信號的釋放;否則(處于PEN_UP狀態(tài)),將緩沖區(qū)頭清0,也喚醒等待隊(duì)列并釋放信號

      觸摸屏設(shè)備驅(qū)動的tsEvent_raw()函數(shù) static void tsEvent_raw(void)(4)在包含了對拖動軌跡支持的情況下,定時器會被啟用,周期為10ms,在每次定時器處理函數(shù)被引發(fā)時,調(diào)用start_ts_adc()開始X/Y位置轉(zhuǎn)換過程

      觸摸屏設(shè)備驅(qū)動的定時器處理函數(shù)

      static void tstimerhandler(unsigned long data)(5)在觸摸屏設(shè)備驅(qū)動的打開函數(shù)中,應(yīng)初始化緩沖區(qū)、penStatus和定期器、等待隊(duì)列及tsEvent時間處理函數(shù)指針 觸摸屏設(shè)備驅(qū)動的打開函數(shù)

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

      _

      _

      _

      _ 14

      (6)觸摸屏設(shè)備驅(qū)動的釋放函數(shù)非常簡單,刪除為用于拖動軌跡所使用的定時器即可

      觸摸屏設(shè)備驅(qū)動的釋放函數(shù)

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

      _

      _3.2.3、觸摸屏設(shè)備驅(qū)動的讀函數(shù)

      觸摸屏設(shè)備驅(qū)動的讀函數(shù)實(shí)現(xiàn)緩沖區(qū)中信息向用戶空間的復(fù)制,當(dāng)緩沖區(qū)有內(nèi)容時,直接復(fù)制;否則,如果用戶阻塞訪問觸摸屏,則進(jìn)程在等待隊(duì)列上睡眠,否則,立即返回-EAGAIN 觸摸屏設(shè)備驅(qū)動的讀函數(shù)

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

      _3.2.4、觸摸屏設(shè)備驅(qū)動的輪詢與異步通知

      在觸摸屏設(shè)備驅(qū)動中,通過s3c2410_ts_poll()函數(shù)實(shí)現(xiàn)了輪詢接口,這個函數(shù)的實(shí)現(xiàn)非常簡單。它將等待隊(duì)列添加到poll_table,當(dāng)緩沖區(qū)有數(shù)據(jù)時,返回資源可讀取標(biāo)志,否則返回0 觸摸屏設(shè)備驅(qū)動的poll()函數(shù)

      static unsigned int s3c2410_ts_poll(struct file *filp, struct polltablestruct *wait)而為了實(shí)現(xiàn)觸摸屏設(shè)備驅(qū)動對應(yīng)用程序的異步通知,設(shè)備驅(qū)動中要實(shí)現(xiàn)s3c2410_ts_fasync()函數(shù) 觸摸屏設(shè)備驅(qū)動的fasync()函數(shù) __

      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);觸摸屏應(yīng)用程序

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

      #define PEN_UP 0 /* 觸摸筆抬筆,即觸摸屏不被壓下 */ #define PEN_DOWN 1 /* 觸摸筆下筆,即觸摸屏被壓下 */ #define PEN_FLEETING 2 /* 觸摸筆拖動 */

      typedef struct { unsigned short pressure;/* 觸摸筆動作 */ unsigned short x;

      /* 觸點(diǎn)x座標(biāo)值 */ unsigned short y;

      /* 觸點(diǎn)y座標(biāo)值 */ unsigned short pad;}TS_RET;

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

      unsigned char suba;TS_RET tsret;

      fd = open(“/dev/touchscreen/0raw”, O_RDWR);/* 打開設(shè)備 */ 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.應(yīng)用程序的調(diào)試

      使用s3c2410_ts.c觸摸屏驅(qū)動編寫應(yīng)用程序,讀取觸摸屏的觸點(diǎn)坐標(biāo)值及動作信息(觸點(diǎn)x坐標(biāo)值,y坐標(biāo)及是否有壓力值press),并在串口中斷打印出來

      對觸摸屏設(shè)別的操作有打開設(shè)備,關(guān)閉設(shè)備,讀操作等。編寫應(yīng)用程序讀取觸摸屏的觸點(diǎn)坐標(biāo)值及動作信息時,只需利用觸摸屏驅(qū)動程序便可實(shí)現(xiàn),先打開觸摸屏設(shè)備,然后調(diào)用讀函數(shù)即可。

      其中,觸摸筆動作取值如下: #define PEN_UP 0 #define PEN_DOWN

      /* 觸摸筆抬筆,即觸摸屏不被壓下 */ /* 觸摸筆下筆,即觸摸屏被壓下 */

      #define PEN_FLEETING 2 結(jié)構(gòu)體定義如下: typedef struct { unsigned short pressure;unsigned short x;unsigned short y;unsigned short pad;}TS_RET 打開應(yīng)用程序:

      /* 觸摸筆拖動 */

      /* 觸摸筆動作 */ /* 觸點(diǎn)x座標(biāo)值 */ /* 觸點(diǎn)y座標(biāo)值 */

      3.2.6、實(shí)驗(yàn)結(jié)果顯示:

      第四部分 感想

      第四章 心得

      4.1 課程設(shè)計(jì)心得體會:

      經(jīng)過個人的努力和老師以及同學(xué)們的幫助和指導(dǎo),我順利的完成了本次《嵌入式系統(tǒng)原理》課程設(shè)計(jì)。本次課程設(shè)計(jì)為我提供了一個理論與實(shí)踐相結(jié)合的機(jī)會,既鍛煉了我的動手能力,又加深理解了在課堂所學(xué)習(xí)的理論知識。通過本次課程設(shè)計(jì),將課本上的理論知識和實(shí)際應(yīng)用有機(jī)結(jié)合起來,培養(yǎng)了我又動腦,又動手,獨(dú)立思考分析問題的能力,提高了我運(yùn)用所學(xué)知識解決實(shí)際問題的綜合素質(zhì)。通過本次課程設(shè)計(jì)我明白了只有不斷的努力,不斷的學(xué)習(xí),才能在將來遇到的問題中能夠游刃有余,才能夠不會捉襟見肘。

      參考文獻(xiàn) 程昌南,方強(qiáng)等.《ARM Linux入門與實(shí)踐 》【M】.北京:北京航空航天大學(xué)出版社,2008.10 2 張曉林等.《嵌入式系統(tǒng)設(shè)計(jì)與實(shí)踐》【M】.北京:北京航空航天大學(xué)出版社,2006.1 3 李俊等.《嵌入式Linux設(shè)備驅(qū)動開發(fā)詳解》【M】.北京:北京人民郵電出版社,2008.3 4 黃智偉,鄧月明,王彥.《ARM9嵌入式系統(tǒng)設(shè)計(jì)基礎(chǔ)教程》.北京:北京航空航天大學(xué)出版社,2008.8

      第四篇:觸摸屏材料總結(jié)和觸摸屏發(fā)展趨勢

      觸摸屏材料總結(jié)和觸摸屏發(fā)展趨勢

      目前觸摸屏的應(yīng)用范圍從以往的銀行自動柜員機(jī)、工控計(jì)算機(jī)等小眾商用市場,迅速擴(kuò)展到手機(jī)、PDA、GPS(全球定位系統(tǒng))、MP3,甚至平板電腦(UMPC)等大眾消費(fèi)電子領(lǐng)域。展望未來,觸控操作簡單、便捷,人性化的觸摸屏有望成為人機(jī)互動的最佳界面而迅速普及。

      目前的觸控技術(shù)尚存在屏幕所使用的材源透光較差影響顯示畫面的清晰度,或者長期使用后出現(xiàn)坐標(biāo)漂移、影響使用精度等問題。而且,全球主要觸摸屏生產(chǎn)大廠多集中在日、美、韓等國家以及我國臺灣地區(qū);主要技術(shù)、關(guān)鍵零組件和原材料更是基本掌握在日、美廠商手中,中國大陸的觸摸屏/觸控面板產(chǎn)業(yè)還基本處于起步階段。但正因如此,整個觸控行業(yè)未來的上升空間還非常大,它也有望成為我國電子企業(yè)今后創(chuàng)新發(fā)展、大有作為的重要領(lǐng)域。

      觸摸屏起源于20世紀(jì)70年代,早期多被裝于工控計(jì)算機(jī)、POS機(jī)終端等工業(yè)或商用設(shè)備之中。2007年iPhone手機(jī)的推出,成為觸控行業(yè)發(fā)展的一個里程碑。蘋果公司把一部至少需要20個按鍵的移動電話,設(shè)計(jì)得僅需三四個鍵就能搞定,剩余操作則全部交由觸控屏幕完成。除賦予了使用者更加直接、便捷的操作體驗(yàn)之外,還使手機(jī)的外形變得更加時尚輕薄,增加了人機(jī)直接互動的親切感,引發(fā)消費(fèi)者的熱烈追捧,同時也開啟了觸摸屏向主流操控界面邁進(jìn)的征程。

      目前,觸摸屏應(yīng)用范圍已變得越來越廣泛,從工業(yè)用途的工廠設(shè)備的控制/操作系統(tǒng)、公共信息查詢的電子查詢設(shè)施、商業(yè)用途的提款機(jī),到消費(fèi)性電子的移動電話、PDA、數(shù)碼相機(jī)等都可看到觸控屏幕的身影。當(dāng)然,這其中應(yīng)用最為廣泛的仍是手機(jī)。根據(jù)調(diào)研機(jī)構(gòu)ABIResearch報告指出,2008年采用觸控式屏幕的手機(jī)出貨量將超過1億部,預(yù)計(jì)2012年安裝觸控界面的手機(jī)出貨量將超過5億部。

      而且有跡象表明,觸摸屏在消費(fèi)電子產(chǎn)品中的應(yīng)用范圍正從手機(jī)屏幕等小尺寸領(lǐng)域向具有更大屏幕尺寸的筆記本電腦拓展。目前,戴爾、惠普、富士通、華碩等一線筆記本電腦品牌廠商都計(jì)劃推出具備觸摸屏的筆記本電腦或UMPC。當(dāng)然,目前關(guān)于配備觸摸屏的筆記本電腦是否能從10英寸以下的低價筆記本電腦或UMPC,擴(kuò)大到14英寸以上的主流筆記本電腦市場,業(yè)界仍存爭論。因?yàn)閷τ谥髁鞴P記本電腦或臺式機(jī)來說,消費(fèi)者多已習(xí)慣了使用鍵盤及鼠標(biāo)進(jìn)行輸入,不像小尺寸筆記本電腦,因可容納的鍵盤數(shù)量有限,需觸摸屏加以輔助,達(dá)到更直觀的人機(jī)溝通目的。而且現(xiàn)在Windows系統(tǒng)尚不支持多點(diǎn)觸控功能,如由PC廠商單獨(dú)導(dǎo)入多點(diǎn)觸控功能,在軟件上的努力與投資又將極為可觀,因此預(yù)計(jì)到2010年支持多點(diǎn)觸控的新操作系統(tǒng)Windows7上市之前,配備觸摸屏的筆記本電腦仍將局限于12.1英寸以下。但即便如此,觸摸屏市場未來的發(fā)展前景也十分誘人。根據(jù)市場調(diào)研機(jī)構(gòu)的預(yù)測,到2010年觸摸屏產(chǎn)值將達(dá)到35億美元。

      依照感應(yīng)方式的不同,觸摸屏大致可以分為電阻式、電容式、紅外線式、超音波式四類。其中電阻式與電容式目前的市場前景最被看好,其他技術(shù)短期內(nèi)恐很難趕上。

      就技術(shù)原理來看,電阻式觸摸屏只能算是一種“類觸控”技術(shù)。它采用兩層鍍有導(dǎo)電功能的ITO(銦錫氧化物)PET塑料膜,PET本身具有一定的透明度與耐用性,兩片ITO設(shè)有微粒支點(diǎn),使屏幕在未被壓按時兩層ITO間有一定的空隙,處于未導(dǎo)電的狀態(tài)。當(dāng)操作者以指尖或筆尖壓按屏幕(外層PET膜)時,壓力將使PET膜內(nèi)凹,因變形而使銦錫氧化物導(dǎo)電層接觸導(dǎo)電,再通過偵測X軸、Y軸電壓變化換算出對應(yīng)的壓力點(diǎn),完成整個屏幕的觸按處理機(jī)制。由于此種技術(shù)成本低廉,現(xiàn)已大量應(yīng)用于電子產(chǎn)品之上。目前電阻式觸摸屏有4線、5線、6線與8線等多種類型,線數(shù)越多,代表可偵測的精密度越高,但成本也會相對提高。

      不過,仔細(xì)考量電阻式觸控技術(shù)的原理就會發(fā)現(xiàn),通過觸按屏幕觸發(fā)ITO薄膜導(dǎo)電的偵測機(jī)制,在物理上有其局限性:電阻式技術(shù)想要增加偵測面積與分辨率,最直接的方法就是增加線數(shù),但線數(shù)的提高也代表著處理運(yùn)算信息量的增加,這對處理器將是一大負(fù)擔(dān),同時成本的提升也是問題。另外,PET膜再怎么強(qiáng)化,材質(zhì)的耐壓性、耐磨性、抗變形能力,畢竟有其極限,長時間運(yùn)用一定會減低銦錫氧化物導(dǎo)電層接觸導(dǎo)通效率,觸按點(diǎn)也會因經(jīng)常使用的就是那幾處,造成特定區(qū)域過度使用磨損,而降低透明度。

      電容式觸摸屏與電阻式比較,架構(gòu)相對簡單。由于電容式觸摸屏中的投射電容式(電容式觸摸屏主要分為投射電容式與表面電容式兩種)可支持當(dāng)前流行的多點(diǎn)觸控功能,并擁有更高的屏幕透光率、更低的整體功耗、更長的使用壽命等優(yōu)點(diǎn),正不斷挑戰(zhàn)電阻式觸摸屏的市場地位。

      據(jù)isuppli公司預(yù)測,2008年全球具備觸控功能的手機(jī),仍以電阻式觸控技術(shù)為主,產(chǎn)值可達(dá)4900萬美元,預(yù)計(jì)2012年將達(dá)6500萬美元;而投射電容式觸控技術(shù)2008年產(chǎn)值雖然只有1000萬美元,占整個市場份額的17%,但估計(jì)2012年投射電容式產(chǎn)值將突破2000萬美元,市場比重躍升至23%。

      但是電容式觸控也有許多值得關(guān)注的問題:比如液晶屏非??拷熷a氧化物模板,新的技術(shù)甚至直接將兩者做在同一個真空堆棧中,形成一個模組。而為了達(dá)到觸點(diǎn)偵測功效,銦錫氧化物模板又需不斷地掃描像素,會持續(xù)散發(fā)干擾信號,影響整個模組的操作。另外,廠商雖然會對觸摸屏的表面進(jìn)行硬化處理,可是為了不隔絕掉ITO的表面電流,硬化鍍層非常薄,當(dāng)施加在觸摸屏上的外力過大時,依然有傷到ITO的可能,對觸摸屏造成損傷,降低使用壽命。因此,針對提高使用壽命問題,有廠商開發(fā)出了超聲波式或紅外線式觸摸屏。特別是在導(dǎo)通線路精細(xì)度方面是制約電容屏發(fā)展的瓶頸問題,直接購買鍍膜設(shè)備成本會增加很多,但是最近uninwell International最近推出的光刻銀漿可以解決這方便的問題,此種材料可以將線細(xì)和線距控制在0.05mm以內(nèi),使得電容屏的投資成本大大降低。

      紅外線與超聲波式觸控技術(shù)的作用原理相仿。不過受限于傳感器的尺寸,這兩項(xiàng)技術(shù)目前多用于20英寸以上的屏幕,如醫(yī)療、ATM等裝置上,同時產(chǎn)品的成本也會較高。

      由于市場需求迅速增長,觸控產(chǎn)業(yè)近年來也迅速躥紅,許多廠商紛紛投身其中。從觸摸屏的產(chǎn)業(yè)狀況來看,產(chǎn)業(yè)鏈大約可以分為上游零組件、原材料供應(yīng)與材料加工,如玻璃基板制造、ITO薄膜制造、PET制造、化學(xué)材料供應(yīng)、控制IC供應(yīng)等;中游觸摸屏/觸控面板的制造;下游則大多是一些系統(tǒng)整合與終端廠商,如模組廠商、顯示器廠商、家電廠商以及代理商等。

      如果不算基本屬于應(yīng)用層面的下游廠商,目前中國大陸以及中國臺灣地區(qū)的廠商主要致力于在產(chǎn)業(yè)鏈中游的觸摸屏/觸控面板制造領(lǐng)域拓展,且以電阻式產(chǎn)品為主,如大陸的富陽光電、華意電路、北泰顯示、凰澤光電、深越光電、沃森電子、東莞冠智電子、廣州恒利達(dá)等。深越光電除了提供電阻式觸摸屏之外,還提供電容式與超聲波式產(chǎn)品。同時有消息稱,萊寶高科的觸摸屏項(xiàng)目將切入ITO薄膜以及ITO導(dǎo)電玻璃的制造。我國臺灣地區(qū)廠商切入時點(diǎn)較早,現(xiàn)在也已涌現(xiàn)出時緯科技、接口光電、洋華光電、奇菱科技、富晶通、嵩遠(yuǎn)光電、仕欽科技、遠(yuǎn)諾光電、宇宙光電、理義科技、勝華科技等一批觸摸屏制造企業(yè)。

      但觸摸屏上游的零組件與材料供應(yīng)基本上仍掌握在日本、美國供貨商手中。比如玻璃基板的主要制造商有日商旭硝子、美商康寧;PET制造商為3M,住友、東麗;化學(xué)材料供貨商為Uninwell,日礦、三井;膠材中的銀膠有Uninwell,breakover-quick,Longtone,伊必艾科技、杜邦、3M,絕緣膠有藤倉、住友、杜邦、3M,雙面膠有3M、日東電工,印刷膠有東洋紡等;ITOFilm制造為日東電工、尾池工業(yè)、帝人化成、東洋紡等。只有在控制IC領(lǐng)域,我國臺灣地區(qū)的義隆電子與禾瑞亞還有較大的發(fā)言權(quán)。其次在ITO玻璃的制造中,臺廠正太、冠華也有了較強(qiáng)的供應(yīng)能力,但目前占該材料成本比重最多的ITOFilm供應(yīng)幾乎都是以日本廠商為主。

      盡管觸摸屏的實(shí)際應(yīng)用越來越多,應(yīng)用范圍越來越廣闊,可實(shí)際上該項(xiàng)技術(shù)仍然存在許多需要完善的地方,只有設(shè)計(jì)出更先進(jìn)、智能、體貼的人機(jī)界面,使進(jìn)行觸控操作時更加直觀、精準(zhǔn),同時又不影響系統(tǒng)的反應(yīng)速度,才能有望成為人機(jī)交互的主流界面。最典型的例子就是觸控操作中的回饋問題。在手機(jī)應(yīng)用中,觸摸屏很大程度上已經(jīng)可以代替按鍵??墒菑南M(fèi)者的使用習(xí)慣角度出發(fā),傳統(tǒng)的按鍵仍然具有一個觸摸屏所沒有的特性——— 觸感回饋。通過按鍵,很多使用者即使在不看鍵盤的情況下,也可以憑借觸感判斷撥打電話、發(fā)送短信,但目前通過觸控屏幕卻沒有能力完成這項(xiàng)工作,使用者只有盯著屏幕,用手指瞄準(zhǔn),才能操作。未來,需要在虛擬按鍵上加入適當(dāng)?shù)陌存I回饋機(jī)制,例如聲音或是震動裝置,以更貼近消費(fèi)者的使用習(xí)慣。

      再者,觸摸屏還有壽命和體積等問題。一般情況下,觸摸屏的使用期限,肯定要遠(yuǎn)低于按鍵鍵盤,如果在屏幕上貼上保護(hù)膜,又會降低觸摸屏操作的靈敏度和精確度。如果產(chǎn)品還有小型化的設(shè)計(jì)需求,那么過小的屏幕,會讓觸控操作更加困難,形成負(fù)面效果。

      此外,許多業(yè)者現(xiàn)在還在致力開發(fā)如內(nèi)嵌式觸摸屏,應(yīng)用于電子紙、OLED(有機(jī)發(fā)光二極管)等上的觸摸屏等研發(fā)。可見,觸摸屏行業(yè)的技術(shù)提升空間仍然很大,仍有很多潛在的市場需求尚待開發(fā)。因此也可看出,觸摸屏作為一項(xiàng)新近興起的輸入控制界面,中國企業(yè)在這一領(lǐng)域仍然大有可為。

      第五篇:基于plc的觸摸屏總結(jié)

      基于plc的觸摸屏專業(yè)技能總結(jié)

      專業(yè):電子信息工程

      學(xué)號:0414110111 姓名:王國發(fā)

      這學(xué)期我們進(jìn)行了有關(guān)PLC的科研技能訓(xùn)練,科研技能訓(xùn)練是大學(xué)中必不可少的一個環(huán)節(jié),因?yàn)榭蒲屑寄苁古囵B(yǎng)學(xué)生的科研能力、創(chuàng)新意識和創(chuàng)新能力,通過科研技能訓(xùn)練,使學(xué)生掌握科學(xué)研究的過程和方法,能夠初步掌握進(jìn)行科學(xué)研究、科技論文寫作的方法步驟,全面掌握 進(jìn)行科技活動必備的素質(zhì)要求,激發(fā)學(xué)生的專業(yè)熱情和學(xué)習(xí)興趣,為學(xué)生撰寫畢業(yè)論文、進(jìn)行畢業(yè)設(shè)計(jì)奠定基礎(chǔ),并能培養(yǎng)學(xué)生的科研組織能力和專業(yè)知識綜合 運(yùn)用能力,提高其與專業(yè)有關(guān)的綜合素質(zhì),并且能提高創(chuàng)新能力!

      一、觸摸屏的現(xiàn)狀與應(yīng)用

      PLC(Programmable Logical Controller)通常稱為可編程邏輯控制器,是一種以微處理器為基礎(chǔ),綜合了現(xiàn)代計(jì)算機(jī)技術(shù)、自動控制技術(shù)和通信技術(shù)發(fā)展起來的一種通用的工業(yè)自動控制裝置,由于它擁有體積小、功能強(qiáng)、程序設(shè)計(jì)簡單、維護(hù)方便等優(yōu)點(diǎn),特別是它適應(yīng)惡劣工業(yè)環(huán)境的能力和它的高可靠性,使它的應(yīng)用越來越廣泛,已經(jīng)被稱為現(xiàn)代工業(yè)的三大支柱(即PLC、機(jī)器人和CAD/CAM)之一。

      PLC基于電子計(jì)算機(jī),但并不等同于計(jì)算機(jī)。普通計(jì)算機(jī)進(jìn)行入出信息交換時,大多只考慮信息本身,信息入出的物理過程一般不考慮的。而PLC則要考慮信息入出的可靠性、實(shí)時性、以及信息的實(shí)際使用。特別要考慮怎樣適應(yīng)于工業(yè)環(huán)境,如便于安裝便于門內(nèi)外感應(yīng)采集信號,便于維修和抗干擾等問題,入出信息變換及可靠地物理實(shí)現(xiàn),可以說是PLC實(shí)現(xiàn)控制的兩個基本點(diǎn)。PLC可以通過他的外設(shè)或通信接口與外界交換信息。其功能要比繼電器控制裝置多得多、強(qiáng)得多。PLC有豐富的指令系統(tǒng),有各種各樣的I/O接口、通信接口,有大容量的內(nèi)存,有可靠的自身監(jiān)控系統(tǒng),因而具有以下基本功能:

      1邏輯處理功能; 2數(shù)據(jù)運(yùn)算功能; 3準(zhǔn)確定時功能; 4高速計(jì)數(shù)功能;

      5中斷處理(可以實(shí)現(xiàn)各種內(nèi)外中斷)功能; 6程序與數(shù)據(jù)存儲功能; 7聯(lián)網(wǎng)通信功能 ; 8自檢測、自診斷功能。

      可以說,凡普通小型計(jì)算機(jī)能實(shí)現(xiàn)的功能,PLC幾乎都可以做到。像 PLC這樣,集豐富功能于一身,是別的電控制器所沒有的,更是傳統(tǒng)的繼電器控制電路所無法比擬的。豐富的功能為PLC 的廣泛應(yīng)用提供了可能,同時,也為自動門行業(yè)的遠(yuǎn)程化、信息化、智能化創(chuàng)造了條件。

      人機(jī)界面是在操作人員和機(jī)器設(shè)備之間做雙向溝通的橋梁,用戶可以自由的組合文字、按鈕、圖形、數(shù)字等處理或監(jiān)控管理及應(yīng)付隨時可能變化信息的多功能顯示屏幕。隨著機(jī)械設(shè)備的飛速發(fā)展,以往的操作界面需由熟練的操作員才能操作,而且操作困難,無法提高工作效率。但是使用人機(jī)界面能夠明確指示并告知操作員設(shè)備目前的狀況,使操作變的簡單生動,并且可以減少操作上的失誤,即使是新手也可以輕松的操作整個機(jī)器設(shè)備。使用人機(jī)界面還可以使機(jī)器的配線標(biāo)準(zhǔn)化、簡單化,同時也能減少PLC控制器所需的I/O點(diǎn)數(shù),降低生產(chǎn)的成本。同時由于面板控制的小型化及高性能,相對的提高了整套設(shè)備的附加價值。

      觸摸屏是“圖形操作終端”“GOT”在工業(yè)控制中的通俗叫法,這種液晶顯示器具有人體感應(yīng)功能,當(dāng)手指觸摸到觸摸屏上的圖形時,可發(fā)出操作指令。

      一、觸摸屏的簡要結(jié)構(gòu)、原理 1.電阻式觸摸屏原理

      觸摸屏工作時,上下導(dǎo)體層相當(dāng)于電阻網(wǎng)絡(luò),當(dāng)某一層電極加上電壓時,會在該網(wǎng)絡(luò)上形成電壓梯度。如有外力使得上下兩層在某一點(diǎn)接觸,則在電極未加電壓的另一層可以測得接觸點(diǎn)處的電壓,從而知道接觸點(diǎn)處的坐標(biāo)。

      2.電容式觸摸屏原理(1)表面電容觸摸屏通過人體的感應(yīng)電流來進(jìn)行工作。它采用一層銦錫氧化物(ITO),外圍至少有四個電極。當(dāng)一個接地的物體靠近時,例如手指,流經(jīng)這四個電極的電流與手指到四角的距離成正比,控制器通過對這四個電流比例的精確計(jì)算,得出觸摸點(diǎn)的位置。

      (2)投射電容式觸摸屏。當(dāng)手指靠近從一個電極到另一個電極的電場線時,相鄰電極耦合產(chǎn)生的電容產(chǎn)生變化,控制器收集變化信息,從而計(jì)算出位置。這種觸摸屏的最大優(yōu)勢是實(shí)現(xiàn)了多點(diǎn)觸控,使得用戶的操作更加便捷。

      (3)紅外線觸摸屏原理

      在屏幕周邊,成對安裝紅外線發(fā)射器和紅外線接受器,形成緊貼屏幕前密布X、Y方向上的紅外線矩陣,通過不停的掃描是否有紅外線被物體阻擋檢測并定位用戶的觸摸。

      (4)聲波式觸摸屏原理

      表面聲波觸摸屏是利用聲波可以在剛體表面?zhèn)鞑サ奶匦栽O(shè)計(jì)而成。以X軸為例,控制電路產(chǎn)生發(fā)射信號(電信號),該電信號經(jīng)玻璃屏上的X軸發(fā)射換能器轉(zhuǎn)換成超聲波,超聲波在前進(jìn)途中遇到45度傾斜的反射線后產(chǎn)生反射,產(chǎn)生和入射波成90度、和Y軸平行的分量,該分量傳至玻璃屏X方向的另一邊也遇到45度傾斜的反射線,經(jīng)反射后沿和發(fā)射方向相反的方向傳至X軸接收換能器。X軸接收換能器將回收到的聲波轉(zhuǎn)換成電信號。控制電路對該電信號進(jìn)行處理得到表征玻璃屏聲波能量分布的波形。有觸摸時,手指會吸收部分聲波能量,回收到的信號會產(chǎn)生衰減,程序分析衰減情況可以判斷出X方向上的觸摸點(diǎn)坐標(biāo)。同理可以判斷出Y軸方向上的坐標(biāo),X、Y兩個方向的坐標(biāo)一確定,觸摸點(diǎn)自然就被唯一地確定下來。

      各類觸摸屏橫向比較

      ? 電阻式:觸摸屏處于一種對外界完全隔離的工作環(huán)境,不怕灰塵、水汽和油污,可以用任何物體來觸摸。精度非常高,可用來作圖,書寫。價格合理。

      ? 電容式:最大優(yōu)勢是能實(shí)現(xiàn)多點(diǎn)觸控,操作最隨意。不足的是精度較低,受周圍環(huán)境電場影響可能產(chǎn)生漂移,價格較高。

      ? 紅外線式:紅外觸摸屏不受電流、電壓和靜電干擾,但對光照較為敏感。價格較低,維護(hù)方便。

      ? 聲波式:屏幕多為鋼化玻璃,清晰度高,透光率好。高度耐久,抗刮傷性良好。多用于各種公共場合如ATM,自動售票機(jī)等。

      二、觸摸屏的畫面制作及基本操作

      1、GOT的接線及與計(jì)算機(jī)、PLC的連接 作為PLC的圖形操作終端,GOT必須與PLC聯(lián)機(jī)使用,通過操作人員手指與觸摸屏上的圖形元件的接觸發(fā)出PLC的操作指令或者顯示PLC運(yùn)行中的各種信息。

      2.GOT的畫面功能(用戶畫面功能、系統(tǒng)畫面)(1)用戶畫面功能(用戶制作的畫面)(2)系統(tǒng)畫面功能 ① 監(jiān)視功能

      ② 數(shù)據(jù)采樣功能 ③ 報警功能 ④ 其他功能

      三、觸摸屏的選用

      由于在此系統(tǒng)中,觸摸屏要擔(dān)任監(jiān)控各部分運(yùn)行狀態(tài),而且還用于控制作用,所以在此擔(dān)任的任務(wù)還是比較重的。所以在此選定的觸摸屏為MT506T型號。

      ①可實(shí)時顯示設(shè)備和系統(tǒng)的運(yùn)行狀態(tài)。

      ②通過觸摸向PLC發(fā)出指令和數(shù)據(jù),再通過PLC完成對系統(tǒng)或設(shè)備的控制。

      ③可做成多幅多種監(jiān)控畫面,替代了傳統(tǒng)的電氣操作盤及顯示記錄儀表等,且功能更加強(qiáng)大。

      四、觸摸屏程序設(shè)計(jì)

      本系統(tǒng)的觸摸屏人機(jī)交互界面的開發(fā)平臺,采用MT506觸摸屏的編程軟件實(shí)現(xiàn)。該軟件類似于組態(tài)軟件,采用圖形化的編程方法,只需將相關(guān)元件拖到預(yù)先定義的畫面上,根據(jù)需要設(shè)置相關(guān)參數(shù)、合理配置PLC寫入地址即可完成操作。

      五‘GT-Designer2 畫面制作軟件介紹

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

      觸摸屏作為一種新型的人機(jī)界面,從一出現(xiàn)就受到關(guān)注,它的簡單易用,強(qiáng)大的功能及優(yōu)異的穩(wěn)定性使它非常適合用于工業(yè)環(huán)境,甚至可以用于日常生活之中,應(yīng)用非常廣泛,比如:自動化停車設(shè)備、自動洗車機(jī)、天車升降控制、生產(chǎn)線監(jiān)控等,甚至可用于智能大廈管理、會議室聲光控制、溫度調(diào)整。

      隨著科技的飛速發(fā)展,越來越多的機(jī)器與現(xiàn)場操作都趨向于使用人機(jī)界面,PLC控制器強(qiáng)大的功能及復(fù)雜的數(shù)據(jù)處理也呼喚一種功能及與之匹配而操作又簡單的人機(jī)的出現(xiàn),觸摸屏的應(yīng)運(yùn)而生無疑是21世紀(jì)自動化領(lǐng)域里的一個巨大的革新。

      通過科研技能訓(xùn)練,我發(fā)現(xiàn)要干好一件事情必須要不怕困難,堅(jiān)持到底,只有這樣才會戰(zhàn)勝困難,贏得最后的勝利。作為信息時代的大學(xué)生,我們應(yīng)該有這種不怕辛苦,勇于創(chuàng)新的精神。另外,理工科的學(xué)生不是只有會計(jì)算和實(shí)驗(yàn)就夠了的,培養(yǎng)表達(dá)能力也很重要,要懂得把自己的想法恰如其分的表達(dá)清楚,梳理成文章,讓感興趣的人很好的欣賞自己的創(chuàng)作。所以通過科研技能訓(xùn)練,讓我在原有水平上有了一個量的提高,對我以后的發(fā)展和專業(yè)水平的提高有很大的幫助,我想我會一直努力用理論聯(lián)系實(shí)際的方法不斷提高自己,奔向人生最高處。

      下載linux串口觸摸屏設(shè)計(jì)總結(jié)word格式文檔
      下載linux串口觸摸屏設(shè)計(jì)總結(jié).doc
      將本文檔下載到自己電腦,方便修改和收藏,請勿使用迅雷等下載。
      點(diǎn)此處下載文檔

      文檔為doc格式


      聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn)自行上傳,本網(wǎng)站不擁有所有權(quán),未作人工編輯處理,也不承擔(dān)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)有涉嫌版權(quán)的內(nèi)容,歡迎發(fā)送郵件至:645879355@qq.com 進(jìn)行舉報,并提供相關(guān)證據(jù),工作人員會在5個工作日內(nèi)聯(lián)系你,一經(jīng)查實(shí),本站將立刻刪除涉嫌侵權(quán)內(nèi)容。

      相關(guān)范文推薦

        單片機(jī)串口通信方式總結(jié)

        IIC總線通信協(xié)議————數(shù)據(jù)傳輸高位在前p233 1,起始和停止條件 開始信號:SCL為高電平,SDA由高電平向低電平跳變,開始傳送數(shù)據(jù)。 void start() // 開始位 { SDA = 1; //SDA初始化......

        基于觸摸屏的絲網(wǎng)印刷技術(shù)的設(shè)計(jì)應(yīng)用

        基于MCGS觸摸屏的絲網(wǎng)印刷控制系統(tǒng) 李文鉛,劉鶴 摘要:本課題研究主要是在原有的半自動絲網(wǎng)印刷機(jī)的手動控制的基礎(chǔ)上,應(yīng)用PLC控制技術(shù)、變頻控制技術(shù)、人機(jī)交互技術(shù)等設(shè)計(jì)出以......

        串口調(diào)試助手使用說明和技術(shù)總結(jié)大全

        串口調(diào)試助手的技術(shù)報告 1. 軟件簡介 串口調(diào)試助手是在Windows平臺下開發(fā)的,工具是VC++6.0。串口調(diào)試助手版支持常用的300 ~ 115200bps波特率,能設(shè)置校驗(yàn)、數(shù)據(jù)位和停止位,能以......

        北爾觸摸屏使用總結(jié)(精選五篇)

        北爾觸摸屏使用總結(jié) 鹽鍋峽工程采用的北爾觸摸屏,為首次使用,現(xiàn)總結(jié)如下: 優(yōu)點(diǎn): 1. 觸摸屏畫面相對easyview美觀一些 與easyview相比較,畫面要美觀一些,功能也要比easyview多一些,......

        基于多單片機(jī)的串口擴(kuò)展設(shè)計(jì)論文[5篇材料]

        1 前言筆者在用單片機(jī)開發(fā)一款稱重儀表時,功能較多,對串口的需求很高。需要的串口數(shù)量多,至少要五個串口,包括稱重傳感器通信串口,電腦上位機(jī)通信串口,GIM900A 通信串口,大屏幕數(shù)碼......

        STC單片機(jī)串口在線燒錄芯片問題總結(jié)

        STC單片機(jī)串口在線燒錄芯片問題總結(jié)在一個偶然和朋友聊天中了解了STC單片機(jī)芯片,從此一發(fā)不可收拾。當(dāng)時我看中STC芯片的一個主要原因是因?yàn)樗蠥D轉(zhuǎn)換功能和在線燒錄功能。......

        臺達(dá)DOPB10E615觸摸屏與PLC通信總結(jié)

        臺達(dá)DOPB10E615觸摸屏與PLC通信總結(jié) 觸摸屏與s7300通信可以有direct MPI 、ISO TCP通信、with PC adapter通信,現(xiàn)對前兩種通信方式設(shè)置過程進(jìn)行介紹。 1、所需軟件 ①Screen......

        STC12C5A60S2串口通信keil與proteus調(diào)試 自己總結(jié)

        STC12C5A60S2串口調(diào)試 需要軟件: 在keil里安裝。在debug里設(shè)置仿真器為: 點(diǎn)擊MCU連接程序: RS232: 虛擬終端: 程序: #include "STC12C5A60S2.h" #include "intrins.h" typedef un......