第一篇:QwebKit使用心得.
QwebKit使用心得.QwebKit使用心得
最近這段時間,正在用QWebkit開發(fā)一個Application store的項目。因為需要用到第三方的數(shù)據(jù),但后臺無法直接去獲取,所以需要做一個底層的模塊,去獲取第三方數(shù)據(jù),然后給網(wǎng)頁調(diào)用,因此我們選取了以WebKit為引擎的QWebkit來開發(fā)我們的項目。
在開發(fā)中,獲得了一些心得體會,寫下來供大家參考。為了方便說明,我特意做了一個例子。
(圖1)
此例子中,左邊顯示網(wǎng)頁,右邊是控件部分。
用戶在網(wǎng)頁的Name和Password輸入框輸入內(nèi)容后,點擊“Submit”按鈕,則右邊的Name和Password框則會出現(xiàn)網(wǎng)頁中的內(nèi)容,這就是網(wǎng)頁調(diào)用Qt模塊。
而用戶在右邊輸入分別輸入Name和Password,點擊“Call JS”后,輸入的信息也會顯示在左邊的Name和Password欄。這就是Qt調(diào)用網(wǎng)頁。
由此我們可以看出QWebKit,即可以Qt調(diào)用網(wǎng)頁,也可以網(wǎng)頁調(diào)用Qt。這樣我們就可以做用Qt做一些網(wǎng)頁做不了的事情。
接下來,將闡述如何實現(xiàn)Qt和網(wǎng)頁互相調(diào)用。
首先,在“圖1”所示的主界面中生成WebKit控件,可以自己new或者在Design中拖入。在本例中,采取的是拖入此控件。此控件對應(yīng)的類是QWebView。它可以Load和顯示頁面。通過此控件我們來調(diào)用網(wǎng)頁的方法和接受網(wǎng)頁的調(diào)用。本主界面的類是
#include
Q_OBJECTpublic:
QWebKitTest(QWidget *parent = 0, Qt::WFlags flags = 0);
~QWebKitTest();
void setValueFromWeb(const QString &strName,const QString &strPwd);protected slots:
void onBtnCallJSClicked();
void populateJavaScriptWindowObject();private:
Ui::QWebKitTestClass ui;
MyWebKit m_webObj;};而WebKit控件則是
class Ui_QWebKitTestClass { public:
QWebView *webView;
主界面通過下面的形式調(diào)用。ui.webView 接下來我們將用ui.webView來見證奇跡誕生的時刻。
首先我們先來弄清楚第一個問題,怎么將Qt和網(wǎng)頁聯(lián)系起來,使之能夠互相調(diào)用?
估計這是大部分看官最關(guān)心的吧。嗯,好吧。廣告時間到
各位看官也來看看這個帖子吧,Qt的Signal和Slot機制(一),給鄙人攢點人氣,謝了 Qt使用的是向網(wǎng)頁注冊一個QObject對象,通過這個對象,網(wǎng)頁可以通過這個調(diào)用這個對象的方法來實現(xiàn)調(diào)用底層的邏輯。
以下是本例中的注冊對象的聲明,class MyWebKit : public QObject {
Q_OBJECTpublic:
MyWebKit(QObject *parent);
~MyWebKit();public slots:
void onCall(QString strName,QString strPwd);
private:
};
而Qt則通過,調(diào)用下列方法把注冊對象注入到網(wǎng)頁中,ui.webView->page()->mainFrame()-> addToJavaScriptWindowObject(QString(“mywebkit”),&m_webObj);
注冊過程如下,ui.webView->setUrl((QUrl(“qrc:/form.html”));
ui.webView->page()->mainFrame()->addToJavaScriptWindowObject(QString(“mywebkit”),&m_webObj);
看官注意,m_webObj就是注入到網(wǎng)頁中的QObject對象,而“mywebkit”是此對象在網(wǎng)頁中的名字。在網(wǎng)頁中,“mywebkit“就代表著m_webObj,被當(dāng)作一個javascript對像來調(diào)用。具體細(xì)節(jié)請看下列網(wǎng)頁代碼,
Name:
Password:
在此網(wǎng)頁中,當(dāng)用戶點擊圖1中的左邊網(wǎng)頁的Submit按鈕時,就會調(diào)用calltoqt的javascript方法。在calltoqt中,我們獲取了username和userpwd的值后,就調(diào)用window.mywebkit.onCall的方法,來通知底層Qt模塊,這里的mywebkit就是我們剛注冊的m_webObj,OnCall就是MyWebKit類的成員函數(shù)。當(dāng)網(wǎng)頁調(diào)用這個函數(shù)時,Qt模塊的MyWebKit::OnCall函數(shù)就會被調(diào)用。代碼如下:
void MyWebKit::onCall(QString strName,QString strPwd){
QWebKitTest *pMain =(QWebKitTest*)parent();
pMain->setValueFromWeb(strName,strPwd);} 在此函數(shù)中,MyWebKit會調(diào)用主界面(QWebKitTest)的setValueFromWeb方法,將網(wǎng)頁中的Name和Password欄的內(nèi)容放到右邊的Name和Password控件中顯示出來。
代碼如下,void QWebKitTest::setValueFromWeb(const QString &strName,const QString &strPwd)
{
ui.textEdit_name->setText(strName);
ui.textEdit_pwd->setText(strPwd);
}
但是不是所注冊對象的成員函數(shù)都可以被調(diào)用呢?答案是否定的,只有Slot函數(shù)才能被網(wǎng)頁調(diào)用,其他的則不能。因為這是一個signal-slot過程。
Qt是如何調(diào)用網(wǎng)頁的呢?我們來看以下的例子。
當(dāng)用戶在右邊的Name和Password控件填入內(nèi)容后,點擊”Call JS“按鈕,Qt就調(diào)用evaluateJavaScript函數(shù)來改變網(wǎng)頁的行為。具體代碼如下,void QWebKitTest::onBtnCallJSClicked(){
QString strVal = QString(”callfromqt(“%1”,“%2”);“).arg(ui.textEdit_name->toPlainText()).arg(ui.textEdit_pwd->toPlainText());
ui.webView->page()->mainFrame()->evaluateJavaScript(strVal);} 我們可以看到evaluateJavaScript的參數(shù),實際上就是一段javascript代碼(callfromqt(”andrei“,”12345“);)。Qt底層模塊通過evaluateJavaScript調(diào)用了網(wǎng)頁中的”callfromqt“方法
function callfromqt(name,pwd)
{
var nameArray;
nameArray = document.getElementsByName(”username“);
var pwdArray;
pwdArray = document.getElementsByName(”userpwd“);
nameArray[0].value = name;
pwdArray[0].value = pwd;
}
使右邊的Name和Password控件中的值,賦到了左邊網(wǎng)頁中Name和Password的輸入框中。
當(dāng)然,evaluateJavaScript的參數(shù)不一定只是javascript方法,同樣一段javascript代碼也是可以的。比如以上功能也可以這樣調(diào)用
ui.webView->page()->mainFrame()->evaluateJavaScript(” var nameArray;
nameArray = document.getElementsByName(“username”);
var pwdArray;
pwdArray = document.getElementsByName(“userpwd”);
nameArray[0].value = “andrei”;
pwdArray[0].value = “123456”;");但這就是QWebKit的全部真相嗎?
請聽下回分解
注明:此文章本人在CSDN上同步發(fā)布。
第二篇:EXCEL使用心得
一、讓格式自動添加固定的數(shù)字
例子:
大家知道,身份證號碼的前6位,是省、市、區(qū)(縣)的代號(如“340505”等),如果持證人是同一區(qū)(縣)的,輸入這樣的的身份證號碼,可以讓“數(shù)字”標(biāo)簽幫你減輕輸入的工作量:選中需要輸入身份證號碼的單元格(區(qū)域),打開“單元格格式”對話框,進(jìn)入“數(shù)字”標(biāo)簽,在“分類”下面選中“自定義”選項,然后在右側(cè)“類型”下面的方框中輸入:“340505”@,確定退出。以后輸入身份證號碼7位及以后的數(shù)字(如“198903040611”)后,系統(tǒng)會自動在前面加上相應(yīng)的代碼,形成完整的身份證號碼(如“***611”)。
二.教你使用Excel數(shù)組公式
Excel中數(shù)組公式非常有用,尤其在不能使用工作表函數(shù)直接得到結(jié)果時,數(shù)組公式顯得特別重要,它可建立產(chǎn)生多值或?qū)σ唤M值而不是單個值進(jìn)行操作的公式。
輸入數(shù)組公式首先必須選擇用來存放結(jié)果的單元格區(qū)域(可以是一個單元格),在編輯欄輸入公式,然后按Ctrl+Shift+Enter組合鍵鎖定數(shù)組公式,Excel將在公式兩邊自動加上花括號“{}”。注意:不要自己鍵入花括號,否則,Excel認(rèn)為輸入的是一個正文標(biāo)簽。
選取數(shù)組公式所占有的全部區(qū)域先選中區(qū)域中任意一個單元格,然后按下Ctrl+/鍵即可。編輯或刪除數(shù)組公式編輯數(shù)組公式時,須選取數(shù)組區(qū)域并且激活編輯欄,公式兩邊的花括號將消失,然后編輯公式,最后按Ctrl+Shift+Enter鍵。選取數(shù)組公式所占有的全部區(qū)域后,按Delete鍵即可刪除數(shù)組公式。
數(shù)組常量的使用數(shù)組公式中還可使用數(shù)組常量,但必須自己鍵入花括號“{}”將數(shù)組常量括起來,并且用“,”和“;”分離元素。其中“,”分離不同列的值,“;”分離不同行的值。
使用不在工作表中的數(shù)組有時,公式僅占用一個單元格時也需要以數(shù)組的方式輸入。其具體原則是:一個公式使用了數(shù)組,并且這個數(shù)組不在工作表上,就應(yīng)該使用數(shù)組的方式輸入這個公式。
下面介紹兩個使用數(shù)組公式的例子。
1.如需分別計算各商品的銷售額,可利用數(shù)組公式來實現(xiàn)。
單元格F2中的公式為:{=SUM(IF(A2:A11=″商品1″,B2:B11*C2:C11,0))}。這個數(shù)組公式創(chuàng)建了一個條件求和,若在A2:A11中出現(xiàn)值“商品1”,則數(shù)組公式將B2:B11和C2:C11中與其相對應(yīng)的值相乘并累加,若是其他值則加零。同時,雖然數(shù)組B2:B11和C2:C11均在工作表中,但其相乘的數(shù)組B2:B11*C2:C11不在工作表中,因此必須使用數(shù)組公式。
2.假設(shè)要將A1:A50區(qū)域中的所有數(shù)值舍入到2位小數(shù)位,然后對舍入的數(shù)值求和。很自然地就會想到使用公式:=ROUND(A1,2)+ROUND(A2,2)+…+ROUND(A50,2)。
有沒有更簡捷的算法呢?有。因為數(shù)組ROUND(A1:A50,2)并不在工作表中,因此要使用數(shù)組的方式輸入公式,即:{=SUM(ROUND(A1:A50,2))}。
三、自動更正
1.從工具菜單中選擇“自動更正”,打開自動更正對話框。
2.在“替換”框中輸入數(shù)據(jù),如:“4z”,在“替換為”框中輸入數(shù)據(jù),如:“棗陽市第四中學(xué)”,單擊“添加”,再單擊 “確定”。
之后,只需在單元格中輸入“4z”兩字,即會自動更正為“棗陽市第四中學(xué)”。
四、在excel工作表中輸入計算公式時,如果想讓儲存格在顯示計算結(jié)果和計算公式本身之間切換,您會采取什么方式呢?
是不是每次都從“工具”>“選項”>“視圖”>“窗口選項”>“公式”來切換呢?有沒有更簡便的方法呢?
其實,我們可以利用“ Ctrl+` ”鍵來決定顯示或隱藏公式,每按一次就可讓儲存格在顯示計算的結(jié)果和計算公式本身之間自由切換。
五、快速錄入文本文件中的內(nèi)容
現(xiàn)在您手邊假如有一些以純文本格式儲存的文件,如果此時您需要將這些數(shù)據(jù)制作成Excel XP的工作表,那該怎么辦呢?重新輸入一遍,太浪費時間;將菜單上的數(shù)據(jù)一個個復(fù)制到工作表中,同樣也費事。這時!您只要在Excel XP中巧妙使用其中的文本文件導(dǎo)入功能,就可以大大減輕需要重新輸入或者需要不斷復(fù)制、粘貼的巨大工作量了。使用該功能時,您只要在Excel XP編輯區(qū)中,選定菜單欄中的“數(shù)據(jù)/獲取外部數(shù)據(jù)/導(dǎo)入文本文件”命令,然后在導(dǎo)入文本會話窗口選擇要導(dǎo)入的文本文件,按下“導(dǎo)入”鈕以后,程序會彈出一個文本導(dǎo)入向?qū)υ捒?,您只要按照向?qū)У奶崾具M(jìn)行操作,就可以把以文本格式的數(shù)據(jù)轉(zhuǎn)換成工作表的格式了。
六、行列轉(zhuǎn)置
假如A1-A10單元格中有不同的內(nèi)容,現(xiàn)在需要將這些內(nèi)容分別排列在A1、B1、C1、D1...J1單元格中,即將原來在同一列中的內(nèi)容重新排列在一行中。難道要一個一個單元格去復(fù)制粘貼嗎?完全不用。
首先,選中A1-A10單元格,單擊右鍵,在彈出的菜單中選擇“復(fù)制”命令;接著單擊B1單元格,再單擊右鍵,在彈出的菜單中選擇“選擇性粘貼”命令,彈出對話框,選擇其中的復(fù)選項“轉(zhuǎn)置”,點擊確定。這時你會看到B1、C1....K1單元格中已有了A1-A10單元格中的內(nèi)容,將A列選中,在右鍵菜單中刪除,此時行列轉(zhuǎn)換工作就完成了。
七、在Excel2000中設(shè)計彩色數(shù)字
在你使用Excel2000對一張工作表中的數(shù)據(jù)進(jìn)行處理時,有時是不是希望其中某些數(shù)據(jù)能夠有自己特殊的顯示格式?比如,現(xiàn)在你有如圖的一張Excel工作表,在“總成績”一欄中,你需要小于120的顯示為藍(lán)色,大于120的顯示為紅色。下述的方法,可以讓你的愿望變?yōu)楝F(xiàn)實。該方法是:
1.選中D25的單元格區(qū)域。
2.單擊“格式”菜單中的“單元格”命令,然后單擊“數(shù)字”選項卡。
3.單擊“分類”列表中的“自定義”選項,在“類型”框中鍵入“[藍(lán)色][<120];[紅色][>=120]”。
4.單擊“確定”按鈕。
怎么樣,Excel按你的要求顯示出不同顏色的數(shù)字了吧?
最后,對在“類型”框中鍵入的數(shù)字格式代碼進(jìn)行簡單地說明,“[藍(lán)色]”是對數(shù)據(jù)顯示顏色的設(shè)置,除“紅色”、“藍(lán)色”外,還可使用六種顏色,它們是黑色、青色、綠色、洋紅、白色、黃色?!埃郏荆?20]”是條件設(shè)置,可用的條件運算符有:>、<、>=、<=、=、<>。當(dāng)有多個條件設(shè)置時,各條件設(shè)置以分號“;”間隔。
八、減少修改EXCEL參數(shù)的秘籍
在此處設(shè)計好的公式,拿到彼處用時,大部分不會完全合適,往往要修改公式中的參數(shù).特別是函數(shù)中引用的單元格區(qū)域,往往需要修改.所以這里就以單元格區(qū)域為例,介紹一種減少或者是避免參數(shù)修改的辦法.雖然說不上"萬能",但將公式任意粘貼而基本不用修改是確實能辦到的.
一個單元格、或者由許多單元格組成的單元格集合都可以作為一個區(qū)域,并可以命名一個名字。這許多朋友都知道。但對合理恰當(dāng)?shù)厥褂妹麉^(qū)域帶來的方便,許多朋友或者是不重視,或者是覺得麻煩而較少使用。不過要實現(xiàn)上面的目標(biāo),我建議大家還是盡可能使用命名的區(qū)域。其好處如下:
1、直觀易記,區(qū)域很多時,形式如(B2:M50)的名字既不好記憶,也難以一下子斷定意義,反之,使用區(qū)域名字,特別是用中文作為區(qū)域名字時,能見文知義,大大減輕了記憶負(fù)
擔(dān)。例如,將區(qū)域(B2:M50)命名為“三甲物理分”,一見名字就明白意思.
2、如果某一區(qū)域需要在多個公式中使用,采用區(qū)域命名會很方便。例如函數(shù)中需要引用“三甲物理分”這個區(qū)域時,可以直接拿它當(dāng)參數(shù).如果想得到那種一次設(shè)計,多次重用的“計算模板”,則更是非將區(qū)域命名不可。
3、如果區(qū)域的范圍需要擴大或縮小,只需要將原來的名字重新命名一下,而原來使用的函數(shù)參數(shù)不必改動。例如,要統(tǒng)計上面區(qū)域中有效數(shù)字的個數(shù),用的公式是:=COUNT(三甲物理分)(注意函數(shù)括號內(nèi)的區(qū)域名字不用加雙引號);當(dāng)需要把該區(qū)域擴大或縮小時,可以先將原有的區(qū)域名字“三甲物理分”刪除,然后重新選定合適的范圍再次用這個名字命名,而所有以“三甲物理分”作參數(shù)的函數(shù)均不須修改而仍能使用。
乍一看這好像就不錯了,其實,這還不算完善.
前已述及,當(dāng)函數(shù)移到別的地方使用時,其參數(shù)一般需要修改。比如要用上面的公式計算二乙班物理成績的有效數(shù)字個數(shù)時(這里假設(shè)你已經(jīng)將相應(yīng)區(qū)域命名為“二乙物理分”),則函數(shù)中用到區(qū)域參數(shù)又都要修改為“二乙物理分”??梢酝浦?,即使是只修改這一處參數(shù),在處理很多學(xué)科時(因為每個班級可能進(jìn)行多個學(xué)科的考試),修改參數(shù)的工作量也很大,況且實際計算中往往同時使用多個公式,更導(dǎo)致參數(shù)修改的工作量成幾倍增加。以某中學(xué)三個年級24個教學(xué)班為例,假如每個年級考試5個學(xué)科,要求計算出每班各個學(xué)科的最高分、平均分、整個年級的前百強學(xué)生等項目.這些活兒就是讓你用上? 命名的法寶,手工修改參數(shù)也會磨壞你的手指!
怎樣才能減少修改的工作量、甚至做到不修改參數(shù)就能用呢?這就得需要在函數(shù)內(nèi)間接引用參數(shù)。請往下看
A B C三甲物理分 三乙物理分 三甲語文分AVERAGE(三甲物理分)=AVERAGE(三甲物理分)=AVERAGE(三甲物理分)AVERAGE(INDIRECT(A1))AVERAGE(INDIRECT(B1))AVERAGE(INDIRECT(C1))假設(shè)先設(shè)計好EXCEL工作表,將準(zhǔn)備處理的數(shù)據(jù)區(qū)域都進(jìn)行命名,并把名字依次輸入到表中第一行的各個單元格,類似下表那樣.為了對兩種方法進(jìn)行比較,我們先在A2單元格中輸入公式:=AVERAGE(三甲物理分),可得出三甲班的物理平均分,結(jié)果也正確,缺點就是像上面說的,將公式粘貼在B2、C2單元格中時,括號中的參數(shù)并不會自動取出第一行里對應(yīng)的名字,還需要用手工一一修改!如何讓它能"自動"引用正確的參數(shù)、即能"自動"引用第一行對應(yīng)單元格里的文字呢?可以使用函數(shù)INDIRECT().
在EXCEL中,函數(shù)INDIRECT()的作用比較特殊.其作用介紹如下:例如已知存放在A1單元格中的文字"三甲物理分"是一個區(qū)域名字,當(dāng)用INDIRECT(A1)函數(shù)時,可以通過A1單元格獲得對"三甲物理分"區(qū)域的引用.好!下面我們驗證一下:請你在上表中的A3單元格中輸入:=AVERAGE(INDIRECT(A1)),從得出的結(jié)果看,與A2單元格中使用的公式結(jié)果相同.從公式的組成看,多了函數(shù)INDIRECT(A1),省去了區(qū)域名字!注意,這就是激動人心的關(guān)鍵點了:當(dāng)你用鼠標(biāo)拖拽的辦法向右邊單元格粘貼這個公式后,會發(fā)現(xiàn)這些單元格中的公式已經(jīng)"自動"地引用了相應(yīng)區(qū)域的名字,你連一個參數(shù)也不用修改就得出了正確結(jié)果?。??這不正是實現(xiàn)了我們苦苦追求的目標(biāo)嗎?怎么樣,很爽吧?
感謝你有耐心看到這里,下面我再送你一個"秘密武器"
上面介紹的那個有功勞的函數(shù)是INDIRECT(),它是解決名字引用的,當(dāng)要引用的單元格中是數(shù)值時,它就不管用了.能引用單元格數(shù)值的是另一個函數(shù)VALUE()。它的用法是:如果在A2單元格中存放有數(shù)字85,那么在A3單元格輸入:=VALUE(A2),在A3中也能得到85這個數(shù)字。要只是這樣的代換顯然意義不大,但把它用在公式中后意義就大不一樣了??聪卤恚旱诙兄械臄?shù)字是該學(xué)科達(dá)到“優(yōu)秀”的分
A B C
三乙物理分 三乙物理分 三甲語文分
80
=COUNTIF(INDIRECT(A1,),“$#@62;=”&VALUE(A2))
DIRECT(B1,),“$#@62;=”&VALUE(B2))=COUNTIF(IN A
=COUNTIF(INDIRECT(C1,),“$#@62;=”&VALUE(C2))
數(shù)線,我們的目的是:在第三行中根據(jù)該學(xué)科的分?jǐn)?shù)線求出該學(xué)科達(dá)到優(yōu)秀成績的人數(shù).由于不同學(xué)科劃定優(yōu)秀的分?jǐn)?shù)線一般也不同.要是直接了當(dāng)?shù)脑?,在A3中使用公式=COUNTIF((INDIRECT(A1,),“$#@62;=85”)就可以,但這樣用到B列又會遇到類似上面的修改參數(shù)問題。要也像上面那樣能"自動"引用第二行中的分?jǐn)?shù)線該多好?。e急,把VALUE()函數(shù)用上就成了!我們把A3中的公式改成:=COUNTIF(INDIRECT(A1,),“$#@62;=”&VALUE(A2)).請你把這個公式向右面粘貼,可以發(fā)現(xiàn),不用修改任何參數(shù)就能"自動"地引用正確的單元格了.
如果你能夠熟練應(yīng)用INDIRECT()和VALUE()這兩個函數(shù),再加上區(qū)域命名的法寶,會給你帶來不小的方便!
至于制作能多次使用的計算"模板",我采用的是很懶也很容易的方法:將上一次用過的EXCEL文件用"另存為"作個備份,然后打開,只將原始數(shù)據(jù)清去,其他全部保留,就成了一個"模板".這樣,只需要輸入原始數(shù)據(jù),立即會得到結(jié)果,免去了輸入公式,設(shè)計格式等一大堆麻煩.
九、技巧1:給別人看,但不給別人動
辛辛苦苦地設(shè)計了一個數(shù)據(jù)庫或者表格,卻被別人毛手毛腳地搞亂了,是不是很惱火?如果 是私人文件還好,只要設(shè)個密碼就可以了,偏偏這是要別人往里面填數(shù)據(jù)或者是要給大家參考的,往往由于他人的“不小心”,而導(dǎo)致自己要重做整個表格,這種事情不知道大家遇到?jīng)]有,我可是遇到過,辛苦加班加點用了7天才設(shè)計好的表格,因為沒做好防護措施,致使....哎,傷心往事,不說也罷!
現(xiàn)在,我教大家一個好辦法,讓別人只能看,不能動!
為了防止別人無意改動表格的內(nèi)容(尤其是一些計算公式),我們必須把這些單元格設(shè)成“只讀”!
把不需要保護的的單元格選定,單擊右鍵,設(shè)置單元格,將保護標(biāo)簽中的鎖定復(fù)選框清除,然后對該工作表設(shè)置保護。此時,鎖定的單元格是只讀的,剛才已被清除鎖定復(fù)選框的單元則可以正常輸入。當(dāng)然,如果你連某些單元的內(nèi)容也不想別人看到,在確定這些單元保護標(biāo)簽中的鎖定復(fù) 選框是選中的情況下,再選擇隱藏即可,這樣將不顯示這些單元其中的內(nèi)容。但是你必須對工作表或工作簿實施保護后,你的保護和隱藏才有效。要保護工作表,可按以下選擇:
[工具]→[保護]→[保護工作表]→選擇密碼,重復(fù)輸入相同密碼,這樣,以后要進(jìn)入這個工作表,只要輸入密碼即可。
技巧2:得到偶數(shù)的單元格的相加值
因為工作需要,要得到偶數(shù)的單元格的值相加之和,以下是具體的要求和思路:
要求:得到A2+A4+A6+A8+A10+A12+A14......之和,假如是少還好辦,假如有數(shù)十個相加的話就不好辦了,怎樣才能用一個公式來搞定它呢???
思路:呵呵,我已得到答案了!先用一列來得到當(dāng)前行的行號,你可在C1輸入1,然后向下拖得到每一行的行號,再用一列來判斷當(dāng)前行是否為偶數(shù)行,輸入公式:"=IF(INT(C1/2)=C1/2,A1,0)",然后再累加C列即可。
函數(shù)解析:其中的INT函數(shù)為判斷C1/2是否為整數(shù),如果C1是偶數(shù)C1/2當(dāng)然是整數(shù)了,IF函數(shù)判斷INT(C1/2)是否為偶數(shù),如是,則取A列值,如果不是,就取0值。
看懂以上公式后,再教你一個更簡單的方法:用ROW函數(shù).ROW()可以得到當(dāng)前行的行號,這樣,判斷當(dāng)前行是否為偶數(shù)就不用再增加C列了,只要直接輸入公式:"=IF(INT(ROW(?)=ROW()/2,A1,0)",向下拖動,累加即可。
技巧3:如何使Excel中數(shù)字計算自動四舍五入
目的:要對一個單元格中的數(shù)據(jù)(利用函數(shù)計算得出的)在它本身所在的單元格內(nèi)進(jìn)行四舍五入。
//* 假設(shè)B1單元格內(nèi)容為:=if(A1$#@62;5,6234*.05)*//
1.如果B1單元此后不再加入其他運算,只要:
右鍵單擊B1 → 設(shè)置單元格格式 → 小數(shù)位數(shù)調(diào)整到2位.或者單擊B1,選擇快捷菜單上的 "千分格式",再選擇快捷菜單上的 "退一位小數(shù)位" 即可。
2.如果B1單元此后還要再加入其他運算,只要:
在B1單元,將原有內(nèi)容加入ROUND函數(shù)即可:=round(if(A1$#@62;5,6234*.05),2)
其中,最后一位數(shù)"2"代表你想要數(shù)據(jù)參與計算的結(jié)果截止到小數(shù)點后兩位,如果想要三位,直接改成"3"即可。
以上第一種方法只能達(dá)到顯示上的四舍五入,當(dāng)數(shù)據(jù)再次參與計算時,將不會以四舍五入后的數(shù)值參與。第二種方法,當(dāng)數(shù)據(jù)再次參與計算時,將以四舍五入后的數(shù)值(即其顯示在單元格中的數(shù)據(jù))參與計算。
技巧4:將鍵入的阿拉伯?dāng)?shù)字自動轉(zhuǎn)換成人民幣大寫金額
在使用EXCEL過程中,在制作財務(wù)憑證時經(jīng)常需要將數(shù)字表示為大寫的數(shù)字金額,可用設(shè)置單元格格式的方法來實現(xiàn):
1.首先鼠標(biāo)右鍵單擊需要用大寫金額顯示的單元格。
2.(*假設(shè)此單元格金額為123.50元*)→ 設(shè)置單元格格式 → 數(shù)字 → 自定義 → 在類型框中輸入 [DBNum2]0“百”0“拾”0“元”0“角”“整” 即可將選中的單元格中的數(shù)字顯示為大寫金額:(壹百貳拾叁元伍角整)。
(*假設(shè)此單元格金額為1234.51元*)→ 設(shè)置單元格格式 → 數(shù)字 → 自定義 → 在類型框中輸入 [DBNum2]0“千”0“百”0“拾”0“元”0“角”0“分”“整” 即可將選中的單元格中的數(shù)字顯示為大寫金額:(壹千貳百叁拾肆元伍角壹分整)。
第三篇:Excle使用心得
EXCEL使用技巧
01、如何在已有的單元格中批量加入一段固定字符?
例如:在單位的人事資料,在excel中輸入后,由于上級要求在原來的職稱證書的號碼全部再加兩位,即要在每個人的證書號碼前再添上兩位數(shù)13,如果一個一個改的話實在太麻煩了,那么我們可以用下面的辦法,省時又省力:
1)假設(shè)證書號在A列,在A列后點擊鼠標(biāo)右鍵,插入一列,為B列;
2)在B2單元格寫入: =“13” & A2 后回車;
3)看到結(jié)果為 13xxxxxxxxxxxxx 了嗎?鼠標(biāo)放到B2位置,單元格的下方不是有一個小方點嗎,按著鼠標(biāo)左鍵往下拖動直到結(jié)束。當(dāng)你放開鼠標(biāo)左鍵時就全部都改好了。若是在原證書號后面加13 則在B2單元格中寫入:=A2 & “13” 后回車。
02 用IF函數(shù)清除EXCEL工作表中的計算出現(xiàn)的0
=IF(K14*M14=0,“",K14*M14)該式所表示的含義為:如果單元格K14與M14內(nèi)數(shù)值的乘積為零,那么存放計算結(jié)果的單元格顯示為一個空白單元格;反之,單元格K14與M14內(nèi)數(shù)值的乘機為不為零,這兩個單元格的數(shù)值將被進(jìn)行乘積運算。
06、在Excel中如何設(shè)置加權(quán)平均?
加權(quán)平均在財務(wù)核算和統(tǒng)計工作中經(jīng)常用到,并不是一項很復(fù)雜的計算,關(guān)鍵是要理解加權(quán)平均值其實就是總量值(如金額)除以總數(shù)量得出的單位平均值,而不是簡單的將各個單位值(如單價)平均后得到的那個單位值。在Excel中可設(shè)置公式解決(其實就是一個除法算式),分母是各個量值之和,分子是相應(yīng)的各個數(shù)量之和,它的結(jié)果就是這些量值的加權(quán)平均值。
07、如果在一個Excel文件中含有多個工作表,如何將多個工作表一次設(shè)置成同樣的頁眉和頁腳?如何才能一次打印多個工作表?
把鼠標(biāo)移到工作表的名稱處(若你沒有特別設(shè)置的話,Excel自動設(shè)置的名稱是“sheet1、sheet2、sheet3.......”),然后點右鍵,在彈出的菜單中選擇“選擇全部工作表”的菜單項,這時你的所有操作都是針對全部工作表了,不管是設(shè)置頁眉和頁腳還是打印你工作表。
15、如何快速選取工作表中所有包含公式的單元格?
有時,需要對工作表中所有包含公式的單元格加以保護,或填入與其他單元格不同的顏色,以提醒用戶注意不能在有此顏色的區(qū)域內(nèi)輸入數(shù)據(jù)。以下方法可以幫助快速選取所有包含公式的單元格:選擇“編輯”“定位”(F5),單擊“定位條件”按鈕,在“定位條件”對話框中選擇“公式”項,按“確定”按鈕即可。
16、如何在不同單元格中快速輸入同一數(shù)內(nèi)容?
選定單元格區(qū)域,輸入值,然后按 Ctrl+ Ener鍵,即可實現(xiàn)在選定的單元格區(qū)域中一次性輸入相同的值。
17、只記得函數(shù)的名稱,但記不清函數(shù)的參數(shù)了,怎么辦?
如果你知道所要使用函數(shù)的名字,但又記不清它的所有參數(shù)格式,那么可以用鍵盤快捷鍵把
參數(shù)粘貼到編輯欄內(nèi)。
具體方法是:在編輯欄中輸入一個等號其后接函數(shù)名,然后按 Ctr+ A鍵,Excel則自動進(jìn)入“函數(shù)指南——步驟 2之2”。當(dāng)使用易于記憶的名字且具有很長一串參數(shù)的函數(shù)時,上述方法顯得特別有用。
27、如何快速地將數(shù)字作為文本輸入?
在輸入數(shù)字前加一個單引號“’”,可以強制地將數(shù)字作為文本輸入。
35、如何使單元格中的顏色和底紋不打印出來?
對那些加了保護的單元格,還可以設(shè)置顏色和底紋,以便讓用戶一目了然,從顏色上看出那些單元格加了保護不能修改,從而可增加數(shù)據(jù)輸入時的直觀感覺。但卻帶來了問題,即在黑白打印時如果連顏色和底紋都打出來,表格的可視性就大打折扣。解決辦法是:選擇“文件”“頁面設(shè)置”“工作表”,在“打印”欄內(nèi)選擇“單元格單色打印”選項。之后,打印出來的表格就面目如初了。
37、“$”的功用
Excel一般使用相對地址來引用單元格的位置,當(dāng)把一個含有單元格地址的公式拷貝到一個新的位置,公式中的單元格地址會隨著改變。你可以在列號或行號前添加符號 “$”來凍結(jié)單元格地址,使之在拷貝時保持固定不變。
38、如何用漢字名稱代替單元格地址?
如果你不想使用單元格地址,可以將其定義成一個名字。
定義名字的方法有兩種:一種是選定單元格區(qū)域后在“名字框”直接輸入名字,另一種是選定想要命名的單元格區(qū)域,再選擇“插入”“名字”“定義”,在“當(dāng)前工作簿中名字”對話框內(nèi)鍵人名字即可。使用名字的公式比使用單元格地址引用的公式更易于記憶和閱讀,比如公式“=SUM(實發(fā)工資)”顯然比用單元格地址簡單直觀,而且不易出錯。
39、如何在公式中快速輸入不連續(xù)的單元格地址?
在SUM函數(shù)中輸入比較長的單元格區(qū)域字符串很麻煩,尤其是當(dāng)區(qū)域為許多不連續(xù)單元格區(qū)域組成時。這時可按住Ctrl鍵,進(jìn)行不連續(xù)區(qū)域的選取。區(qū)域選定后選擇“插入”“名字”“定義”,將此區(qū)域命名,如Group1,然后在公式中使用這個區(qū)域名,如“=SUM(Group1)”。
42、工作表名稱中能含有空格嗎?
能。例如,你可以將某工作表命名為“Zhu Meng”。有一點結(jié)注意的是,當(dāng)你在其他工作表中調(diào)用該工作表中的數(shù)據(jù)時,不能使用類似“= Zhu Meng!A2”的公式,否則 Excel將提示錯誤信息“找不到文件Meng”。解決的方法是,將調(diào)用公式改為“='Zhu Mg'!A2”就行了。當(dāng)然,輸入公式時,你最好養(yǎng)成這樣的習(xí)慣,即在輸入“=”號以后,用鼠標(biāo)單由 Zhu Meng工作表,再輸入余下的內(nèi)容。
46、如何減少重復(fù)勞動?
我們在實際應(yīng)用Excel時,經(jīng)常遇到有些操作重復(fù)應(yīng)用(如定義上下標(biāo)等)。為了減少重復(fù)勞動,我們可以把一些常用到的操作定義成宏。其方法是:選取“工具”菜單中的“宏”命令,執(zhí)行“記錄新宏”,記錄好后按“停止”按鈕即可。也可以用VBA編程定義宏。
47、如何快速地批量修改數(shù)據(jù)?
假如有一份 Excel工作簿,里面有所有職工工資表?,F(xiàn)在想將所有職工的補貼增加50(元),當(dāng)然你可以用公式進(jìn)行計算,但除此之外還有更簡單的批量修改的方法,即使用“選擇性粘貼”功能: 首先在某個空白單元格中輸入50,選定此單元格,選擇“編輯”“復(fù)制”。選取想修改的單元格區(qū)域,例如從E2到E150。然后選擇“編輯”“選擇性粘貼”,在“選擇性粘貼”對話框“運算”欄中選中“加”運算,按“確定”健即可。最后,要刪除開始時在某個空白單元格中輸入的50。
48、如何快速刪除特定的數(shù)據(jù)?
假如有一份Excel工作薄,其中有大量的產(chǎn)品單價、數(shù)量和金額。如果想將所有數(shù)量為0的行刪除,首先選定區(qū)域(包括標(biāo)題行),然后選擇“數(shù)據(jù)”“篩選”“自動篩選”。在“數(shù)量”列下拉列表中選擇“0”,那么將列出所有數(shù)量為0的行。此時在所有行都被選中的情況下,選擇“編輯”“刪除行”,然后按“確定”即可刪除所有數(shù)量為0的行。最后,取消自動篩選。
49、如何快速刪除工作表中的空行?
以下幾種方法可以快速刪除空行:
方法一:如果行的順序無關(guān)緊要,則可以根據(jù)某一列排序,然后可以方便地刪掉空行。方法二:如果行的順序不可改變,你可以先選擇“插入”“列”,插入新的一列入在A列中順序填入整數(shù)。然后根據(jù)其他任何一列將表中的行排序,使所有空行都集中到表的底部,刪去所有空行。最后以A列重新排序,再刪去A列,恢復(fù)工作表各行原來的順序。
方法三:使用上例“如何快速刪除特定的數(shù)據(jù)”的方法,只不過在所有列的下拉列表中都選擇“空白”。
50、如何使用數(shù)組公式?
Excel中數(shù)組公式非常有用,它可建立產(chǎn)生多值或?qū)σ唤M值而不是單個值進(jìn)行操作的公式。要輸入數(shù)組公式,首先必須選擇用來存放結(jié)果的單元格區(qū)域,在編輯欄輸入公式,然后按ctrl+Shift+Enter組合鍵鎖定數(shù)組公式,Excel將在公式兩邊自動加上括號“{}”。不要自己鍵入花括號,否則,Excel認(rèn)為輸入的是一個正文標(biāo)簽。要編輯或清除數(shù)組公式.需選擇數(shù)組區(qū)域并且激活編輯欄,公式兩邊的括號將消失,然后編輯或清除公式,最后按Ctrl+shift+Enter鍵。
52、在Excel中用Average函數(shù)計算單元格的平均值的,值為0的單元格也包含在內(nèi)。有沒有辦法在計算平均值時排除值為0的單元格?
方法一:如果單元格中的值為0,可用上例“0值不顯示的方法”將其內(nèi)容置為空,此時空單元格處理成文本,這樣就可以直接用Average函數(shù)計算了。
方法二:巧用Countif函數(shù) 例如,下面的公式可計算出b2:B10區(qū)域中非0單元格的平均值: =sum(b2: b10)/countif(b2: b1o,”<>0")
三、讓不同類型數(shù)據(jù)用不同顏色顯示
在工資表中,如果想讓大于等于2000元的工資總額以“紅色”顯示,大于等于1500元的工資總額以“藍(lán)色”顯示,低于1000元的工資總額以“棕色”顯示,其它以“黑色”顯示,我們可以這樣設(shè)置。
1.在工作簿中,選中“工資總額”所在列,執(zhí)行“格式→條件格式”命令,打開“條件
格式”對話框。單擊第二個方框右側(cè)的下拉按鈕,選中“大于或等于”選項,在后面的方框中輸入數(shù)值“2000”。單擊“格式”按鈕,打開“單元格格式”對話框,將“字體”的“顏色”設(shè)置為“紅色”。(在Excle07中 開始----樣式---條件格式 下面設(shè)置)
2.按“添加”按鈕,并仿照上面的操作設(shè)置好其它條件(大于等于1500,字體設(shè)置為“藍(lán)色”;小于1000,字體設(shè)置為“棕色”)。
3.設(shè)置完成后,按下“確定”按鈕。
第四篇:CAD使用心得之一
CAD使用心得之一--CAD使用的三個基本方面:清晰、準(zhǔn)確、高效
(2012-07-02 10:49:16)
很多CAD的教材,如果對照著學(xué)習(xí)的話,確實都能夠在一定程度上掌握這個軟件,如果到工作崗位,也都能勉勉強強的開始畫圖。但是,這遠(yuǎn)遠(yuǎn)不夠,從書本到實戰(zhàn),還有一大段距離。因此,將收集的有關(guān)于使用CAD的一系列心得體會發(fā)出來與大家分享。
CAD使用心得連載之一
——CAD使用的三個基本方面:清晰、準(zhǔn)確、高效
目前,設(shè)計公司的設(shè)計文件,特別是圖紙,都是用CAD軟件繪制的,但是還有很多人對CAD并不是非常熟悉,或者說使用起來并非得心應(yīng)手,以至于效率并不是很高,可以說,繪制同樣的一張圖紙,速度快的和慢的在耗時上可能會相差好幾倍。同時,每個人繪制出來的圖紙看上去感覺都不盡相同:有些圖紙看上去一目了然、清晰漂亮,而有些圖紙不但表達(dá)不清,甚至可以用慘不忍睹來形容。
不知大家認(rèn)為,使用CAD畫圖最重要的是什么?對這個問題,每個人都有可能理解不同,但在我看來,最重要的是時時刻刻記住自己使用CAD畫圖的目的是什么。
我們進(jìn)行工程設(shè)計,不管是什么專業(yè)、什么階段,實際上都是要將某些設(shè)計思想或者是設(shè)計內(nèi)容,表達(dá)、反映到設(shè)計文件上。而圖紙,就是一種直觀、準(zhǔn)確、醒目、易于交流的表達(dá)形式。所以我們完成的東西(不管是最終完成的設(shè)計成果,還是作為條件提交給其它專業(yè)的過程文件,一定需要能夠很好的幫助我們表達(dá)自己的設(shè)計思想、設(shè)計內(nèi)容。
有了這個前提,我們就應(yīng)該明白,好的CAD圖紙應(yīng)該具有以下兩個特征:清晰、準(zhǔn)確。清晰,就是需要表達(dá)的東西必須清楚明了。好的圖紙,看上去一目了然。構(gòu)件表達(dá)、尺寸標(biāo)注、文字說明清清楚楚,互不重疊??除了圖紙打印效果清晰以外,在屏幕上的顯示也必須清晰。圖面清晰除了能清楚表達(dá)設(shè)計思路和設(shè)計內(nèi)容外,也是提高繪圖速度的基礎(chǔ)。準(zhǔn)確,就是標(biāo)注不能錯誤,指示不能模糊。制圖準(zhǔn)確不僅是為了好看,更重要的是可以直觀的反映一些圖面問題,對于提高繪圖速度也有重要的影響,特別是在圖紙修改時。我們在使用CAD繪圖時,無時無刻都應(yīng)該把以上兩點銘刻在心。只有做到這兩點,才能說在繪圖方面基本過關(guān)。
圖面表示要“清晰”、“準(zhǔn)確”,而在繪圖過程中,還有同樣重要的一點,就是“高效”。能夠高效繪圖,好處不用多說。
清晰、準(zhǔn)確、高效是CAD軟件使用的三個基本點。在CAD軟件中,除了一些最基本的繪圖命令外,其他的各種編輯命令、各種設(shè)置定義,可以說都是圍繞著清晰、準(zhǔn)確、高效這三方面來編排的。我們在學(xué)習(xí)CAD中的各項命令、各種設(shè)置時,都要思考一下,它們能在這三個方面起到那些作用;在使用時應(yīng)該注重什么;在什么情況和條件下,使用這些命令最為合適。
第五篇:STM32使用心得
stm32使用心得
第一次使用stm32,以前用過
51、avr、pic、2812,感覺stm32還真有點不一樣,呵呵。
因為是第一次使用,下面說的肯定有不少錯誤,誠心求大家指正。
這次做的是用stm32f103zd+lattice 的lc4256v做一個波形發(fā)生器。通過上位機可以控制生成波形的頻率,然后stm32根據(jù)頻率計算波形占空比數(shù)據(jù),通過總線形式傳給cpld,然后cpld把這些數(shù)據(jù)轉(zhuǎn)換成相對應(yīng)占空比的pwm輸出,外部接RC濾波電路,產(chǎn)生相對應(yīng)的波形。由于頻率范圍較大,計算量也比較大,所以采用了stm32+cpld的結(jié)構(gòu)。Stm32運行在72MHZ,通過mco腳給cpld 36M HZ的時鐘,stm32和cpld通過總線方式通信。
此系統(tǒng)中Stm32主要用到的資源是:一個UART,一個TIMER及其中斷,F(xiàn)SMC和DMA。
本人總結(jié)了下,Stm32初始化一個片內(nèi)外設(shè)一般過程一般有以下幾部分:
1.InitStructure配置及初始化
2.時鐘使能
3.相對應(yīng)的IOInitStructure配置及初始化
4.相對應(yīng)的IO時鐘使能
5.外設(shè)使能
6.中斷配置及中斷程序編寫
下面介紹一下自己所用的UART、TIMER、FSMC、DMA的初始化。
UART初始化:
此系統(tǒng)中使用的是UART2,未用UART中斷。UART初始化主要有:IO初始化,UART InitSturcture初始化,UART時鐘使能,UART使能。程序如下: GPIO_InitTypeDef GPIO_InitStructure;
// Configure USART2_Tx as alternate push-pull
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// Configure USART2_Rx as input floating
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//IO時鐘使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
USART_InitTypeDef USART_InitStructure;
/* USART2 configured as follow:
-BaudRate = 9600 baud
-Word Length = 8 Bits
-One Stop Bit
-No parity
-Hardware flow control disabled(RTS and CTS signals)
-Receive and transmit enabled
*/
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
/* Configure the USART2*/
USART_Init(USART2, &USART_InitStructure);
//UART時鐘使能
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
/* Enable the USART2 */
USART_Cmd(USART2, ENABLE);
TIMER初始化
使用的是TIM2。初始化主要包括TIM2 InitSturcture初始化,時鐘使能,TIM2開啟,中斷配置,及中斷服務(wù)程序編寫。此TIM2作用主要是給DMA提供時鐘,DMA在TIM2 UP時啟動一次DMA發(fā)送過程。TIM2程序如下:
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
//定時器2
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseStructure.TIM_Period = 33;
TIM_TimeBaseStructure.TIM_Prescaler = 71;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_ClearFlag(TIM2,TIM_FLAG_Update);
TIM_ARRPreloadConfig(TIM2,ENABLE);
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM2, ENABLE);
//中斷配置
/* Enable the TIM2 gloabal Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//定時器2中斷服務(wù)程序
void TIM2_IRQHandler(void)//這個函數(shù)可以在文件stm32f10x.c文件中查找到 {
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
}
FSMC初始化
FSMC主要用來和CPLD進(jìn)行總線通信,由DMA方式發(fā)送,在TIM2計時時間到后啟動一次DMA發(fā)送,發(fā)送的數(shù)據(jù)由已計算好的數(shù)組中的一個16位數(shù)據(jù)以16位方式發(fā)給FSMC的地址。由于此系統(tǒng)電路已固定,stm32與CPLD間數(shù)據(jù)線是8位,故在向FSMC地址寫16位數(shù)據(jù)時,F(xiàn)SMC會將數(shù)據(jù)拆成2部分發(fā)送。本人在實際編程時發(fā)現(xiàn),如向*(volatile u16*)(Bank1_NOR4_ADDR+0x40)地址給CPLD寫16位數(shù)據(jù)時,會在40h接收到低8位數(shù)據(jù),在41h接收到高8位數(shù)據(jù)。按道理來說這些數(shù)據(jù)應(yīng)該與NBL0, NBL1信號有關(guān),本人在CPLD編程時未理會這個,具體時序不是很清楚,有待考究。
FSMC初始化程序如下:
FSMC_NORSRAMInitTypeDefFSMC_NORSRAMInitStructure;
FSMC_NORSRAMTimingInitTypeDefp;
p.FSMC_AddressSetupTime = 3;//6
p.FSMC_AddressHoldTime = 0;//3
p.FSMC_DataSetupTime = 8;//25
p.FSMC_BusTurnAroundDuration = 0;
p.FSMC_CLKDivision = 0;
p.FSMC_DataLatency = 0;
p.FSMC_AccessMode = FSMC_AccessMode_A;
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b;
FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_AsyncWait = FSMC_AsyncWait_Disable;
FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);
//IO初始化
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOG | RCC_APB2Periph_GPIOE |
RCC_APB2Periph_GPIOF, ENABLE);
/*--GPIO Configuration-----------------------*/
/* SRAM Data lines configuration */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_8 | GPIO_Pin_9 |
GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 |
GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 |
GPIO_Pin_15;
GPIO_Init(GPIOE, &GPIO_InitStructure);
/* SRAM Address lines configuration */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |
GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_12 | GPIO_Pin_13 |GPIO_Pin_14 | GPIO_Pin_15;
GPIO_Init(GPIOF, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |
GPIO_Pin_4 | GPIO_Pin_5;
GPIO_Init(GPIOG, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13;GPIO_Init(GPIOD, &GPIO_InitStructure);
/* NOE and NWE configuration */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 |GPIO_Pin_5;
GPIO_Init(GPIOD, &GPIO_InitStructure);
/* NE4 configuration */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_Init(GPIOG, &GPIO_InitStructure);
/* NBL0, NBL1 configuration */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_Init(GPIOE, &GPIO_InitStructure);
此處簡單介紹一下FSMC總線方式的使用。
FSMC初始化完了之后,進(jìn)行如下定義,#define Bank1_NOR4_ADDR((u32)0x6c000000)
#define cs_sin*(volatile u16*)(Bank1_NOR4_ADDR+0x40)
然后cs_sin=1000就是往這個地址寫數(shù)字1000=0x03e8,則cpld 40h地址收到數(shù)據(jù)為0xe8,41h收到的數(shù)據(jù)為0x03
i=cs_sin,就是讀這個地址的數(shù)據(jù),由于定義的是16位的數(shù)據(jù)地址,故讀到的數(shù)據(jù)是40h為低8位數(shù)據(jù),41h為高8位數(shù)據(jù)
DMA初始化:
DMA在TIM2 UP時觸發(fā),將已經(jīng)計算好放在數(shù)組dat_tocpld的16位數(shù)據(jù)發(fā)送到fsmc地址為(Bank1_NOR4_ADDR+0x40)的空間。
初始化程序如下:
DMA_InitTypeDef DMA_InitStructure;
DMA_DeInit(DMA1_Channel2);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
/* Enable TIM2 DMA interface */
TIM_DMACmd(TIM2, TIM_DMA_Update, ENABLE);
DMA_InitStructure.DMA_PeripheralBaseAddr =(u32)(Bank1_NOR4_ADDR+0x
40);
DMA_InitStructure.DMA_MemoryBaseAddr =(u32)dat_tocpld;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = 1152;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize =DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel2, &DMA_InitStructure);
/* Enable DMA1 Channel2 */
DMA_Cmd(DMA1_Channel2, ENABLE);
最后附上源自http://sxqstudy.blog.163.com/blog/static/***03148709/介紹的關(guān)于PWM電壓轉(zhuǎn)換電路。
在PWM用于DA轉(zhuǎn)換的場合,阻容濾波電路是關(guān)系轉(zhuǎn)換效果的重要環(huán)節(jié)。
由RC充放電常數(shù)我們可以大致計算出阻容環(huán)節(jié)的充放電頻率,一般為了得到理想的濾波效果,這個頻率要遠(yuǎn)小于PWM的輸出頻率(小于四分之一)。
一般情況下,當(dāng)C較小R較大時,DA轉(zhuǎn)換出的電壓損耗很小,但是紋波卻很大;當(dāng)C較大R較小時,DA轉(zhuǎn)換出的電壓損耗很大,但紋波相對較小。
所以當(dāng)需要進(jìn)行線形度很高的精確DA轉(zhuǎn)換時必須使用較小的濾波電容,且盡量避免使用電解類電容。而為了得到較強的信號輸出,RC慣性環(huán)節(jié)之后還必須加一級高性能的電壓跟隨,然后在跟隨器輸出的地方加上一個濾波用的電解電容,用于平滑RC慣性環(huán)節(jié)的紋波。但是這還不夠,因為這時的輸出電壓里可能含有較多的交流諧波成分,如果處理不當(dāng),跟隨器有可能自激。解決的辦法就是使用一個小的去藕電容。而且這里電容的放置順序必須是電解電容在前,去藕電容在后!
如果輸出電壓精度和線形度要求不高,但是對紋波要求卻很高,或者這個電壓比較固定時,可以使用電容較大的濾波組合。因為,雖然大電容的直流損耗較大,但是我們可以通過調(diào)節(jié)PWM占空比來達(dá)到要求的輸出電壓,或者通過一級AD轉(zhuǎn)換的反饋來實現(xiàn)精確的固定電壓輸出。只是這里仍然要加一級電壓跟隨器,以便于后級采集電路使用,且AD采集點放置在跟隨器輸出處。