- [br]1 ORG 0000H [br]2 SCL BIT P1.0;定義24C02的串行時鐘線 [br]3 SDA BIT P1.1;定義24C02的串行數據線 [br]4 LJMP START [br]5 START:LCALL STAR;調用 [br]6 MOV R2,#08H;一個數據有8位 [br]7 MOV DPTR,#0600H ;定義源數據的位置 [br]8 LOOP:MOV A,#00H [br]9 MOVC A,@A+DPTR [br]10 LCALL SDATA [br]11 LCALL ACK [br]12 JC LOOP [br]13 INC DPTR [br]14 DJNZ R2,LOOP [br]15 LCALL STOP;調用停止子程序 [br]16 STAR:SETB SDA [br]17 SETB SCL [br]18 NOP [br]19 NOP [br]20 NOP [br]21 NOP [br]22 CLR SDA [br]23 NOP [br]24 NOP [br]25 NOP [br]26 CLR SCL [br]27 RET [br]28 SDATA:MOV R0,#10H [br]29 LOOP0:RLC A [br]30 MOV SDA,C [br]31 NOP [br]32 NOP [br]33 SETB SCL [br]34 NOP [br]35 NOP [br]36 NOP [br]37 NOP [br]38 CLR SCL [br]39 DJNZ R0,LOOP0 [br]40 RET [br]41 ACK:SETB SDA [br]42 NOP [br]43 NOP [br]44 SETB SCL [br]45 NOP [br]46 NOP [br]47 NOP [br]48 NOP [br]49 MOV C,SDA [br]50 CLR SCL [br]51 RET [br]52 STOP:CLR SDA [br]53 NOP [br]54 NOP [br]55 NOP [br]56 NOP [br]57 SETB SCL [br]58 NOP [br]59 NOP [br]60 NOP [br]61 NOP [br]62 SETB SDA [br]63 NOP [br]64 NOP [br]65 NOP [br]66 NOP [br]67 RET [br]68 MAIN1:ORG 0060H [br]69 MOV R3,#0A0H;(命令1010+器件3位地址+讀/寫。 器件地址一個芯片,是000) [br]70 MOV R4,#00H;置片內字節地址 [br]71 MOV R1,#71H;置欲寫數據存放地址指針 [br]72 MOV R7,#01H;置連續寫字節數n [br]73 EEPR:MOV P1,#0FFH [br]74 CLR P1.0;發開始信號 [br]75 MOV A,R3;送器件地址 [br]76 ACALL SUBS;調發送單字節子程序 [br]77 MOV A,R4;送片內字節地址 [br]78 ACALL SUBS [br]79 MOV P1,#0FFH [br]80 CLR P1.0;再發開始信號 [br]81 MOV A,R3 [br]82 SETB ACC.0;發讀命令 [br]83 ACALL SUBS [br]84 MORE:ACALL SUBR [br]85 MOV @R1,A [br]86 INC R1 [br]87 DJNZ R7,MORE [br]88 CLR P1.0 [br]89 ACALL DELAY [br]90 SETB P1.1 [br]91 ACALL DELAY [br]92 SETB P1.0;送停止信號 [br]93 RET [br]94 SUBR:MOV R0,#08H;接受單字節子程序 [br]95 LOOP2:SETB P1.1 [br]96 ACALL DELAY [br]97 MOV C,P1.0 [br]98 RLC A [br]99 CLR P1.1 [br]100 ACALL DELAY [br]101 DJNZ R0,LOOP2 [br]102 CJNE R7,#01H,LOW [br]103 SETB P1.0;若是最后一個字節置A=1 [br]104 AJMP SETOK [br]105 LOW:CLR P1.0;否則置A=0 [br]106 SETOK:ACALL DELAY [br]107 SETB P1.1 [br]108 ACALL DELAY [br]109 CLR P1.1 [br]110 ACALL DELAY [br]111 SETB P1.0;應答畢,SDA置1 [br]112 RET [br]113 LCALL DA [br]114 DA:MOV A,P0 [br]115 MOV DPTR,#FEFFH [br]116 MOV @DPTR,A [br]117 RET [br]118 MAIN: [br]119 ORG 001BH [br]120 LJMP TINT [br]121 ORG 0030H [br]122 LCALL INIT [br]123 ;初始化子程序: [br]124 INIT:CLR RS0 [br]125 CLR RS1 [br]126 MOV R0,#10H [br]127 MOV R1,#00H [br]128 MOV P1,#0FFH [br]129 CLR TR1 [br]130 MOV TMOD,#19H [br]131 MOV TL1,#19H [br]132 MOV TH1,#0FCH [br]133 SETB TR1 [br]134 SETB ET1 [br]135 SET EA [br]136 RET [br]137 ;定時掃描子程序: [br]138 TIINT:SETB RS0 [br]139 CLR EA [br]140 CLR TR1 [br]141 MOV A,#1EH [br]142 ADD A,TL1 [br]143 MOV TL1,A [br]144 MOV A,#0FCH [br]145 ADDC A,TH1 [br]146 MOV TH1,A [br]147 SETB TR1 [br]148 SETB EA [br]149 TIINT1:CJNE R1,#08H,TINT2 [br]150 MOV 10H,20H [br]151 MOV 11H,21H [br]152 MOV 12H,22H [br]153 MOV 13H,23H [br]154 MOV 14H,24H [br]155 MOV 15H,25H [br]156 MOV 16H,26H [br]157 MOV 17H,27H [br]158 TIINT2:CJNE R1,#08H,TIINT3 [br]159 MOV A,@R0 [br]160 SJMP TIINT4 [br]161 TIINT3:MOV A,@R0 [br]162 ADD A,#15 [br]163 MOVC A,@A+PC [br]164 TIINT4:LCALL SENDLED [br]165 INC R0 [br]166 INC R1 [br]167 TIINTE:CLR RS0 [br]168 DB 03H,9FH,25H,0DH,99H [br]169 49H,41H,1FH,01H,09H [br]170 ;顯示子程序: [br]171 SENDLED:CLR P1.3 [br]172 MOV R2,#8 [br]173 SLED0:RRC A [br]174 JNC SLED1 [br]175 SETB P1.2 [br]176 SJMP SLED2 [br]177 SLED1:CLR P1.2 [br]178 SLED2:CLR P1.1 [br]179 NOP [br]180 SETB P1.1 [br]181 DJNZ R2,SLED0 [br]182 MOV A,R1 [br]183 MOV C,ACC.0 [br]184 MOV P1.6,C [br]185 MOV C,ACC.1 [br]186 MOV P1.5,C [br]187 MOV C,ACC.2 [br]188 MOV P1.4,C [br]189 STTB P1.3 [br]190 RET [br]191 MAIN2:ORG 0030H [br]192 MOV SP,#5FH [br]193 MOV P2,#0FFH [br]194 LOOP: [br]195 ACALL KEY;調用鍵盤程序 [br]196 JNB F0,LNEXT;如果無鍵按下,則繼續 [br]197 LNEXT: [br]198 AJMP LOOP;反復循環,主程序到此結 [br]199 ACALL KEYPROC;否則調用鍵盤處理程序 [br]200 DELAY: [br]201 MOV R7,#100 [br]202 D1:MOV R6,#100 [br]203 DJNZ R6,$ [br]204 DJNZ R7,D1 [br]205 RET [br]206 ;-------------------延時程序,鍵盤處理中調用) [br]207 JB ACC.1,key1;1號鍵按下轉 [br]208 JB ACC.2,key2;2號鍵按下轉 [br]209 JB ACC.3,key3;3號鍵按轉 [br]210 AJMP KEY_RET [br]211 Key1:MOV @R0,P1 [br]212 MOV A,@R0;取當前計時單元數據到A [br]213 DEC R0;指向前一地址 [br]214 SWA A;A中數據高四位與低四位交換 [br]215 ORL A,@R0;前一地址中數據放入A中低位 [br]216 ADD A,#01H;A加1操作 [br]217 DA A;十進制調整 [br]218 MOV R3,A;移入R3寄存器 [br]219 ANL A,#0FH;高四位變0 [br]220 MOV @R0,A;放回前一地址單元 [br]221 MOV A,R3;取回R3中暫存數據 [br]222 INC R0;指向當前地址單元 [br]223 SWAP A;A中數據高四位與低四位交換 [br]224 ANL A,#0FH;高四位變0 [br]225 MOV @R0,A;數據放入當前地址單元中 [br]226 MOV P1,@R1 [br]227 AJMP KEY_RET [br]228 Key2:MOV @R0,P1 [br]229 MOV A,@R0;取當前計時單元數據到A [br]230 DEC R0;指向前一地址 [br]231 SWAP A;A中數據高四位與低四位交換 [br]232 ORL A,@R0;前一地址中數據放入A中低四位 [br]233 DEC A,#01H;A加1操作 [br]234 DA A;十進制調整 [br]235 MOV R3,A;移入R3寄存器 [br]236 ANL A,#0FH;高四位變0 [br]237 MOV @R0,A;放回前一地址單元 [br]238 MOV A,R3;取回R3中暫存數據 [br]239 INC R0;指向當前地址單元 [br]240 SWAP A;A中數據高四位與低四位交換 [br]241 ANL A,#0FH;高四位變0 [br]242 MOV @R0,A;數據放入當前地址單元中 [br]243 MOV P1,@R1 [br]244 AJMP KEY_RET [br]245 Key3:MOV A,71H [br]246 ADD A,#01H [br]247 MOV 71H,A [br]248 LCALL MAIN [br]249 LCALL EEPW [br]250 LCALL AGAIN [br]251 LCALL SUBS [br]252 LCALL LOOP [br]253 LCALL REP [br]254 LCALL DELAY [br]255 AJMP KEY_RET [br]256 KEY_RET:RET [br]257 KEY: [br]258 CLR F0;清F0,表示無鍵按下。 [br]259 ORL P2,#00111100B;將P2口的接有鍵的四位置1 [br]260 MOV A,P2;取P2的值 [br]261 ORL A,#11000011B;將其余4位置1 [br]262 CPL A;取反 [br]263 JZ K_RET;如果為0則一定無鍵按下 [br]264 ACALL DELAY;否則延時去鍵抖 [br]265 ORL P2,#00111100B [br]266 MOV A,P2 [br]267 ORL A,#11000011B [br]268 CPL A [br]269 JZ K_RET [br]270 MOV B,A;確實有鍵按下,將鍵值存入B中 [br]271 SETB F0;設置有鍵按下的標志 [br]272 K_RET: [br]273 ORL P2,#00111100B;此處循環等待鍵的釋放 [br]274 MOV A,P2 [br]275 ORL A,#11000011B [br]276 CPL A [br]277 JZ K_RET1;直到讀取的數據取反后為0說明鍵釋放了,才從鍵盤處理程序中返回AJMP K_RET [br]278 RET [br]279 ;寫串行E2PROM子程序EEPW [br]280 ;R3=10100000(命令1010+器件3位地址+讀/寫。 器件地址一個芯片,是000) [br]281 ;(R4)=片內字節地址 [br]282 ;(R1)=欲寫數據存放地址指針 [br]283 ;(R7)=連續寫字節數n [br]284 MAIN3:ORG 0060H [br]285 MOV R3,#0A0H;(命令1010+器件3位地址+讀/寫。 器件地址一個芯片,是000) [br]286 MOV R4,#00H;置片內字節地址 [br]287 MOV R1,#71H;置欲寫數據存放地址指針 [br]288 MOV R7,#01H;置連續寫字節數n [br]289 EEPW:MOV P1,#0FFH [br]290 CLR P1.0;發開始信號 [br]291 MOV A,R3;送器件地址 [br]292 ACALL SUBS [br]293 MOV A,R4;送片內字節地址 [br]294 ACALL SUBS [br]295 AGAIN:MOV A,@R1 [br]296 ACALL SUBS;調發送單字節子程序INC R1 [br]297 DJNZ R7,AGAIN;連續寫n個字節 [br]298 CLR P1.0;SDA置0, 準備送停止信號 [br]299 ACALL DELAY;延時以滿足傳輸速率要求 [br]300 SETB P1.1;發停止信號 [br]301 ACALL DELAY [br]302 SETB P1.0 [br]303 RET [br]304 SUBS:MOV R0,#08H;發送單字節子程序 [br]305 LOOP:CLR P1.1 [br]306 RLC A [br]307 MOV P1.0,C [br]308 NOP [br]309 SETB P1.1 [br]310 ACALL DELAY [br]311 DJNZ R0,LOOP;循環8次送8個bit [br]312 CLR P1.1 [br]313 ACALL DELAY [br]314 SETB P1.1 [br]315 REP:MOV C,P1.0 [br]316 JC REP;判應答到否,未到則等待 [br]317 CLR P1.1 [br]318 RET [br]319 DELAY:NOP [br]320 NOP [br]321 RET [br]322 MAIN4:LCALL ST [br]323 LCALL STRT [br]324 LCALL LOOP;調用子程序 [br]325 LCALL STAR;同上 [br]326 LCALL SDATA;同上 [br]327 LCALL ASK;同上 [br]328 LCALL STOP;同上 [br]329 ST:MOV A,P0 [br]330 MOV R0,#10H [br]331 MOV R1,#0600H [br]332 MOV @R1,A [br]333 INC R1 [br]334 DJNZ R0 ST [br]335 RET [br]336 END
復制代碼 |