版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、輕松學(xué)51系列(作者:就抽精品)阿拉教你輕松學(xué) 51- 液晶篇(1602)1602 字符液晶在實(shí)際的產(chǎn)品中運(yùn)用的也比較多了,前幾天留意了一下,發(fā)現(xiàn)宿舍門前的自動(dòng)售水機(jī)就是采用的1602 液晶進(jìn)行顯示的。而且對(duì)于單片機(jī)的學(xué)習(xí)而言, 掌握 1602的用法是每一個(gè)學(xué)習(xí)者必然要經(jīng)歷的過程。在此,我將使用 1602 過程中遇到的問題以及感受記錄下來,希望能夠給初學(xué)者帶來一點(diǎn)指導(dǎo),少走一點(diǎn)彎路。所謂 1602 是指顯示的內(nèi)容為 16*2,即可以顯示兩行,每行 16 個(gè)字符。目前市面 上字符液晶絕大多數(shù)是基于HD44780 液晶芯片的,控制原理是完全相同的,因此基于HD44780 寫的控制程序可以很方便地應(yīng)
2、用于市面上大部分的字符型液晶。背光,黑色字體)液晶的正面(綠色1602 液晶背面(綠色背光,黑色字體)背光白色字體字符型 LCD1602 通常有 14 條引腳線或 16 條引腳線的 LCD,多出來的 2 條線是背光電源線 VCC(15 腳)和地線 GND(16 腳),其控制原理與 14 腳的 LCD 完全一樣,弓 I 腳定義如下表所示:引腳號(hào)引醉電平輸入/輸岀作用1Uss電源地2Ucc電源(+5U)3對(duì)比調(diào)整電壓kRS10/1輸入錯(cuò)入數(shù)據(jù)5R/W0/1輸入向LCD寫入垣今或數(shù)據(jù)從LCD涙取宿魚6E2 十輸入使能信號(hào),1吋諼取信息.1-0(下降沿)齡指令7DB0輸入/輸岀數(shù)據(jù)總線口呢肌最低位)D
3、B1r0/1輸入/輸岀數(shù)據(jù)總線Hne19tB20/1輸入/輸出數(shù)據(jù)總Une210DB30/1輸入#輸岀數(shù)據(jù)總線lines11DB40/1輸入/輸出數(shù)據(jù)總線12D跖|輸入瀚岀數(shù)據(jù)總線lines13DB60/1輸入f輸岀數(shù)據(jù)總線lnefiDB70/1輸入#輸岀數(shù)據(jù)總線lne7(最高位)15AI+UCC- -L3背光電源正極16K接地ILCD背光電源負(fù)極HD44780 內(nèi)置了 DDRAM、CGROM 和 CGRAM。DDRAM 就是顯示數(shù)據(jù) RAM ,用來寄存待顯示的字符代碼。共 80 個(gè)字節(jié),其地址和屏幕的對(duì)應(yīng)關(guān)系如下表:顯示位置234567DDRAM第一行Q3HQ2H03H&SH27H地
4、址第二行40HU2H43H44HU5H67H也就是說想要在 LCD1602 屏幕的第一行第一列顯示一個(gè) A字,就要向 DDRAM 的 00H 地址寫入“ A 字的代碼就行了。但具體的寫入是要按LCD 模塊的指令格式來進(jìn)行的,后面我會(huì)說到的。那么一行可有 40 個(gè)地址呀?是的,在 1602 中我們就用前 16 個(gè)就行了。 第二行也一樣用前 16 個(gè)地址。對(duì)應(yīng)如下:DDRAM 地址與顯示位置的對(duì)應(yīng)關(guān)系(1:O0H 01H 02H 03H 64H眄H06H67H 08H餌H 6AH朋H 9CH ODH 0EH BFH:卻卻42H 43H屮45H46H7H 48H埠卯4AH 4BH4CH耳DHMEtf
5、 4FH:IJ(事實(shí)上我們往 DDRAM 里的 00H 地址處送一個(gè)數(shù)據(jù),譬如0 x31(數(shù)字 1 的代碼)并不能顯示 1 出來。這是一個(gè)令初學(xué)者很容易出錯(cuò)的地方,原因就是如果你要想在 DDRAM的 00H 地址處顯示數(shù)據(jù),則必 須將 00H 加上 80H,即 80H,若要在 DDRAM 的 01H 處顯示數(shù)據(jù),則必須將 01H 加上 80H 即 81H (從 80H 開始到 9FH 開始才是空余的自 己編寫空間其余的空間都有液晶自己的庫文件。在CGRAM 中)。依次類推。大家看一下控制指令的的 8 條:DDRAM 地址的設(shè)定,即可以明白是怎么樣的一回事了)1602 液晶模塊內(nèi)部的字符發(fā)生存儲(chǔ)
6、器( CGROM)已經(jīng)存儲(chǔ)了 160 個(gè)不同的點(diǎn)陣字 符圖形,如下表所示,這些字符有:阿拉伯?dāng)?shù)字、英文字母的大小寫、常用的符號(hào)、和日文 假名等,每一個(gè)字符都有一個(gè)固定的代碼,比如大寫的英文字母“A 的代碼是01000001B“A”(41H ),顯示時(shí)模塊把地址 41H 中的點(diǎn)陣字符圖形顯示出來,我們就能看到字母上表中的字符代碼與我們 PC 中的字符代碼是基本一致的。因此我們?cè)谙駾DRAM寫 C51 字符代碼程序時(shí)甚至可以直接用P1 = A這樣的方法。PC 在編譯時(shí)就把 “A先轉(zhuǎn)為41H 代碼了。字符代碼 0 x00OxOF 為用戶自定義的字符圖形RAM(對(duì)于 5X8 點(diǎn)陣的字符,可以存放8 組
7、,5X10 點(diǎn)陣的字符,存放 4 組),就是 CGRAM 了。后面我會(huì)詳細(xì)說的。0 x200 x7F 為標(biāo)準(zhǔn)的 ASCII 碼,0 xA00 xFF 為日文字符和希臘文字符,其M)41MIOM111OO1C141100111100410011010T51!HOCilOi11101111oxxOCOO0 3 PTXIPrcitfQGOl1 ITJTOIaH.|7|6|aXXXMOOIO砧MOO】noocOlDIQCCOItQ pi |icouiOCO M)WM1001忖)JKXK1011KKXKIIQQI (5)wxxlTOl苗)JOU-itiC汗)i訕I(yè)T(?)ri|2BR|b|r#|3|C|
8、S|c|sl$|4|D|T|d|t|5i|5|E!U|e|ul&|6|F|U|fMOTNJSIWIl9IIIVIi|y*|s|J|Z|J|z|+I5IKIC |k|(l丄klL|1111-|=|M|J|n| .|INIA|nWZfflH曰啊j|O|T|fe=?inizi3l|3|h|kPT*d亦|涯耳 引創(chuàng)神兩J| V|71B創(chuàng)余字符碼(0 x100 x1F 及 0 x80 0 x9F) 沒有定義。那么如何對(duì) DDRAM 的內(nèi)容和地址進(jìn)行具體操作呢,下面先說說HD44780 的指令集及其設(shè)置說明,請(qǐng)瀏覽該指令集,并找出對(duì)DDRAM 的內(nèi)容和地址進(jìn)行操作的指令。共11 條指令:1.清屏指
9、令攜令功能指令編碼執(zhí)行:/RSRSDB7DB3D02DB1DUU清屏01 11e00011.64功能: 清除液晶顯示器,即將DDRAM 的內(nèi)容全部填入空白”的 ASCII 碼 20H; 光標(biāo)歸位,即將光標(biāo)撤回液晶顯示屏的左上方; 將地址計(jì)數(shù)器(AC)的值設(shè)為 0。2.光標(biāo)歸位指令指令功能指令編碼RSDB7*DB5DB3DB10B05 沖/H5尤標(biāo)歸位0I#I*90Ct4X1,6*功能: 把光標(biāo)撤回到顯示器的左上方 把地址計(jì)數(shù)器(AC)的值設(shè)置為 0; 保持 DDRAM 的內(nèi)容不變3.進(jìn)入模式設(shè)置指令位名設(shè)置I/D0=寫入新數(shù)據(jù)后光標(biāo)左移1=寫入新數(shù)據(jù)后光標(biāo)右移0=寫入新數(shù)據(jù)后顯示屏不移動(dòng)1=寫
10、入新數(shù)據(jù)后顯示屏整體右移1 個(gè)字4.顯示開關(guān)控制指令指令功能II令編瑪/USRSR/WDB7DB4DB5D8UDB1業(yè)示開關(guān)控制000091CB功能:控制顯示器開/關(guān)、光標(biāo)顯示/關(guān)閉以及光標(biāo)是否閃爍。參數(shù)設(shè)定的情況如下:位名設(shè)置D0=顯示功能關(guān)1=顯示功能開C0=無光標(biāo)1=有光標(biāo)B0=光標(biāo)閃爍1=光標(biāo)不閃爍5.設(shè)定顯示屏或光標(biāo)移動(dòng)方向指令設(shè)定情況光標(biāo)左移 1 格,且 AC 值減 1光標(biāo)右移 1 格,且 AC 值加 1顯示器上字符全部左移一格,但光標(biāo)不動(dòng)顯示器上字符全部右移一格,但光標(biāo)不動(dòng)6.功能設(shè)定指令S/CR/L0 0位名設(shè)置DL0=數(shù)據(jù)總線為 4 位1=數(shù)據(jù)總線為 8 位N0=顯示 1 行
11、1=顯示 2 行F0=5X點(diǎn)陣/每字符仁 510 點(diǎn)陣/每字符7.設(shè)定 CGRAM 地址指令指令功能指令編碼執(zhí)行/USB/WDBADB5D站DB3DB20B1設(shè)CGRfiM地址00D1地址(6)40功能:設(shè)定下一個(gè)要存入數(shù)據(jù)的CGRAM 的地址。8.設(shè)定 DDRAM 地址指令指令功能指令編碼執(zhí)行/U5RSR/WDB7DB6DB5DB4DEI30B1DB0|設(shè)定ADRfiH地址001CGRAMfit地址(7)U0功能:設(shè)定下一個(gè)要存入數(shù)據(jù)的CGRAM 的地址。(注意這里我們送地址的時(shí)候應(yīng)該是0 x80+Address,這也是前面說到寫地址命令的時(shí)候要加上 0 x80 的原因)9.讀取忙信號(hào)或 A
12、C 地址指令1抱令功能指令編碼時(shí)同/usFtSR/WDB7DB6DBS j D時(shí)DB3DB2 DB1Dbn疇雛號(hào)1M內(nèi)容燈m功能: 讀取忙碌信號(hào) BF 的內(nèi)容,BF=1 表示液晶顯示器忙,暫時(shí)無法接收單片機(jī)送 來的數(shù)據(jù)或指令;當(dāng) BF=O 時(shí),液晶顯示器可以接收單片機(jī)送來的數(shù)據(jù)或指令 讀取地址計(jì)數(shù)器(AC)的內(nèi)容。10.數(shù)據(jù)寫入 DDRAM 或 CGRAM 指令一覽指令功能指令編碼I/USh/wDH70B6 I D65DB4DB30B2I站寫入到1a共寫入的數(shù)據(jù)tGRAM功能: 將字符碼寫入 DDRAM,以使液晶顯示屏顯示出相對(duì)應(yīng)的字符 將使用者自己設(shè)計(jì)的圖形存入CGRAM。11.從 CGRA
13、M 或 DDRAM 讀出數(shù)據(jù)的指令一覽指令功能指令編碼/USwsR/UDEI 7tB6DBSDH4DB30H2&B1DK0出數(shù)據(jù)11要讀岀的數(shù)據(jù)功能:讀取 DDRAM 或 CGRAM 中的內(nèi)容?;静僮鲿r(shí)序:讀狀態(tài)輸入:RS=L,RW=H ,E=H輸出:DB0DB7= 狀態(tài)字寫指令輸入:RS=L , RW=L , E=下降沿脈沖,DB0DB7=指令碼輸出:無讀數(shù)據(jù)輸入:RS=H , RW=H , E=H輸出:DB0DB7=數(shù)據(jù)寫數(shù)據(jù)輸入:RS=H , RW=L , E=下降沿脈沖,DBODB7=數(shù)據(jù)輸出:無呵呵,看到這么多的控制指令希望你沒有頭暈。其實(shí)這么多的指令剛開始的時(shí)候沒有必要全
14、部掌握,隨著學(xué)習(xí)的深入可以再嘗試去用更復(fù)雜的控制指令。下面讓我們一起驅(qū)動(dòng)1602 的液晶吧。下面是我的液晶的連接圖,用的是那種藍(lán)底白字的液晶,其實(shí)藍(lán)底白字和 那種綠底黑字的液晶唯一的區(qū)別就是顏色的問題,至于用哪種液晶,就看各位自己的喜好 咯。這就是我做測(cè)試用的最小系統(tǒng),單片機(jī)是STC89C516 ,晶振為 12M。液晶為藍(lán)底白字的那種 1602。/ / JrH當(dāng)我們硬件連接錯(cuò)誤, 或者程序錯(cuò)誤時(shí)就會(huì)出現(xiàn)下圖這種情況,就是上排顯示 16 的白色的塊(藍(lán)底黑字的液晶則顯示的是16 個(gè)黑塊)。P2=com;II 把命令字送入 P2下面我們來驅(qū)動(dòng) 1602 吧在 1602 的上排顯示 “ LCD160
15、2 check ok下排顯示“ study up 程序中沒有用到忙檢測(cè),而是用的是延時(shí)函數(shù)來替代忙檢測(cè)#include/包含頭文件,這個(gè)嘛,就不用多說了-#defi ne uint un sig ned int /預(yù)定義一下ui nt x,y;for(x=n ;x0;x-)for(y=110;y0;y-);void lcd_wcom(uchar com) II1602rs=0;II 選擇指令寄存器rw=0;II 選擇寫sbit rs=P3A5;II1602 的數(shù)據(jù) I 指令選擇控制線sbit rw=P3A6;II1602的讀寫控制線sbit en=卩3人7;II1602的使能控制線I*P2 口
16、接 1602的 D0D7 ,注意不要接錯(cuò)了順序,我以前可在這上面吃過虧*Iuchar code table=LCD1602 check ok; /uchar code table1=study up;void delay(uint n)/ 延時(shí)函數(shù)II要顯示的內(nèi)容 2 放入數(shù)組 table1寫命令函數(shù)#defi ne uchar un sig nedchar要顯示的內(nèi)容 1 放入數(shù)組 tableldelay(5);/ 延時(shí)一小會(huì)兒,讓 1602 準(zhǔn)備接收數(shù)據(jù)en=1;/ 使能線電平變化,命令送入 1602 的 8 位數(shù)據(jù)口en=0;void lcd_wdat(uchar dat)/1602 寫
17、數(shù)據(jù)函數(shù)rs=1;/選擇數(shù)據(jù)寄存器rw=0;/選擇寫P2=dat;/ 把要顯示的數(shù)據(jù)送入 P2delay(5);/ 延時(shí)一小會(huì)兒,讓 1602準(zhǔn)備接收數(shù)據(jù)en=1;/使能線電平變化,數(shù)據(jù)送入1602 的 8 位數(shù)據(jù)口en=0;/1602 初始化函數(shù)/8 位數(shù)據(jù),雙列, 5*7 字形/ 開啟顯示屏,關(guān)光標(biāo),光標(biāo)不閃爍/ 顯示地址遞增,即寫一個(gè)數(shù)據(jù)后,顯示位置右移一位/ 清屏void main() / 主函數(shù)uchar n,m=0;lcd_init();/ 液晶初始化lcd_wcom(0 x80);/ 顯示地址設(shè)為 80H (即 00H ,)上排第一位for(m=0;m16;m+)/ 將 tabl
18、e 中的數(shù)據(jù)依次寫入 1602 顯示lcd_wdat(tablem); delay(200);lcd_wcom(0 x80+0 x44); / 重新設(shè)定顯示地址為 0 xc4, 即下排第 5 位/ 將 table1 中的數(shù)據(jù)依次寫入 1602 顯示void lcd_init()lcd_wcom(0 x38);lcd_wcom(0 x0c);lcd_wcom(0 x06);lcd_wcom(0 x01);for(n=0;n8;n+)Icd_wdat(table1 n);delay(200);while(1);/動(dòng)態(tài)停機(jī)程序?qū)懞煤鬅龑戇M(jìn)單片機(jī),現(xiàn)在讓我們看看效果吧下面讓我們來看看如何顯示一個(gè)自定義
19、的字符吧我們從 CGROM 表上可以看到,在表的最左邊是一列可以允許用戶自定義的CGRAM,從上往下看著是 16 個(gè),實(shí)際只有 8 個(gè)字節(jié)可用。它的字符碼是00000000 00000111 這 8 個(gè)地址,表的下面還有 8 個(gè)字節(jié),但因?yàn)檫@個(gè) CGRAM 的字符碼規(guī)定 0 2 位為地址,3位無效,4 7 全為零。因此 CGRAM 的字符碼只有最后三位能用也就是8個(gè)字節(jié)了。等效為 0000X111, X 為無效位,最后三位為 000 111 共 8 個(gè)。如果我們要想顯示這 8 個(gè)用戶自定義的字符,操作方法和顯示CGROM 的一樣,先設(shè)置 DDRAM 位置,再向 DDRAM 寫入字符碼,例如“A
20、就是 41H?,F(xiàn)在我們要顯示 CGRAM 的第一個(gè)自定義字符,就向DDRAM 寫入 00000000B(00H),如果要顯示第 8 個(gè)就寫入00000111(08H),簡(jiǎn)單吧!好!現(xiàn)在我們來看怎么向這八個(gè)自定義字符寫入字模。有個(gè)設(shè)置CGRAM 地址的指這就是顯示的效果,你做成功了嗎?令大家還記得嗎?趕快再找出來看看。拾令功能指令編碼/USRSDO7DBADBSOB4DB3DB2- i-DB-fIBSWa1CRRftHffi地址W位)40地址從這個(gè)指令可以看出指令數(shù)據(jù)的高2 位已固定是 01,只有后面的 6 位是地址數(shù)據(jù),而這 6 位中的高 3 位就表示這八個(gè)自定義字符,最后的3 位就是字模數(shù)據(jù)
21、的八個(gè)地址了。下面我們寫一段程序讓這8 個(gè)自定義字符顯示出一個(gè)心的圖案:(由于上面那個(gè)顯示程序已經(jīng)有很詳細(xì)的注釋了,因此這個(gè)程序只對(duì)與上個(gè)程序不同的地方寫注釋)#in clude#defi ne uint un sig ned int#defi ne uchar un sig ned charsbit rs=P3A5;sbit rw=P3A6;sbit en=卩3人7;uchar code table=0 x03,0 x07,0 x0f,0 x1f,0 x1f,0 x1f,0 x1f,0 x1f,0 x18,0 x1E,0 x1f,0 x1f,0 x1f,0 x1f,0 x1f,0 x1f,0
22、 x07,0 x1f,0 x1f,0 x1f,0 x1f,0 x1f,0 x1f,0 x1f,0 x10,0 x18,0 x1c,0 x1E,0 x1E,0 x1E,0 x1E,0 x1E,節(jié)寫入字模數(shù)據(jù),讓它能顯示出地址:01000000數(shù)據(jù):00010000010000010000011001000010000010010100001100001000010001000000100001000101000010010100011000000110010001110000000001000111 八個(gè)地址。我們向這 8 個(gè)字圖示:OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
23、OOOOOOOOOOOOOOOO例如第一個(gè)自定義字符的字模地址為010000000 x0f,0 x07,0 x03,0 x01,0 x00,0 x00,0 x00,0 x00,0 x1f,0 x1f,0 x1f,0 x1f,0 x1f,0 x0f,0 x07,0 x01,0 x1f,0 x1f,0 x1f,0 x1f,0 x1f,0 x1c,0 x18,0 x00,0 x1c,0 x18,0 x10,0 x00,0 x00,0 x00,0 x00,0 x00;/*uchar code table1=0 x10,0 x06,0 x09,0 x08,0 x08,0 x09,0 x06,0 x00;
24、/符c*/void delay(uint n)uint x,y;for(x=n;x0;x-)for(y=110;y0;y-);void lcd_wcom(uchar com)rs=0;rw=0;P2=com;delay(5);en=1;en=0;void lcd_wdat(uchar dat)rs=1;rw=0;P2=dat;delay(5);en=1;en=0;void lcd_init()心圖案字lcd_wcom(0 x38);lcd_wcom(0 x0c);lcd_wcom(0 x06);lcd_wcom(0 x01);void main()char m=0;lcd_init();lcd
25、_wcom(0 x40);for(m=0;m64;m+)lcd_wdat(tablem);lcd_wcom(0 x85); /for(m=0;m4;m+)lcd_wdat(m);lcd_wcom(0 xc5); /for(m=4;m KeyOverTime )/按鍵時(shí)間要/不是第一KeyCount = 0 ;KeyOverTime = KEY_QUICK_TIME ;return NOKEY ;else /是第一次按下則保存鍵值,以便下次執(zhí)行此函數(shù)時(shí)與讀到的鍵值作比較LastKey = KeyTemp ; /保存第一次讀到的鍵值KeyCount = 0 ; /延時(shí)計(jì)數(shù)器清零KeyOverTim
26、e = KEY_OVER_TIME ;return NOKEY ;下面是我測(cè)試用的主程序(相關(guān)頭文件未列出,僅僅作測(cè)試演示用)void main(void)uint8 KeyValue ;int16 Count ;v_LcdInit_f() ;v_KeyInit_f() ;CLSLOCATE(3, 1)PRINT(Key Test)LOCATE(6, 2)SHOW_ICONwhile(1)KeyValue = u8_ReadKey_f() ;if( KeyValue != NOKEY )LOCATE(1, 2)if( KeyValue = 0 x0e )Count+ ;if( KeyValue
27、 = 0 x0d )Count- ;if( KeyValue = 0 x0b )Count = 0 ;if( KeyValue = 0 x07 )Count = 0 ;HIDE_ICONPRINTD(Count, 5)LOCATE(6, 2)else/SHOW_ICON每次執(zhí)行讀鍵盤函數(shù)時(shí),只是對(duì)一些標(biāo)志進(jìn)行判斷,然后退出。因此能夠充分的利用CPU的資源。同時(shí)可 以處理連發(fā)按鍵。此按鍵掃描按鍵函數(shù)可以直接放在主函數(shù)中。如果感覺按鍵太過靈敏或者遲鈍則改一下 相關(guān)消抖動(dòng)的宏定義即可。此函數(shù)也可以通過中斷標(biāo)志位進(jìn)行定時(shí)的掃描。此時(shí),需要添加一個(gè)定時(shí)標(biāo)志 位,并將相關(guān)消抖動(dòng)的和連擊時(shí)間的宏定義改小即可
28、。然后在主程序類似下面這樣寫即可if( KeyTime ) /定時(shí)掃描時(shí)間到KeyValue = u8_ReadKey_f() ;具體的工作就交給您去完成啦。看看效果:按鍵單擊連發(fā)時(shí)候的截圖至此,關(guān)于單個(gè)按鍵的學(xué)習(xí)就告一段落了,您是否已經(jīng)明白了。如果您還不明白,那么把這個(gè)程序好好的 看看,并畫下流程圖,分析分析。估計(jì)您就會(huì)恍然大悟。關(guān)鍵是思路要轉(zhuǎn)換過來。下面我們來看看多個(gè)按鍵的情況吧一般情況下,如果多個(gè)按鍵每個(gè)都直接接在單片機(jī)的I/O上的話會(huì)占用很多的I/O資源。比較合理的一種 做法是, 按照行列接成矩陣的形式。 按鍵接在每一個(gè)的行列的相交處。 這樣對(duì)于m行n列的矩陣, 可以接 的按鍵總數(shù)是m
29、*n。這里我們以常見的4*4矩陣鍵盤來講解矩陣鍵盤的編程。上圖就是矩陣鍵盤的一般接法*此函數(shù)需要定時(shí)器的支持(去抖)*51單片機(jī)特性決定的)/* *模塊內(nèi)相關(guān)的宏定義及常數(shù)宏*/*此模塊所需的全局或者外部變量*/bit bdata StartScan = 0 ;/此變量需放在定時(shí)中斷中置位/*按鍵掃描函數(shù),按下去后經(jīng)去抖,確定按下*則返回鍵值015;無鍵按下則返回0 xff ;*這里我們要介紹一種快速的鍵盤掃描法:線反轉(zhuǎn)法(或者稱為行列翻轉(zhuǎn)法)。具體流程如下。首先,讓單片機(jī)的行全部輸出0,列全部輸出1,讀取列的值(假設(shè)行接P3口的高四位,列接低四位)。即P3= OxOf ;此時(shí)讀列的值,如果有
30、鍵按下,則相應(yīng)的列讀回來的值應(yīng)該為低。譬如此時(shí)讀回來的值為0 x0e ;即按鍵列的位置已經(jīng)確定。這時(shí)反過來,把行作為輸入,列作為輸出,即P0 = 0 xf0 ;此時(shí)再讀行的值,如果按鍵仍然被按下,則相應(yīng)的行的值應(yīng)該為低,如果此時(shí)讀回來的值為0 xe0,則確定了行的位置 。說到這里,您應(yīng)該笑了,知道了一個(gè)按鍵被按下的行和列的位置,那么就可以肯定確定它的位置了。我們把讀回來的行值和列值進(jìn)行或運(yùn)算。即0 xe0 | 0 x 0e即0 xee。那么0 xee就是我們按下的按鍵的鍵值了。怎么樣。只需幾步就可以判斷所有的鍵值,簡(jiǎn)單吧。下面再結(jié)合一個(gè)例子具體看看。/*此模塊所需相關(guān)支持庫*/#include
31、regx52.h#define uint8 unsigned char#define uint16 unsigned int/*與硬件連接相關(guān)的定義及宏定義和操作宏*/#define KEYBOARDP3/鍵盤連接到單片機(jī)上的端口位置#define READ_ROW_ENLABLEKEYBOARD = 0 x0f ;/讀端口之前先把相應(yīng)口置位(由基本#define READ_COL_ENLABLEKEYBOARD = 0 xf0 ;/根據(jù)實(shí)際硬件連接情況修改#define NOKEY0 xff /定義無鍵按下時(shí)的返回值#define DELAY_COUNT 2/消抖時(shí)間常數(shù)*uint8 u8_
32、KeyBoardScan_f()static uint8 DelayCount = 0 ;uint8 KeyValueRow = 0 ;uint8 KeyValueCol = 0 ;uint8 KeyValue = 0 ;if( StartScan ) /開始掃描,StartScan在定時(shí)中斷中置位StartScan = 0 ;/清除開始掃描標(biāo)志位,避免多次重復(fù)執(zhí)行掃描程序/讀入按鍵狀態(tài)前先向相應(yīng)端口寫1(由基本51單片機(jī)硬件結(jié)構(gòu)決定) READ_ROW_ENLABLEif( ( KEYBOARD & 0 x0f ) != 0 x0f ) /判斷是否有鍵按下/有鍵按下則判斷延時(shí)去抖的時(shí)
33、間是否達(dá)到/再次判斷是否按鍵真的按下/確定按下后,延時(shí)去抖計(jì)時(shí)器清0KeyValueRow = KEYBOARD & 0 x0f ; /取得行碼/準(zhǔn)備讀列,先向相應(yīng)端口寫1(由基本51單片機(jī)硬件結(jié)構(gòu)決定)READ_COL_ENLABLEif ( (KEYBOARD & 0 xf0) != 0 xf0 ) /KeyValueCol = KEYBOARD & 0 xf0 ;/取得列碼/合并取得的行碼和列碼,即是相應(yīng)按鍵的鍵值switch( KeyValueCol | KeyValueRow)case 0 x77 : KeyValue = 0 ; break ;case 0
34、xb7 : KeyValue = 1 ; break ;case 0 xd7 : KeyValue = 2 ; break ;case 0 xe7 : KeyValue = 3 ; break ;case 0 x7b : KeyValue = 4 ; break ;case 0 xbb : KeyValue = 5 ; break ;DelayCount+;if( DelayCount KeyOverTime )KeyCount = 0 ;KeyOverTime = KEY_QUICK_TIME ;return NOKEY ;else /是第一次按下則保存鍵值,以便下次執(zhí)行此函數(shù)時(shí)與讀到的鍵值
35、作比較LastKey = KeyTemp ;/保存第一次讀到的鍵值KeyCount = 0 ; /延時(shí)計(jì)數(shù)器清零KeyOverTime = KEY_OVER_TIME ;return NOKEY ;下面是我測(cè)試用的主程序(相關(guān)頭文件未列出,僅僅作測(cè)試演示用) void main(void)uint8 KeyValue ;int16 Count ;v_LcdInit_f() ;v_KeyInit_f() ;CLSLOCATE(3, 1)PRINT(Key Test)LOCATE(6, 2)/不是第一SHOW_ICONwhile(1)KeyValue = u8_ReadKey_f() ;if( K
36、eyValue != NOKEY )LOCATE(1, 2)if( KeyValue = 0 x0e )Count+ ;if( KeyValue = 0 x0d )Count- ;if( KeyValue = 0 x0b )Count = 0 ; if( KeyValue = 0 x07 )Count = 0 ;HIDE_ICONPRINTD(Count, 5)LOCATE(6, 2)else/SHOW_ICON每次執(zhí)行讀鍵盤函數(shù)時(shí),只是對(duì)一些標(biāo)志進(jìn)行判斷,然后退出。因此能夠充分的利用CPU的資源。同時(shí)可以處理連發(fā)按鍵。此按鍵掃描按鍵函數(shù)可以直接放在主函數(shù)中。如果感覺按鍵太過靈敏或者遲鈍則改一
37、下相關(guān)消抖動(dòng)的宏定義即可。此函數(shù)也可以通過中斷標(biāo)志位進(jìn)行定時(shí)的掃描。此時(shí),需要添加一個(gè)定時(shí)標(biāo)志位,并將相關(guān)消抖動(dòng)的和連擊時(shí)間的宏定義改小即可。然后在主程序類似下面這樣寫即可KeyValue = u8_ReadKey_f();具體的工作就交給您去完成啦。看看效果:按鍵單擊至此,關(guān)于單個(gè)按鍵的學(xué)習(xí)就告一段落了,您是否已經(jīng)明白了。如果您還不明白,那么把這個(gè)程序好好的看看,并畫下流程圖,分析分析。估計(jì)您就會(huì)恍然大悟。關(guān)鍵是思路要轉(zhuǎn)換過來。下面我們來看看多個(gè)按鍵的情況吧一般情況下,如果多個(gè)按鍵每個(gè)都直接接在單片機(jī)的I/O上的話會(huì)占用很多的I/O資源。比較合理的一種if( KeyTime )/定時(shí)掃描時(shí)間
38、到做法是,按照行列接成矩陣的形式。 按鍵接在每一個(gè)的行列的相交處。這樣對(duì)于m行n列的矩陣,可以接的按鍵總數(shù)是m*n。這里我們以常見的4*4矩陣鍵盤來講解矩陣鍵盤的編程。上圖就是矩陣鍵盤的一般接法。這里我們要介紹一種快速的鍵盤掃描法:線反轉(zhuǎn)法(或者稱為行列翻轉(zhuǎn)法)。具體流程如下。首先,讓單片機(jī)的行全部輸出0,列全部輸出1,讀取列的值(假設(shè)行接P3口的高四位,列接低四位)。即P3= OxOf ;此 時(shí)讀列的值,如果有鍵按下,則相應(yīng)的列讀回來的值應(yīng)該為低。譬如此時(shí)讀回來的值為OxOe ;即按鍵列的位置已經(jīng)確定。這時(shí)反過來,把行作為輸入,列作為輸出,即P0 = OxfO ;此時(shí)再讀行的值,如果按鍵仍然
39、被按下,則相應(yīng)的行的值應(yīng)該為低,如果此時(shí)讀回來的值為OxeO,則確定了行的位置。說到這里,您應(yīng)該笑了,知道了一個(gè)按鍵被按下的行和列的位置,那么就可以肯定確定它的位置了。我們把讀回來的行值和列值進(jìn)行或運(yùn)算。即OxeO | Ox Oe即Oxee。那么Oxee就是我們按下的按鍵的鍵值了。怎么樣。只需幾步就可以判斷所有的鍵值,簡(jiǎn)單吧。下面再結(jié)合一個(gè)例子具體看看。/*此模塊所需相關(guān)支持庫*/#includeregx52.h#define uint8 unsigned char#define uint16 unsigned int/*與硬件連接相關(guān)的定義及宏定義和操作宏*/鍵盤連接到單片機(jī)上的端口位置KE
40、YBOARD = 0 x0f ;/讀端口之前先把相應(yīng)口置位(由基本KEYBOARD = 0 xf0 ;/根據(jù)實(shí)際硬件連接情況修改/*模塊內(nèi)相關(guān)的宏定義及常數(shù)宏*/#define NOKEY 0 xff /定義無鍵按下時(shí)的返回值#define DELAY_COUNT 2 /消抖時(shí)間常數(shù)*此模塊所需的全局或者外部變量*/*按鍵掃描函數(shù),按下去后經(jīng)去抖,確定按下*則返回鍵值015;無鍵按下則返回0 xff ; *此函數(shù)需要定時(shí)器的支持(去抖 .) */uint8 u8_KeyBoardScan_f()static uint8 DelayCount = 0 ;uint8 KeyValueRow = 0
41、 ;uint8 KeyValueCol = 0 ;uint8 KeyValue = 0 ;if( StartScan ) /開始掃描,StartScan在定時(shí)中斷中置位StartScan = 0 ;/清除開始掃描標(biāo)志位,避免多次重復(fù)執(zhí)行掃描程序/讀入按鍵狀態(tài)前先向相應(yīng)端口寫1(由基本51單片機(jī)硬件結(jié)構(gòu)決定)READ_ROW_ENLABLEif( ( KEYBOARD & 0 x0f ) != 0 x0f ) /判斷是否有鍵按下DelayCount+;if( DelayCount = DELAY_COUNT )/有鍵按下則判斷延時(shí)去抖的時(shí)間是否達(dá)到returnNOKEY ;#define
42、 KEYBOARD P3#define READ_ROW_ENLABLE51單片機(jī)特性決定的)#define READ_COL_ENLABLEbit bdata StartScan = 0 ;/此變量需放在定時(shí)中斷中置位else /消除了抖動(dòng)if( ( KEYBOARD & 0 x0f ) != 0 x0f )/再次判斷是否按鍵真的按下DelayCount = 0 ;/確定按下后,延時(shí)去抖計(jì)時(shí)器清0KeyValueRow = KEYBOARD & 0 x0f ; /取得行碼/準(zhǔn)備讀列,先向相應(yīng)端口寫1(由基本51單片機(jī)硬件結(jié)構(gòu)決定) READ_COL_ENLABL Eif (
43、(KEYBOARD & 0 xf0) != 0 xf0 ) /反轉(zhuǎn),讀列碼KeyValueCol = KEYBOARD & 0 xf0 ;/取得列碼/合并取得的行碼和列碼,即是相應(yīng)按鍵的鍵值switch( KeyValueCol | KeyValueRow)case 0 x77 : KeyValue = 0 ; break ;case 0 xb7 : KeyValue = 1 ; break ;case 0 xd7 : KeyValue = 2 ; break ;case 0 xe7 : KeyValue = 3 ; break ;case 0 x7b : KeyValue =
44、 4 ; break ;case 0 xbb : KeyValue = 5 ; break ;case 0 xdb : KeyValue = 6 ; break ;case 0 xeb : KeyValue = 7 ; break ;case 0 x7d : KeyValue = 8 ; break ;case 0 xbd : KeyValue = 9 ; break ;case 0 xdd : KeyValue = 10 ;break ;case 0 xed : KeyValue = 11 ;break ;case 0 x7e : KeyValue = 12 ;break ;case 0 x
45、be : KeyValue = 13 ;break ;case 0 xde : KeyValue = 14 ;break ;case 0 xee : KeyValue = 15 ;break ; default : return NOKEY ; return KeyValue ;else DelayCount = 0 ; return NOKEY ; elseDelayCount = 0 ; return NOKEY ;elseDelayCount = 0 ; return NOKEY ;void v_T0_Isr_f( void ) interrupt INTERRUPT_TIMER2_OV
46、ERFLOWStartScan = 1 ;*模塊調(diào)試*/主函數(shù)僅作演示用,主函數(shù)除按鍵掃描外的函數(shù)并沒在這里給出voidv_Init_T2_f( void )T2CON = 0 x04 ;T2MOD= 0 x00 ;TH2 = 0 xd8 ;RCAP2H= 0 xd8 ;TL2 = 0 xf0 ;RCAP2L = 0 xf0 ;ET2 = 1 ;TR2= 1 ;void main( void )uint8 readkey = 0 ; v_Init_T2_f( ) ; v_LcdInit_f( );LOCATE( 1, 1)PRINT(4*4KeyBoard Test)EA = 1 ;LOCAT
47、E( 3, 2)while( 1 )SHOW_ICONreadkey = u8_KeyBoardScan_f() if( readkey != NOKEY)PRINTN( readkey , 2)LOCATE( 3, 2)continue ;elsecontinue ;呵呵,按鍵掃描程序已經(jīng)注釋的很詳細(xì)了。我就不多費(fèi)嘴舌了。如果有不清楚的地方,歡迎跟帖討論。 下面是按鍵測(cè)試的截圖我的自己搭建的實(shí)驗(yàn)板OK,Enioy it !自此按鍵檢測(cè)告一段落。下次如果再講按鍵。將會(huì)討論另外一種按鍵的寫法:基于狀態(tài)機(jī) 的按鍵程序設(shè)計(jì)。歡迎討論。tiankai (2010-2-05 16:39:19)晨輝教你輕
48、松學(xué)51-外圍芯片之ds1302和ds18b20對(duì)于市面上的大多數(shù)51單片機(jī)開發(fā)板來說。ds1302和ds18b20應(yīng)該是比較常見的兩種外圍芯片。ds1302是具有SPI總線接口的時(shí)鐘芯片。ds18b20則是具有單總線接口的數(shù)字溫度傳感器。下面讓我們分別來認(rèn)識(shí)并學(xué)會(huì)應(yīng)用這兩種芯片。首先依舊是看DS1302的datasheet中的相關(guān)介紹。DS1302是 HALLOS 公司推出怖灣熬充電時(shí)悴芽片.內(nèi)含有一 6 實(shí)時(shí)時(shí)日歷W 31 7 9 RAM,逮罐勵(lì) 單的串柝擅口與單片 HI進(jìn)柑通 f 雷時(shí)時(shí)忡舊冊(cè)電路提供 X、汁、時(shí)、& H 期、小年的佶超冃的天 貌側(cè)的的天熬可自動(dòng)調(diào)烙 川嚇卄1 A
49、MPM梧:心吃* I: 24 JSL 12小潸咯式 DS13O2 與單丿;機(jī)上 閭縫電空采用同步申行的冇式iStrjttft*僅需用到三個(gè)匚 I域;llRESfH 柱人(DSCLK 時(shí)丼 h 時(shí)神 RAM 的讀/斗敵 Helf 字棊或莠達(dá) 31 牛字前的字符畑方成通DS1302 TfW 功輕根 低*風(fēng)曲數(shù)據(jù)和時(shí)抻值息時(shí)功率小DSB02魁由 DS1302 進(jìn)廚來.堆加了以卜的特性 t農(nóng)電 F主電觀備愉電灌供卜心 Vecl AW 輦程涓逾克電電譚.IHM七牛爭(zhēng)首存緒宅它湮應(yīng)用于電話、梶摘式 USU 及電池供電的快餐岐表甘 產(chǎn)呂務(wù) 4U下麗將主聲的性施指算件一尊含實(shí)耐時(shí)建貝”誕計(jì)悴川 00干 2 削
50、的秒,爪時(shí)、H.日輒用期、”、年的龍 b 還有國年鍛 U的能”世哲存數(shù)撇存 6BRAM率抒 1門方成他妙胃躺紡常誠少嵐褲消丁作電用:20-5 WT#電逵:2 0V時(shí).小于 30WRAMi育背禪傳送方式*單字持 14和多了関傳送 0 ; i- )if( Content & 0 x01 )DS1302_IO_HIGHelseDS1302_IO_LOWContent = 1 ;DS1302_SCLK_HIGHDS1302_SCLK_LOW* * Function: static uint8 v_DS1302Read_f( void )* Description:從DS1302當(dāng)前設(shè)定的地址讀
51、取一個(gè)字節(jié)的內(nèi)容* Parameter: * Return:返回讀出來的值(uint8) */static uint8 v_DS1302Read_f( void )uint8 i, ReadValue ;DS1302_IO_HIGHfor( i = 8 ; i 0 ; i- )ReadValue = 1 ;if( DS1302_IO_READ )ReadValue |= 0 x80 ;elseReadValue &= 0 x7f ;DS1302_SCLK_HIGHDS1302_SCLK_LOWreturn ReadValue ;* * Function: void v_DS1302Wr
52、iteByte_f( uint8 Address, uint8 Content )* Description:從DS1302指定的地址寫入一個(gè)字節(jié)的內(nèi)容* Parameter: Address:要寫入數(shù)據(jù)的地址* Content:寫入數(shù)據(jù)的具體值*Return:*/void v_DS1302WriteByte_f( uint8 Address, uint8 Content )DS1302_RST_LOWDS1302_SCLK_LOWDS1302_RST_HIGHv_DS1302Write_f( Address ) ; v_DS1302Write_f( Content ) ;DS1302_RST
53、_LOWDS1302_SCLK_HIGH* * Function: uint8 v_DS1302ReadByte_f( uint8 Address )* Description:從DS1302指定的地址讀出一個(gè)字節(jié)的內(nèi)容* Parameter:Address:要讀出數(shù)據(jù)的地址* * Return:指定地址讀出的值(uint8) */uint8 v_DS1302ReadByte_f( uint8 Address )uint8 ReadValue ;DS1302_RST_LOWDS1302_SCLK_LOWDS1302_RST_HIGHv_DS1302Write_f( Address ) ; Re
54、adValue = v_DS1302Read_f() ;DS1302_RST_LOWDS1302_SCLK_HIGHreturn ReadValue ;/* Function: void v_ClockInit_f( void ) * Description:初始化寫入DS1302時(shí)鐘寄存器的值(主程序中只需調(diào)用一次即可) *Parameter:* Return: */void v_ClockInit_f( void )if( v_DS1302ReadByte_f( 0 xc1) != 0 xf0 )v_DS1302WriteByte_f( 0 x8e, 0 x00 ) ;v_DS1302Wr
55、iteByte_f( DS1302_YEAR_WRITE, 0 x08 ) ;/年v_DS1302WriteByte_f( DS1302_WEEK_WRITE, 0 x04 ) ;/星期v_DS1302WriteByte_f( DS1302_MONTH_WRITE, 0 x12 ) ;/月v_DS1302WriteByte_f( DS1302_DAY_WRITE, 0 x11 ) ;/日/允許寫操作v_DS1302WriteByte_f( DS1302_HOUR_WRITE, 0 x13 ) ;/小時(shí)v_DS1302WriteByte_f( DS1302_MINUTE_WRITE, 0 x06
56、 ) ;/分鐘v_DS1302WriteByte_f( DS1302_SECOND_WRITE, 0 x40 ) ;/秒v_DS1302WriteByte_f( 0 x90, 0 xa5 ) ;/充電DS1302WriteByte_f( 0 xc0, 0 xf0 ) ;/判斷是否初始化一次標(biāo)識(shí)寫入v_DS1302WriteByte_f( 0 x8e, 0 x80 ) ;/禁止寫操作* Function: void v_ClockUpdata_f( void ) * Description:讀取時(shí)間數(shù)據(jù),并保存在結(jié)構(gòu)體CurrentTime中Parameter:Return:*/void v_C
57、lockUpdata_f( void )CurrentTime.Second = v_DS1302ReadByte_f( DS1302_SECOND_READ ) ;CurrentTime.Minute = v_DS1302ReadByte_f( DS1302_MINUTE_READ ) ;CurrentTime.Hour = v_DS1302ReadByte_f( DS1302_HOUR_READ ) ; CurrentTime.Day =v_DS1302ReadByte_f( DS1302_DAY_READ ) ;CurrentTime.Month = v_DS1302ReadByte_f
58、( DS1302_MONTH_READ ) ;CurrentTime.Week= v_DS1302ReadByte_f( DS1302_WEEK_READ ) ;CurrentTime.Year= v_DS1302ReadByte_f( DS1302_YEAR_READ ) ;有了上面的這些函數(shù)我們就可以對(duì)DS1302進(jìn)行操作了。當(dāng)我們想要獲取當(dāng)前時(shí)間時(shí),只需要調(diào)用v_ClockUpdata_f( void )這個(gè)函數(shù)即可。讀取到的時(shí)間數(shù)據(jù)保存在CurrentTime這個(gè)結(jié)構(gòu)體中。至于如何把時(shí)間數(shù)據(jù)在數(shù)碼管或者是液晶屏上顯示岀來我相信大家應(yīng)該都會(huì)了吧A A看看顯示效果如何下面再讓我們看看DS1
59、8B20吧。DS18B20是單總線的數(shù)字溫度傳感器。其與單片機(jī)的接口只需要一根數(shù)據(jù)線即可。當(dāng)然連線簡(jiǎn)單意味著 軟件處理上可能要麻煩一點(diǎn)。下面來看看它的優(yōu)點(diǎn):全數(shù)字溫度轉(zhuǎn)換及輸岀先進(jìn)的單總線數(shù)據(jù)通信。最高12位分辨率.精度可達(dá)土0.5攝氏度一12位分藕率時(shí)的最大丄作周期為了50毫秒 可選擇寄生工作方式。檢測(cè)溫度范圍為 -55 C -+125 C( - 67 F-+257 F)內(nèi)置EEPR0M,限溫報(bào)警功能。64位光刻ROM,內(nèi)舊產(chǎn)品序列號(hào)*方便多機(jī)掛接 多樣封裝形式再適應(yīng)不同硬件系統(tǒng).看看它的靚照。外形和我們常用的三極管沒有什么兩樣哦。DALLAS 18B20a:、;DS18B20的內(nèi)部存儲(chǔ)器分
60、為以下幾部分ROM:存放該器件的編碼。前8位為單線系列的編碼(DS18B20的編碼是19H)后面48位為芯片的唯一 序列號(hào)。在出場(chǎng)的時(shí)候就已經(jīng)設(shè)置好,用戶無法更改。最后8位是以上56位的CRC碼。RAM:DS18B20的內(nèi)部暫存器共9個(gè)字節(jié)。其中第一個(gè)和第二個(gè)字節(jié)存放轉(zhuǎn)換后的溫度值。第二個(gè)和第 三個(gè)字節(jié)分別存放高溫和低溫告警值。(可以用RAM指令將其拷貝到EEPROM中)第四個(gè)字節(jié)為配置寄存器。第57個(gè)字節(jié)保留。第9個(gè)字節(jié)為前8個(gè)字節(jié)的CRC碼。2322212212-232-4MSb(milt = C)LSbSsSS2625LSBMSBDS18B20的溫度存放如上圖所示。其中S位符號(hào)位。當(dāng)溫度值為負(fù)值時(shí),S = 1,反之則S = 0。我們把得到的溫度數(shù)據(jù)乘上對(duì)應(yīng)的分辨率即可以得到轉(zhuǎn)換后的溫度值。DS18B20的通訊
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 三方居間合同
- 航空器材維修服務(wù)合同
- 水暖工承包合同
- 2025年度商業(yè)街區(qū)停車位使用權(quán)買賣合同書
- 2025年度二零二五年度食堂轉(zhuǎn)讓合同附帶員工績(jī)效獎(jiǎng)金分配協(xié)議
- 2025年度版權(quán)授權(quán)與獨(dú)家運(yùn)營合同
- 2025年度酒店員工勞動(dòng)合同與員工工作生活平衡支持協(xié)議
- 2025年度退休管理人員返聘項(xiàng)目管理合同
- 二零二五年度汽車租賃傭金結(jié)算訂車協(xié)議與購車合同范本
- 2025版圖書館多媒體資源采購合同規(guī)范3篇
- 骨科抗菌藥物應(yīng)用分析報(bào)告
- 支付行業(yè)反洗錢與反恐怖融資
- 百詞斬托福詞匯excel版本
- 基礎(chǔ)設(shè)施綠色施工技術(shù)研究
- 寶鋼BQB 481-2023全工藝?yán)滠堉蓄l無取向電工鋼帶文件
- 車輛定損情況確認(rèn)書范本
- 高中英語新課標(biāo)詞匯表(附詞組)
- 證券公司信用風(fēng)險(xiǎn)和操作風(fēng)險(xiǎn)管理理論和實(shí)踐中金公司
- 2022年高考湖南卷生物試題(含答案解析)
- GB/T 20909-2007鋼門窗
- GB/T 15593-2020輸血(液)器具用聚氯乙烯塑料
評(píng)論
0/150
提交評(píng)論