![全國大學(xué)生電子設(shè)計(jì)競(jìng)賽手繪繪圖板設(shè)計(jì)報(bào)告_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/30/00cd068c-3671-4bde-acdc-628f1b7fab66/00cd068c-3671-4bde-acdc-628f1b7fab661.gif)
![全國大學(xué)生電子設(shè)計(jì)競(jìng)賽手繪繪圖板設(shè)計(jì)報(bào)告_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/30/00cd068c-3671-4bde-acdc-628f1b7fab66/00cd068c-3671-4bde-acdc-628f1b7fab662.gif)
![全國大學(xué)生電子設(shè)計(jì)競(jìng)賽手繪繪圖板設(shè)計(jì)報(bào)告_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/30/00cd068c-3671-4bde-acdc-628f1b7fab66/00cd068c-3671-4bde-acdc-628f1b7fab663.gif)
![全國大學(xué)生電子設(shè)計(jì)競(jìng)賽手繪繪圖板設(shè)計(jì)報(bào)告_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/30/00cd068c-3671-4bde-acdc-628f1b7fab66/00cd068c-3671-4bde-acdc-628f1b7fab664.gif)
![全國大學(xué)生電子設(shè)計(jì)競(jìng)賽手繪繪圖板設(shè)計(jì)報(bào)告_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/30/00cd068c-3671-4bde-acdc-628f1b7fab66/00cd068c-3671-4bde-acdc-628f1b7fab665.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、2013年全國大學(xué)生電子設(shè)計(jì)競(jìng)賽手繪繪圖板設(shè)計(jì)報(bào)告(G題)【本科組】2013年9月6日1摘要:手寫繪圖板測(cè)繪系統(tǒng)設(shè)計(jì)采用Atmage16單片機(jī)進(jìn)行控制;主要以Atmage16為控制核心,雙中英文液晶12864顯示屏作為顯示模塊。并采用智能功率芯片BTS7960作為程控開關(guān)陣列,實(shí)現(xiàn)對(duì)PCB覆銅板的雙向電位檢測(cè),將檢測(cè)信號(hào)經(jīng)高精度儀表放大器AD623放大調(diào)理后,Atmage16自帶10位A/D采樣將信息反饋給單片機(jī),單片機(jī)將表筆坐標(biāo)信息顯示在液晶12864顯示屏上,并將顯示表筆的運(yùn)動(dòng)軌跡。本系統(tǒng)設(shè)計(jì)在器件選取、硬件電路設(shè)計(jì)上保證系統(tǒng)低功耗的要求,通過硬件設(shè)計(jì)和軟件編寫,實(shí)現(xiàn)手寫繪圖板測(cè)繪系統(tǒng)的基
2、本要求和題目發(fā)揮部分的要求。關(guān)鍵詞:Atmage16 單片機(jī) BTS7960 程控開關(guān) 手寫繪圖板 AD623 儀表放大器 低功耗目錄一.方案論證與設(shè)計(jì)3二.系統(tǒng)硬件電路設(shè)計(jì)82.1系統(tǒng)框圖:82.2系統(tǒng)模塊結(jié)構(gòu)圖:8三.系統(tǒng)軟件設(shè)計(jì)103.1系統(tǒng)軟件開發(fā):103.2表筆位置計(jì)算:103.3坐標(biāo)標(biāo)定算法113.4程序流程圖11四.系統(tǒng)安裝與測(cè)試結(jié)果分析13五.結(jié)論14六.參考文獻(xiàn)14附錄162一.方案論證與設(shè)計(jì)本次的手寫繪圖板測(cè)繪系統(tǒng)要求測(cè)量并顯示出表筆的位置,小組成員首先想到的是通過測(cè)量電壓的方式來確定表筆的位置。對(duì)于PCB覆銅板來說,實(shí)際上是一個(gè)阻值很小的電阻,由近似計(jì)算(把銅板近似看成一
3、條導(dǎo)線),由公式:(R為電阻值、為電阻率、S為橫截面積),可得出銅板的電阻值低于5毫歐。此外,由四線制測(cè)量小電阻的方法,如圖1.1,也可得出PCB覆銅板的電阻值很小。圖1.1對(duì)于測(cè)量表筆的位置,首先想到的是根據(jù)表筆測(cè)量位置的電阻值,然后由銅片的電阻值和表筆P點(diǎn)到銅片四角的電阻值,由比例關(guān)系推導(dǎo)出P點(diǎn)相對(duì)于四個(gè)角的位置,如圖1.2,但是由于銅片的電阻值很小,因此每個(gè)P點(diǎn)的測(cè)量值也是很小的,另外,由于銅片的電阻值不隨P點(diǎn)的位置變化呈現(xiàn)線性變化,因此比例關(guān)系式的推導(dǎo)過程復(fù)雜,整個(gè)過程存在較大的誤差。圖1.2因此小組成員想到從橫向、縱向不同時(shí)刻流過大電流的方式,測(cè)量P點(diǎn)的電壓值,這樣在同一時(shí)刻只取P點(diǎn)
4、X方向或Y方向的電壓值,如圖1.3,圖1.4所示;圖1.3圖1.4由于PCB覆銅板的電阻值很小,所以要保證大電流的通過,就對(duì)系統(tǒng)設(shè)計(jì)的散熱、功耗要求很高,所以此處采取的分時(shí)測(cè)量,方案中采取50ms測(cè)一次,時(shí)間保持1ms至2ms,這樣就可以使系統(tǒng)在短時(shí)間內(nèi)通過較大電流,而且保證較低的功耗和散熱。這里對(duì)于分時(shí)通電流測(cè)電壓方案的選擇如圖1.5所示:圖1.5對(duì)于上圖中的開關(guān)KA1、KB2、KC3、KD4,小組成員首先想到的是繼電器開關(guān),但是繼電器開關(guān)不滿足系統(tǒng)設(shè)計(jì)要求的1ms至2ms,這里我們想到了小組以前參加大學(xué)生科技創(chuàng)新活動(dòng)中用于電機(jī)控制的BTS7960模塊,BTS7960由高速的功率MOS管構(gòu)成
5、,響應(yīng)速度極快,穩(wěn)定性高,在這里作為開關(guān)非常的合適。通過分時(shí)的通斷4個(gè)BTS7960的控制開關(guān),實(shí)現(xiàn)電流AB向(橫向)、AC向(縱向)的流動(dòng),從而分別測(cè)量X值和Y值,此處以AB向?yàn)槔鐖D1.6所示,則開關(guān)陣列模塊等效為:圖1.6在上圖中,整個(gè)電路圖等效為一個(gè)近似恒流的激勵(lì)源,提供給后續(xù)的運(yùn)算放大,單片機(jī)處理模塊。在后續(xù)的放大模塊中,小組成員首先考慮了如圖1.7所示的放大電路:圖1.7但是上圖所示的電路,由于R銅的電阻值很小,所以R銅上的電壓變化范圍很小,影響精度。所以小組成員選擇了圖1.8所示電路:圖1.8對(duì)于放大電路模塊:采用圖1.9所示電路,仿真結(jié)果如1.20所示:圖1.9圖1.20在電
6、路中:運(yùn)算放大器采用AD623高精度、低功耗集成儀表放大器,僅需要一個(gè)外部電阻來設(shè)置增益,電壓增益高,其增益最高可達(dá)1000倍,放大性能好,因?yàn)橐WC運(yùn)放的輸出要大于0伏,以便提供給Atmage16單片機(jī)處理,所以電路采取5V至12V雙電源供電,而不采用單電源供電,這樣就可以產(chǎn)生0V至5V的電壓值供給Atmage16的ADC進(jìn)行處理。TL431穩(wěn)壓二極管電路模塊可提供2.5V的基準(zhǔn)電壓,使得運(yùn)算放大器的輸出電平抬高2.5V便于AD轉(zhuǎn)換。運(yùn)算放大器的輸出連接的49.9K電阻,起到對(duì)單片機(jī)限流的作用,使得通過單片機(jī)不會(huì)因?yàn)殡娏鬟^大而燒壞,也不會(huì)因?yàn)殡娏鬟^小而導(dǎo)致輸出結(jié)果不準(zhǔn)確。至于電路的放大倍數(shù),
7、由AD620電壓增益公式:(為1腳、8角之間電阻值),電路采用AD623的一級(jí)放大1000倍,電路設(shè)計(jì)相對(duì)簡(jiǎn)單,這樣是考慮到多級(jí)放大所帶來的硬件電路的設(shè)計(jì)會(huì)很困難,且容易出錯(cuò),所以電路還是選擇了一級(jí)放大。這里的Atmage16單片機(jī)為高性能,低功耗的8位AVR微處理器,運(yùn)算能力強(qiáng)、處理速度和中斷響應(yīng)能力極好,其自帶的8路10位ADC,最高分辨率時(shí)采樣率可達(dá)15kSPS,轉(zhuǎn)換時(shí)間13260us,較之51等系列單片機(jī)性能高、速度快、低功耗、性價(jià)比高,調(diào)試簡(jiǎn)單。二.系統(tǒng)硬件電路設(shè)計(jì)2.1系統(tǒng)框圖:圖2.1電源模塊:由已給的+12V電源給出系統(tǒng)所需要的+5V、5V電源;BTS7960開關(guān)陣列:實(shí)現(xiàn)電流
8、AB向(橫向)、AC向(縱向)的流動(dòng),從而分別測(cè)量X值和Y值;手寫繪圖板:PCB覆銅板;放大及調(diào)理電路:由AD623構(gòu)成的運(yùn)算放大電路;Atmage16單片機(jī)主控單元(含ADC):由Atmage16作為主處理芯片的單元運(yùn)算電路;LCD顯示:液晶12860顯示屏;2.2系統(tǒng)模塊結(jié)構(gòu)圖:圖2.2(5V穩(wěn)壓模塊)圖2.3(5穩(wěn)壓模塊)圖2.4(開關(guān)陣列)圖2.5(放大及調(diào)理電路)圖2.6(12864液晶電路)三.系統(tǒng)軟件設(shè)計(jì)3.1系統(tǒng)軟件開發(fā):AVR studio是ATMEL公司的AVR單片機(jī)的集成環(huán)境匯編及開發(fā)調(diào)試軟件,ATMEL AVR Studio集成開發(fā)環(huán)境(IDE) ,包括了AVR Ass
9、embler編譯器、AVR Studio調(diào)試功能、AVR Prog串行、并行下載功能和JTAG ICE仿真等功能。它集匯編語言編譯、軟件仿真、芯片程序下載、芯片硬件仿真等一系列基礎(chǔ)功能,與任一款高級(jí)語言編譯器配合使用即可完高級(jí)語言的產(chǎn)品開發(fā)調(diào)試。3.2表筆位置計(jì)算:X軸方向來回兩次采集到的AD值相加再除以二,得到X軸水平方向的中點(diǎn)位置;Y軸方向的中點(diǎn)位置用同樣的方法求得。3.3坐標(biāo)標(biāo)定算法Y軸方向的中點(diǎn)位置用同樣的方法計(jì)算得到。X軸方向上某一點(diǎn)的AD值就等于X軸方向的AD值減去中間值再減去AD的偏移量,偏移量主要來自前端的放大電路的影響,相當(dāng)于一個(gè)零位標(biāo)定,部分代碼如下:yp = yp1 -
10、ad_y_center - OFFSET_Y;然后再進(jìn)行歸一化處理,使采集到AD值在坐標(biāo)顯示的范圍內(nèi)從而標(biāo)定坐標(biāo)。3.4程序流程圖如圖4.1所示:11開始結(jié)束顯示圖形顯示坐標(biāo)數(shù)據(jù)顯示坐標(biāo)軸調(diào)用畫圖函數(shù)清屏顯示-A/D轉(zhuǎn)換讀取AD值是否>1000改變電流方向使能7960觸發(fā)中斷等待中斷100ms定時(shí)器各模塊初始化圖4.1四.系統(tǒng)安裝與測(cè)試結(jié)果分析如圖4.1所示:圖4.1LCD顯示結(jié)果測(cè)量,如表4.1所示:表4.1LCD顯示實(shí)際測(cè)量測(cè)試誤差X/mmY/mmX/mmY/mmX/mmY/mm測(cè)試點(diǎn)1000001000100測(cè)試點(diǎn)230003740704測(cè)試點(diǎn)3202025270507測(cè)試點(diǎn)4-3
11、0-30-34-390409測(cè)試點(diǎn)5002000200000功耗測(cè)量分析,如圖4.2所示,表4.2所示:圖4.2表4.21234電壓值/V12.012.111.911.8電流值/A0.10.10.10.1功耗值/W0.1201210.1190.118五.結(jié)論首先,這次小組成員一起參加本次競(jìng)賽確實(shí)是一次收獲很大的經(jīng)歷,經(jīng)過組內(nèi)成員的團(tuán)結(jié)協(xié)作,最終完成了題目的基本要求部分和發(fā)揮部分的要求,本次比賽也提高了我們分析問題、解決問題的實(shí)踐能力,最重要的是增強(qiáng)了我們團(tuán)隊(duì)協(xié)作意識(shí)和創(chuàng)新能力以及和諧相處的能力,讓我們真正體會(huì)到理論運(yùn)用于實(shí)踐,在實(shí)踐中鞏固理論知識(shí)。特別是在競(jìng)賽過程中在遇到困難時(shí)大家一起鏖戰(zhàn)幾天
12、幾夜的經(jīng)歷也給了我們成長(zhǎng)過程中一筆巨大的寶貴財(cái)富,我們都會(huì)好好珍惜。六.參考文獻(xiàn)1.杭和平,邵明剛,楊芳,AVR單片機(jī)原理與GCC編程實(shí)踐中國電力出版社,2012年9月第一版2.譚浩強(qiáng),C程序設(shè)計(jì)清華大學(xué)出版社,2005年7月第三版3.華成英,模擬電子技術(shù)基礎(chǔ)M高等教育出版社,200015附錄附錄一 系統(tǒng)原理圖附件二 程序清單#include <avr/io.h>#define F_CPU 8000000UL / 12 MHz#include <util/delay.h>#include <avr/interrupt.h>/#include <avr/
13、math.h>#include "AVR_HJ-2G.h"/包含自定義常量頭文件volatile uint8_t t0int_cnt,t0int_cnt2;#define PAD_A PD1/REMOVE J1#define PAD_B PD2#define PAD_C PD3#define PAD_D PD4/#define off_pad (PORTD &=(1<<PD5),PORTD&=(1<<PAD_A),PORTD&=(1<<PAD_C),PORTD&=(1<<PAD_B),PO
14、RTD&=(1<<PAD_D)#define off_pad (PORTD = 0x00 ,Delayus(1)#define on_pad (PORTD |=(1<<PD5),Delayus(1)#define switch_AC2BD (PORTD=0x2a)#define switch_BD2AC (PORTD=0x34)#define switch_AB2CD (PORTD=0x26)#define switch_CD2AB (PORTD=0x38)#define OFFSET_X 0#define OFFSET_Y 0#define SPAN_X 11
15、0#define SPAN_Y 23volatile unsigned int gad_AB20;volatile unsigned int gad_CD20;volatile unsigned int gad_BA20;volatile unsigned int gad_DC20;volatile unsigned int gad_CD20;volatile unsigned int gad_AC20;volatile unsigned int gad_DB20;volatile unsigned int gad_CA20;volatile unsigned int gad_BD20;vol
16、atile signed int ad_AB,ad_CD,ad_BA,ad_DC,ad_AC,ad_CA,ad_BD,ad_DB,adat;volatile signed int ad_x_center,ad_y_center; uchar isNeedPoint=0;signed int xp=29;signed int yp=0;uchar count; void showCoordinate(void); void LCD12864_Show4NUM(uint data); void showDebugData();/* 端口初始化*/void PORT_init(void) DDRD
17、|=0x3e; DDRA |=0x07; DDRB |=0xff; /DDRC |=(1<<0);/*函數(shù)名稱: LCD12864_portini功 能: 初始化12864液晶用到的IO口參 數(shù): 無返回值 : 無*/void LCD12864_portini(void)LCDb_CTRL_DDR |= BIT(LCDb_RS)|BIT(LCDb_RW)|BIT(LCDb_E);/配置控制管腳為輸出LCDb_DATA_DDR |= 0xFF; /配置數(shù)據(jù)管腳為輸出LCDb_SET_RST;/不使能復(fù)位端DDRC |=(1<<PC0); /PSBPORTC |=(1<
18、;<PC0); /并行方式/*函數(shù)名稱: LCD12864_readbyte功 能: 從12864液晶讀出一個(gè)字節(jié)數(shù)據(jù)或者指令參 數(shù): DatCmd-為iDat時(shí)是數(shù)據(jù),為iCmd時(shí)是指令返回值 : dByte-讀回的數(shù)據(jù)或者指令*/uchar LCD12864_readbyte(uchar DatCmd) uchar dByte;if (DatCmd = iCmd) /指令操作LCDb_CLR_RS;elseLCDb_SET_RS;LCDb_SET_RW; /讀操作LCDb_SET_E;LCDb_DATA_DDR=0x00; /數(shù)據(jù)總線定義為輸入dByte=LCDb_DI; /讀數(shù)據(jù)或
19、者指令Delayus(300); /時(shí)序調(diào)整LCDb_CLR_E;LCDb_DATA_DDR|=0xff; /數(shù)據(jù)總線還原為輸出return dByte;/*函數(shù)名稱: LCD12864_sendbyte功 能: 向12864液晶寫入一個(gè)字節(jié)數(shù)據(jù)或者指令參 數(shù): DatCmd-為iDat時(shí)是數(shù)據(jù),為iCmd時(shí)是指令 dByte-為寫入12864的數(shù)據(jù)或者指令返回值 : 無*/void LCD12864_sendbyte(uchar DatCmd, uchar dByte)if (DatCmd = iCmd)/指令操作LCDb_CLR_RS;elseLCDb_SET_RS;LCDb_CLR_RW
20、;/寫操作LCDb_SET_E;LCDb_DO = dByte;/寫入數(shù)據(jù)Delayus(100);LCDb_CLR_E;/*函數(shù)名稱: LCD12864_sendstr功 能: 向12864液晶寫入一個(gè)字符串參 數(shù): ptString-字符串指針返回值 : 無*/void LCD12864_sendstr(uchar *ptString)while(*ptString)!='0') /字符串未結(jié)束一直寫LCD12864_sendbyte(iDat, *ptString+);void LCD12864_Show4NUM(uint data) unsigned char i =
21、0; unsigned char temp4 = 0;unsigned char StartFlag=0; if(data = 0) LCD12864_sendstr(" 0"); else temp0 = data / 1000 % 10; temp1 = data / 100 % 10; temp2 = data / 10 % 10; temp3 = data % 10; for(i = 0; i < 4; i+) if(tempi != 0) StartFlag = 1; if(StartFlag = 1) LCD12864_sendbyte(iDat,temp
22、i + '0'); else LCD12864_sendbyte(iDat, ' '); void LCD12864_Show3NUM(signed char data) unsigned char i = 0; unsigned char temp3 = 0;if(data>99 | data<-99)return;if(data>=0)LCD12864_sendbyte(iDat,' ' );else LCD12864_sendbyte(iDat,' ' );data=-data;/aaa=abs(data)
23、; temp1 = data / 10 + '0' temp2 = data % 10 + '0' for(i = 1; i < 3; i+) LCD12864_sendbyte(iDat,tempi ); /* if(data = 0) LCD12864_sendstr(" 0"); else temp0 = data / 100 % 10; temp1 = data / 10 % 10; temp2 = data % 10; for(i = 0; i < 3; i+) if(tempi != 0) StartFlag = 1;
24、 if(StartFlag = 1) LCD12864_sendbyte(iDat,tempi + '0'); else LCD12864_sendbyte(iDat, ' '); */*函數(shù)名稱: LCD12864_clear功 能: 12864液晶清屏參 數(shù): 無返回值 : 無*/void LCD12864_clear(void)LCD12864_sendbyte(iCmd,LCDb_CLS);Delayms(2);/ 清屏指令寫入后,2ms 的延時(shí)是很必要的!/*函數(shù)名稱: LCD12864_busy功 能: 12864液晶清屏參 數(shù): 無返回值 : bu
25、sy-為1時(shí)忙,為0時(shí)可以接收指令*/uchar LCD12864_busy(void) uchar busy;busy=LCD12864_readbyte(iCmd);/讀回BF標(biāo)志和地址if(busy&0x80)/如果忙,返回忙狀態(tài)busy=1;else /不忙,可以寫入busy=0;return busy;/*函數(shù)名稱: LCD12864_gotoXY功 能: 移動(dòng)到指定位置參 數(shù): Row-指定的行 Col-指定的列返回值 : 無*/void LCD12864_gotoXY(uchar Row, uchar Col)switch (Row) /選擇行case 2:LCD1286
26、4_sendbyte(iCmd, LCDb_L2 + Col); break;/寫入第2行的指定列case 3:LCD12864_sendbyte(iCmd, LCDb_L3 + Col); break;/寫入第3行的指定列case 4:LCD12864_sendbyte(iCmd, LCDb_L4 + Col); break;/寫入第4行的指定列default:LCD12864_sendbyte(iCmd, LCDb_L1 + Col); break;/寫入第1行的指定列/*函數(shù)名稱: LCD12864_initial功 能: 12864液晶初始化參 數(shù): 無返回值 : 無*/void LC
27、D12864_initial(void)Delayms(100);/ 等待內(nèi)部復(fù)位LCD12864_portini();/端口初始化LCD12864_sendbyte(iCmd, LCDb_FUNCTION);/功能、模式設(shè)定while(LCD12864_busy();LCD12864_sendbyte(iCmd, LCDb_ON);/打開顯示while(LCD12864_busy();LCD12864_clear();/清屏while(LCD12864_busy();LCD12864_sendbyte(iCmd, LCDb_ENTRY);/ 輸入模式設(shè)定/* 畫點(diǎn)函數(shù)*/void LCD12
28、864_DrawPoint(uchar x, uchar y) unsigned char x_byte, x_bit; /在橫坐標(biāo)的哪一個(gè)字節(jié),哪一個(gè)位 unsigned char y_byte, y_bit; /在縱坐標(biāo)的哪一個(gè)字節(jié),哪一個(gè)位uchar tmpH,tmpL; x_byte = x / 16; /算出它在哪一個(gè)字節(jié)(地址) /注意一個(gè)地址是16位的 x_bit = x % 16; /(取模)算出它在哪一個(gè)位 y_byte = y / 32; /y是沒在哪個(gè)字節(jié)這個(gè)說法 /這里只是確定它在上半屏(32行為一屏)還是下半屏 /0:上半屏 1:下半屏 y_bit = y % 32;
29、 /y_bit確定它是在第幾行 /先寫垂直地址 LCD12864_sendbyte(iCmd, 0x80 + y_bit); Delay1us(); /水平坐標(biāo) /下半屏的水平坐標(biāo)起始地址為0x88 /(+8*y_byte)就是用來確定在上半屏還是下半屏 LCD12864_sendbyte(iCmd, 0x80 + x_byte + 8 * y_byte); Delay1us(); /read LCD12864_readbyte(iDat); tmpH=LCD12864_readbyte(iDat); tmpL=LCD12864_readbyte(iDat);if(x_bit < 8)
30、/如果x_bit位數(shù)小于8 20tmpH|=0x01 << (7 - x_bit); else tmpL|=0x01 << (15 - x_bit); LCD12864_sendbyte(iCmd, 0x80 + y_bit); Delay1us(); LCD12864_sendbyte(iCmd, 0x80 + x_byte + 8 * y_byte); Delay1us(); LCD12864_sendbyte(iDat, tmpH); /寫高字節(jié)。因?yàn)樽鴺?biāo)是從左向右的 Delay1us();/而GDRAM高位在左,低位在右 LCD12864_sendbyte(iD
31、at, tmpL); /低字節(jié)全部填0 Delay1us();void LCD12864_clearGDRAM(void) uchar i, j; uint x = 0;i=0;while(LCD12864_busy() && i<1990)i+;/ while(LCD12864_busy(); /讀忙標(biāo)志 LCD12864_sendbyte(iCmd, LCDb_EXTCMD1);/擴(kuò)充指令集,并關(guān)閉繪圖顯示 /寫入并顯示上半屏幕 for(i = 0; i < 32; i+) /行地址計(jì)數(shù) for(j = 0; j < 8; j+) /列地址計(jì)數(shù) LCD12
32、864_sendbyte(iCmd, 0x80 | i); /輸入行地址 Delayus(10); LCD12864_sendbyte(iCmd, 0x80 | j); /輸入列地址 Delayus(10); LCD12864_sendbyte(iDat, 0x00); /輸入高位字節(jié)數(shù)據(jù) Delayus(10); LCD12864_sendbyte(iDat, 0x00); /輸入低位字節(jié)數(shù)據(jù) Delayus(10); /寫入并顯示下半屏幕 for(i = 0; i < 32; i+) for(j = 8; j < 16; j+) LCD12864_sendbyte(iCmd,
33、0x80 | i); /輸入行地址 Delayus(10); LCD12864_sendbyte(iCmd, 0x80 | j); /輸入列地址 Delayus(10); LCD12864_sendbyte(iDat, 0x00); /輸入高位字節(jié)數(shù)據(jù) Delayus(10); LCD12864_sendbyte(iDat, 0x00); /輸入低位字節(jié)數(shù)據(jù) Delayus(10); Delayus(10); LCD12864_sendbyte(iCmd, LCDb_EXTCMD2); /打開繪圖顯示 LCD12864_sendbyte(iCmd, LCDb_BASCMD); /還原回基本指令
34、集模式void LCD12864_DrawXline(uchar X0, uchar X1, uchar Y) /畫 X軸水平線 uchar temp; if (X0 > X1) temp = X1; X1 = X0; X0 = temp; for(; X0 <= X1; X0+) LCD12864_DrawPoint(X0, Y); void LCD12864_DrawYline(uchar X, uchar Y0, uchar Y1) /畫 Y軸水平線 uchar temp; if (Y0 > Y1) temp = Y1; Y1 = Y0; Y0 = temp; for(
35、; Y0 <= Y1; Y0+) LCD12864_DrawPoint(X, Y0); #define WIDTH96#define HEIGHT 64void DrawCoordinate(void) LCD12864_DrawXline(0, WIDTH - 1, HEIGHT / 2); LCD12864_DrawYline(WIDTH / 2, 0, HEIGHT - 1); LCD12864_DrawXline(WIDTH / 4, WIDTH * 3 / 4, HEIGHT / 4); LCD12864_DrawXline(WIDTH / 4, WIDTH * 3 / 4,
36、HEIGHT * 3 / 4); LCD12864_DrawYline(WIDTH / 4, HEIGHT / 4, HEIGHT * 3 / 4); LCD12864_DrawYline(WIDTH * 3 / 4, HEIGHT / 4, HEIGHT * 3 / 4);/* 畫圖函數(shù)*/void testLine(void)signed int xp_c, yp_c; if(xp>=99 | yp>=99)return ; while(LCD12864_busy(); /讀忙標(biāo)志 LCD12864_sendbyte(iCmd, LCDb_EXTCMD1);/擴(kuò)充指令集,并關(guān)閉
37、繪圖顯示 LCD12864_sendbyte(iCmd, LCDb_EXTCMD2);/擴(kuò)充指令集,并關(guān)閉繪圖顯示cli();xp_c=xp;yp_c=yp;sei(); xp_c=96/2-xp_c*96/120; yp_c=48/2-yp_c*48/64; LCD12864_DrawPoint(xp_c,yp_c); Delayus(10); /LCD12864_sendbyte(iCmd, LCDb_EXTCMD2); /打開繪圖顯示 LCD12864_sendbyte(iCmd, LCDb_BASCMD); /還原回基本指令集模式/* 定時(shí)器初始化*/void T0_init(void
38、) TCCR0 = 0b00000100; TCNT0 = 100;/ 產(chǎn)生5ms中斷的初值 TIMSK = (1<<TOIE0);/ 允許T/C0溢出中斷/* AD初始化*/void ADC_Init(void)ADMUX=0b01000000; / 0b01xxxxxx ACC; 0bxx0xxxxx 右對(duì)齊; 0bxxx00000 通道選擇 ADCSRA=0x87;/使能ADC,單次轉(zhuǎn)換模式,禁止中斷,64分頻8M/64=125khz/* AD轉(zhuǎn)換*/int16_t readADValue(uint8_t ch) / ch=36 PA0-PA2 for LCD12864; R
39、EMOVE R1(PA3),R34(PA4),R35(PA5), PA6int16_t tmp;ADMUX = (ADMUX & 0xe0) | ch; ADCSRA |=_BV(ADSC);/啟動(dòng)AD轉(zhuǎn)換 while(!(ADCSRA&_BV(ADIF);/等待AD轉(zhuǎn)換完畢 ADCSRA|=_BV(ADIF);/寫1 清ADIF標(biāo)志位 tmp=ADCL;/ADCL first tmp=(ADCH<<8)+tmp; return tmp;/* 數(shù)據(jù)采集*/void startTest()/signed int xp1,xp2,yp1,yp2;signed long
40、tmp32;uchar i;volatile int tmp;/adat=readADValue(3);count+;if(count=8)count=0;off_pad;switch_AC2BD;on_pad;Delayus(50);ad_AB=readADValue(3);ad_CD=readADValue(4);gad_ABcount=ad_AB;gad_CDcount=ad_CD;off_pad;switch_BD2AC;on_pad;Delayus(50);ad_BA=readADValue(3);ad_DC=readADValue(4);gad_BAcount=ad_BA;gad_
41、DCcount=ad_DC;off_pad;switch_AB2CD;on_pad;Delayus(50);ad_AC=readADValue(5);ad_BD=readADValue(6);gad_ACcount=ad_AC;gad_BDcount=ad_BD;off_pad;switch_CD2AB;on_pad;Delayus(50);ad_CA=readADValue(5);ad_DB=readADValue(6);gad_CAcount=ad_CA;gad_DBcount=ad_DB;off_pad;/xp1=(ad_AB + ad_CD)/2;/xp2=(ad_BA + ad_DC
42、)/2;/ad_x_center=(xp1+xp2)/2;/xp = xp1 - ad_x_center - OFFSET_X; / offset calibrate/yp1=(ad_AC + ad_BD)/2;/yp2=(ad_CA + ad_DB)/2;/ad_y_center=(yp1+yp2)/2;/yp = yp1 - ad_y_center - OFFSET_Y; /offsetif(t0int_cnt2 % 5 = 0)xp1=0;xp2=0;for(i=0;i<8;i+)xp1 += gad_ABi+gad_CDi;xp2 += gad_BAi+gad_DCi;xp1=x
43、p1/16;xp2=xp2/16;ad_x_center=(xp1+xp2)/2;xp = xp1 - ad_x_center - OFFSET_X; / offset calibrateyp1=0;yp2=0;for(i=0;i<8;i+)yp1 += gad_ACi+gad_BDi;yp2 += gad_CAi+gad_DBi;yp1=yp1/16;yp2=yp2/16;ad_y_center=(yp1+yp2)/2;yp = yp1 - ad_y_center - OFFSET_Y; /offset/歸一化到 => -30+30 (60mm)if(ad_AB>999 |
44、 ad_AB<9 | ad_BA>999 | ad_BA<9)xp=99;/pen off from pad ; xianshi -else tmp32 = (signed long)xp * 30 / SPAN_X;/span calibratexp = (signed int)tmp32;/歸一化到 => -20+20if(ad_AC>999 | ad_AC<9 | ad_CA>999 | ad_CA < 9 )yp=99;else tmp32 = (signed long)yp * 20 / SPAN_Y;yp = (signed int)tmp32; if(ad_AB>900)isNeedPoint=0; e
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 倉儲(chǔ)托管配送合同范例
- 儀器供貨合同范例
- 企業(yè)代人購車合同范例
- 京劇演員合同范例
- 樂都區(qū)代理記賬合同范例
- 代理員工合同范例
- 分租合同范本和合同
- 棋牌室裝修承包合同樣本
- 2025年倉庫租用合同示范文本
- 2025年個(gè)人借款合同風(fēng)險(xiǎn)預(yù)警
- 寧夏“8·19”較大爆燃事故調(diào)查報(bào)告
- 中國高血壓防治指南(2024年修訂版)解讀課件
- 2024年員工規(guī)章制度具體內(nèi)容范本(三篇)
- 2024年浙江省中考科學(xué)試卷
- 初三科目綜合模擬卷
- 2024年全國高考新課標(biāo)卷物理真題(含答案)
- 勞動(dòng)合同薪酬與績(jī)效約定書
- 消除醫(yī)療歧視管理制度
- 柴油機(jī)油-標(biāo)準(zhǔn)
- 足療店?duì)I銷策劃方案
- 學(xué)校安全一崗雙責(zé)
評(píng)論
0/150
提交評(píng)論