[電腦討論]

有關程式(8051)

請問有沒有哪位大大
能幫忙一下
我有幾個副程式

拜託懂的大大
能救救我們
以下這幾個副程式大概在做什麼(能幫我們說明一下嗎) 我們是做多功能密碼鎖刷卡機
程式我有看了幾遍  但是就是不會解釋
264:        ;*************************中斷副程式*************************
265:        READ_INT:
266:                CJNE        R0,#20H,$DATA_START        ;R0不等於20H表示已抓到STX碼
267:                CALL        CHECK_STX                ;如果抓到STX碼,則令R0=21H
268:                JMP        $NOOK                        ;還沒抓到STX碼
269:
270:        $DATA_START:
271:                JB        P3.4,$BIT0                ;P3.4=RDT(T0)判斷RDT腳為H或L
272:
273:                MOV        A,HIGH1                        ;1:#HIGH1,#00000001B
274:                ORL        A,@R0                        ;將A與@R0作OR運算
275:                JMP        $ROTATE
276:        $BIT0:       
277:                MOV        A,LOW1                        ;0:#LOW1,#11111110B
278:                ANL        A,@R0                        ;將A與@R0作AND運算
279:        $ROTATE:
280:                MOV        @R0,A                        ;將累加器之值放入@R0中
281:
282:                MOV        A,LOW1                        ;將LOW1之值左旋一個位元
283:                RL        A
284:                MOV        LOW1,A
285:
286:                MOV        A,HIGH1                        ;將HIGH1之值左旋一個位元
287:                RL        A
288:                MOV        HIGH1,A
289:
290:                DJNZ        COUNT,$NOOK                ;將COUNT減1,並判斷是否為0
291:                                                ;如果COUNT為0,則作下列動作
292:                MOV        A,#00011111B                ;清除@R0最高3位元
293:                ANL        A,@R0
294:                MOV        @R0,A
295:
296:                MOV        LOW1,#11111110B       
297:                MOV        HIGH1,#00000001B
298:                MOV        COUNT,#05H                ;重設COUNT為5
299:                INC        R0                        ;記憶位址加1
300:        $NOOK:
301:                RETI                                ;中斷結束
302:        ;*************************檢查STX碼*************************
303:        CHECK_STX:
304:                JNB        P3.4,$BIT1                ;P3.4=RDT(T0)判斷RDT腳為H或L
305:
306:                MOV        A,LOW1                        ;LOW1,#11111110B
307:                JMP        $CHECK_CM
308:        $BIT1:
309:                MOV        A,HIGH1                        ;HIGH1,#00000001B
310:
311:        $CHECK_CM:
312:                PUSH        A                        ;先將累加器A放人堆疊裡
313:                XRL        A,#00001011B                ;將累加器A與00001011作XOR運算
314:                ANL        A,HIGH1                        ;將累加器A與HIGH1作AND運算
315:                JNZ        $NONO                        ;若累加器A不為0,則跳到$NONO
316:
317:                POP        A                        ;從堆疊裡取出值放入累加器A裡
318:
319:                MOV        A,LOW1                        ;將LOW1左旋一個位元
320:                RL        A
321:                MOV        LOW1,A
322:
323:                MOV        A,HIGH1                        ;將HIGH1左旋一個位元
324:                RL        A
325:                MOV        HIGH1,A
326:
327:                ANL        A,#00100000B                ;將累加器A之值與00100000作AND運算
328:                JZ        $LOOP_CH                ;如果為0表示未抓到STX碼,跳到$LOOP_CH
329:                MOV        R0,#21H                        ;捉到01011(STX),令R0=21H
330:                MOV        LOW1,#11111110B
331:                MOV        HIGH1,#00000001B
332:                JMP        $LOOP_CH
333:        $NONO:                                        ;不是STX碼,重新抓取
334:                POP        A                        ;從堆疊裡取出值放入累加器A裡
335:                XRL        A,HIGH1                        ;將累加器A與HIGH1作XOR運算
336:                MOV        LOW1,#11111110B
337:                MOV        HIGH1,#00000001B
338:                JZ        $BIT1                        ;如果為0,則從第一位元再檢查STX碼
339:        $LOOP_CH:
340:                RET
341:        ;*************************偵錯(奇同位+LCR)*************************
342:        CHECK_LCR:
343:                MOV        R0,#21H                        ;卡碼從21H開始存放
344:                MOV        A,#00001011B                ;STX碼
345:                MOV        R1,A                        ;將STX碼放進R1裡
346:        $CHECKING:
347:                MOV        A,@R0                        ;將@R0之值放進累加器A裡
348:                CALL        CM_ODD                        ;奇同位檢測
349:       
350:                MOV        A,R1
351:                XRL        A,@R0                        ;STX XOR DATA XOR ETX
352:                MOV        R1,A                        ;XOR完之值存放在R1裡
353:
354:                MOV        A,@R0                        ;ETX檢測
355:                XRL        A,#00011111B                ;ETX=11111B
356:                JZ        $IS_ETX                 ;若改為JZ CORRECT則忽略LCR
357:                INC        R0                        ;不為ETX碼則R0再加1
358:                JMP        $CHECKING
359:        $IS_ETX:                                ;LCR檢測
360:                INC        R0                        ;EXT碼後存放LCR碼
361:                MOV        A,@R0                        ;將LCR碼放進累加器A裡
362:                MOV        R7,A                        ;再放進R7裡
363:                MOV        A,R1                        ;將R1(之前XOR)之值放進累加器裡
364:                XRL        A,R7                        ;R7 XOR
365:                JZ        CORRECT                        ;若為0,則所讀的碼是正確的
366:        ERROR:                                        ;若不是,則所讀的碼是錯誤的
367:                CALL        CLS                        ;清除LCD
368:                MOV        DPTR,#ERR                ;顯示"Data Read Error!$"
369:                CALL        Print_String
370:                CALL        ERR_MUSIC                ;呼叫錯誤聲音
371:                JMP        ItIsOk                        ;返回表單
372:        CORRECT:
373:                RET
374:        ;*************************奇同位檢測*************************
375:        CM_ODD:       
376:                MOV     R7,A                        ;將累加器A之值暫存到R7
377:
378:                MOV     A,#00000000B                ;將A歸零
379:                MOV     R6,#05H                        ;設定迴圈執行5次
380:        $LM:
381:                XRL     A,R7
382:                RL      A                        ;將累加器A左旋一個位元
383:                DJNZ    R6,$LM
384:
385:                ANL     A,#00100000B                ;將累加器A第6個位元與1作AND運算
386:                JNZ     $CM_RIGHT                ;如果為0,則跳到$CM_RIGHT
387:                JMP        ERROR                        ;如果不為0,則跳到ERROR
388:        $CM_RIGHT:
389:                       RET

[ 本帖最後由 degit 於 2008-6-15 23:12 編輯 ]
喜歡這篇文章嗎?
回覆 2
您需要登入後才可以回帖 登入 | 註冊會員

本版積分規則 回覆 15 個字以上可拿獎勵,
規則詳見此

精選熱門商品

提示訊息
go_top