HT66F3185串口接收和发送

要求:

1、    主機通過向從機發送0XAA, 0X12, 0X34, 從機接收正確回傳0X55,接收錯誤回傳0XEE

2、    通過按鍵切換顯示計數:

  • 主機顯示正确計數n1。另外收發超時機制也要列入錯誤計數處理,通信間隔為10ms 一次。

  • 主機顯示錯誤計數n2。

 

则分为两个部分:

1.从机接收

2.主机发送,判断,显示

 

 

1.从机接收

从机接收数据的想法:存储数据后进行判断,再由串口发送0x55,0xee给主机

芯片串口存储只有两个FIFO,也就是说只能存两帧数据,单纯发送TXT_RXR寄存器的时候也发现了一次发送两帧数据,这样发送乱码。

为了像C一样,能用数组数据储存,所以用了汇编中的指针。将数据全部存储起来,再进行发送。(仅需在主函数将IAR0的值,提取出来,然后用send发送)

和C语言不同,不能用数组,只能采用MP0,IAP0的方法来存储数据(具体方法可以看手册)

下面两行是数据的存储,将ACC存储的值,放入IAR0中,再移动MP0 的地址,使IAR0指向下一个存储区

       MOV        IAR0,A               
       INC        MP0                            ;Put data into address

 

举个例子,将TXR_RXR的数据存储在MP0所指的地址存储区,利用IAR0进行存储(1~10),

数据的大小根据自己的需求决定(11~15),

最后再将地址,和存储大小初始化就好

 1 ;It is convenient to view the received data in RX_BUF        
 2         MOV        A,TXR_RXR            
 3         MOV        RX_BUF,A                    ;RCE BUF
 4         
 5 ;TXR_RXR=IAR0,Put data into address        
 6         MOV        IAR0,A
 7         INC        MP0                            ;Put data into address
 8         INC        COUNT
 9 
10 ;storing 3 data
11 ;//--  if want to store more data ,plase change 3     --//    
12         MOV        A,3
13         SUB        A,COUNT
14         MOV        VALUE,A                        ;SEND 5 DATAS
15         SZ        VALUE
16 ;//--  If you add the following code,plase change 5  --//         
17         JMP        $+5                        
18         
19 ;addr and count init        
20         MOV        A,ADDR                        ;Read data from this address
21         MOV        MP0,A
22         MOV        A,0
23         MOV        COUNT,A                        ;COUNT INIT

 

数据的取出判断,也是同理。地址随着循环指向下一个,再将IAR0的数据提取出到ACC

        INC        MP0
        MOV        A,IAR0

 

以下是取出判断的完整例子

;//data init and addr init            
        MOV        A,10101010B                    ;reset aa,12,34
        MOV        VALUE1,A
        MOV        A,00010010B
        MOV        VALUE2,A
        MOV        A,00110100B
        MOV        VALUE3,A                
        MOV        A,ADDR                        ;Read data from this address
        MOV        MP0,A

;//judge data        
        MOV        A,IAR0                        ;read data for judging
        MOV        ONE,A
        SUBM    A,VALUE1
        SZ        VALUE1
        JMP        ERROR                        ;if error then out
;        
        INC        MP0
        MOV        A,IAR0
        MOV        TWO,A
        SUBM    A,VALUE2
        SZ        VALUE2
        JMP        ERROR
;        
        INC        MP0
        MOV        A,IAR0
        MOV        THREE,A
        SUBM    A,VALUE3
        SZ        VALUE3
        JMP        ERROR
        
;//ture SET FLAG BIT addr init        
        SET        TURE                        ;flag set
        MOV        A,ADDR                        ;Read data from this address
        MOV        MP0,A

 

 

具体的思路流程图如下:

以下是接收的完整代码

从机中断的时间被设置成0.01s,给了串口传输的时间,我也没把中断时间缩短,不知道是否对数据接收会有影响

#INCLUDE    HT66F3185.INC

;========================================================================================
MY_DATA    .SECTION    'DATA'            ;==DATA SECTION==
;DEL1        DB    ?
;COUNT1        DB    ?
;CONT        DB  ?
;DE1            DB    ?
;DE2            DB    ?
;DE3            DB    ?

STACK_A        DB    ?                    ;STACK BUFFER FOR ACC
STACK_PSW    DB    ?                    ;STACK BUFFER FOR PSW

COUNT        DB    ?                    ;Number of times the address was moved
TX_DATA        DB  ?                    ;SEND DATA


;Judge Storage value
VALUE        DB  ?                    
VALUE1        DB    ?
VALUE2        DB    ?
VALUE3        DB    ?

;Debug view value
ONE            DB    ?
TWO            DB    ?
THREE        DB    ?
RX_BUF      DB  ?                    ;REC  DATA
;flag bit
TURE        DB    ?
FALSE        DB    ?

;MR0 -> address
ADDR        DB    ?
;========================================================================================

MY_CODE    .SECTION    'CODE'            ;==PROGRAM SECTION==
        ORG        00H                    ;HT-66FX0 RESET VECTOR
        JMP        INIT
        ORG        10H                    ;
        JMP        ISR_STM
        ORG        2CH
        JMP        USART_ISM

;=======================================================================================
;Function name :    INIT
;Description   :     
;        @PIN_INIT                USART PIN_INIT
;        @CLOSE WDTC            Disable WDT Function   
;        @UAST_INIT                9600 8 BIT MODE 
;        @ISR_INIT              SET TIME interrupt
;========================================================================================
INIT:
;PIN_INIT
        MOV        A,00010100B
        MOV        PDS0,A        
;CLOSE WDTC
        MOV        A,10101000B                    ;Disable WDT Function
        MOV        WDTC,A
;UAST_INIT
        MOV        A,10000000B
        MOV        UCR1,A
        MOV        A,11101100B
        MOV        UCR2,A
        MOV        A,00000000B
        MOV        UCR3,A
        MOV        A,51D
        MOV        BRG,A
        
        MOV        A,00001000B
        MOV        INTC2,A
        
        SET        EMI
        SET        URE

;ISR_INIT
        SET        MF1E                        ;ENABLE STM INTERRUPT            
        SET        CTMAE                        ;ENABLE    STMCCRA COMPARE INTERRUPT
        CLR        CTMC0                        ;fINT=fSYS/4=2MHz
        MOV        A,11000001B                    ;STM IS IN THE TIMER/COUNTER MODE,
        MOV        CTMC1,A                        ;AND TP2CNT IS CLEARED BY TP2CCRA COMPARE MATCH        
        CLR        CTMAF
        CLR        MF1F
        SET        EMI                            ;ENABLE THE MASTER(GLOBAL) INTERRUPT
        
;=======================================================================================
;Function name :    MAIN
;Description   :     Variable initialization
;Parameter     :
;        @VALUE1            0XAA
;        @VALUE2            0X12   
;        @VALUE3            0X34 
;        @ADDR              Storage data address
;        @COUNT                Number of times the address was moved
;========================================================================================
MAIN:    

        CLR        TXR_RXR
        MOV        A,10101010B                    ;VALUE1=0XAA
        MOV        VALUE1,A                    
        MOV        A,00010010B                    ;VALUE2=0X12
        MOV        VALUE2,A                    
        MOV        A,00110100B                    ;VALUE3=0X34
        MOV        VALUE3,A
                                            
        MOV        A,9CH                          ;Read data from this address
        MOV        ADDR,A
        MOV        MP0,A
        CLR        IAR0
        MOV        A,0
        MOV        COUNT,A                        

;=======================================================================================
;Function name :    LOOP
;Description   :     Judge flag bit in ISR_STM to send data
;========================================================================================
LOOP:
        SZ        TURE
        JMP        TURE_SEND
        SZ        FALSE
        JMP        FALSE_SEND        

LOOP_RETURN:
        JMP        LOOP

;IF TURE SEND 0X55    
TURE_SEND:
        MOV        A,55H
        MOV        TX_DATA,A
        CALL    SEND
        CLR        TURE
        JMP        LOOP_RETURN

;IF FALSE SEND 0X60        
FALSE_SEND:
        MOV        A,11101110B
        MOV        TX_DATA,A
        CALL    SEND
        CLR        FALSE        
        JMP        LOOP_RETURN
;=======================================================================================
;Function name :    SEND
;Description   :     SEND DATA
;========================================================================================        
SEND    PROC
        MOV        A,TX_DATA
        MOV        TXR_RXR,A
REC:            
        SNZ        TIDLE
        JMP        REC        
        RET
SEND    ENDP
;=======================================================================================
;Function name :    USART_ISM
;Description   :     1.receive  5 datas and Open ISR_STM interrupt
;                    2.ISR_STM interrupt TIME is 0.01s
;========================================================================================        
USART_ISM:
        MOV        STACK_A,A                    ;PUSH ACC
        MOV        A,STATUS        
        MOV        STACK_PSW,A                    ;PUSH STATUS
        
;isr count begin and count init        
        MOV        A,20H                        ;SET ISR TIME
        MOV        CTMAL,A                
        MOV        A,4EH                    
        MOV        CTMAH,A                        ;time = 0.01s
        SET        CTON                         ;START GTPU COUNTING

;It is convenient to view the received data in RX_BUF        
        MOV        A,TXR_RXR            
        MOV        RX_BUF,A                    ;RCE BUF
        
;TXR_RXR=IAR0,Put data into address        
        MOV        IAR0,A
        INC        MP0                            ;Put data into address
        INC        COUNT

;storing 3 data
;//--  if want to store more data ,plase change 3     --//    
        MOV        A,3
        SUB        A,COUNT
        MOV        VALUE,A                        ;SEND 5 DATAS
        SZ        VALUE
;//--  If you add the following code,plase change 5  --//         
        JMP        $+5                        
        
;addr and count init        
        MOV        A,ADDR                        ;Read data from this address
        MOV        MP0,A
        MOV        A,0
        MOV        COUNT,A                        ;COUNT INIT

            
        MOV        A,STACK_PSW
        MOV        STATUS,A                    ;POP PSW
        MOV        A,STACK_A    
        RETI

;=======================================================================================
;Function name :    ISR_STM
;Description   :     Judge whether the received data is correct
;                    Set the correct and error flag bits for judgment in loop                    
;========================================================================================        
ISR_STM:
;//stop isr count
        CLR        CTON                        ;STOP STM COUNTING
        CLR        CTMAF
        
        MOV        STACK_A,A                    ;PUSH A
        MOV        A,STATUS
        MOV        STACK_PSW,A                    ;PUSH STATUS
        
;//data init and addr init            
        MOV        A,10101010B                    ;reset aa,12,34
        MOV        VALUE1,A
        MOV        A,00010010B
        MOV        VALUE2,A
        MOV        A,00110100B
        MOV        VALUE3,A                
        MOV        A,ADDR                        ;Read data from this address
        MOV        MP0,A

;//judge data        
        MOV        A,IAR0                        ;read data for judging
        MOV        ONE,A
        SUBM    A,VALUE1
        SZ        VALUE1
        JMP        ERROR                        ;if error then out
;        
        INC        MP0
        MOV        A,IAR0
        MOV        TWO,A
        SUBM    A,VALUE2
        SZ        VALUE2
        JMP        ERROR
;        
        INC        MP0
        MOV        A,IAR0
        MOV        THREE,A
        SUBM    A,VALUE3
        SZ        VALUE3
        JMP        ERROR
        
;//ture SET FLAG BIT addr init        
        SET        TURE                        ;flag set
        MOV        A,ADDR                        ;Read data from this address
        MOV        MP0,A
RETURN:     
        MOV        A,STACK_PSW
        MOV        STATUS,A                    ;POP STATUS
        MOV        A,STACK_A                    ;POP A         

        RETI
        
;//error SET FLAG BIT and addr init        
ERROR:
        SET        FALSE                        ;set error flag
        MOV        A,ADDR                        ;Read data from this address
        MOV        MP0,A
        JMP        RETURN
    


        END    

 

 

2.主机发送,判断,显示

 

主机的思路是:主机发送数据,从机发送判断的数据过来,然后主机再来判断数据,同时还有超时判断

刚开始对于超时判断思路是浑浊的。想用中断进行计时,再来判断。

但渐渐简化成,定时器计时,计满100ms的时候再把标志位置一。在与从机发送过来正确和错误的判断进行计数。

总体来说,思路比从机的简单,但繁杂的东西有点多。

先实现串口接收中断中,从机数据判断正确和错误的标志位(由于汇编没有局部变量的概念,所以一般会在函数起始位置赋value1,value2的值):

        MOV        A,55H                        ;VALUE1=0X55
        MOV        VALUE1,A                    
        MOV        A,11101110B                    ;VALUE2=0Xee
        MOV        VALUE2,A                    
        
;It is convenient to view the received data in RX_BUF        
        MOV        A,TXR_RXR            
        MOV        RX_BUF,A                    ;RCE BUF
        
        SUBM    A,VALUE1
        SNZ        VALUE1
        SET        TURE
        SUBM    A,VALUE2
        SNZ        VALUE2
        SET        FALSE

流程图如图所示:

随后是超时计数,在原有delay100ms结束的基础上,加上标志位

;=======================================================================================
;    Delay:count 100ms
;========================================================================================
DELAY    PROC
        SET        STON                        ;START COUNTING
DEL_1:    MOV        A,100                        ;DELAY 100*1ms
        MOV        DEL1,A                        ;SET COUNTER
DEL_2:    SNZ        STMAF                        ;COMPARE MATCH TM0CCRA?
        JMP        DEL_2                        ;NO,WAIT!
        CLR        STMAF                        ;YES,100mS IS OVER
        SDZ        DEL1                        ;IS 1 SEC OVER?
        JMP        DEL_2                        ;NO
        
;SET complete bit
        SET        complete
        
        CLR        STON                        ;YES,STOP STPU
        RET
DELAY    ENDP

这时超时标志位和正确错误的标志位都有了,接下来在主循环中进行发送数据(6~14),调用delay进行判断(19~21)。

具体思路流程图如图:

代码如下所示:

 1 LOOP:
 2         CLR        LED_PORT.6
 3         CLR        LED_PORT.5
 4 ;-------------------------------
 5 ;SEND OXAA,OX12,0X34        
 6         MOV        A,10101010B            
 7         MOV        TX_DATA,A
 8         CALL    SEND
 9         MOV        A,00010010B
10         MOV        TX_DATA,A
11         CALL    SEND
12         MOV        A,00110100B
13         MOV        TX_DATA,A
14         CALL    SEND
15 ;-------------------------------
16 ;DELAY have complete flag
17 ;when delay has done, complete set 1
18 
19         CALL    DELAY
20         SZ        complete                    ;JUDGE 100ms is complete
21         JMP        JUDGE
22 
23         
24 LOOP_RETURN:
25         JMP        LOOP
26         
27 ;-------------------------------
28 ;when delay has done ,run judge
29 ;ture and false flag in usart_ism,they used to judge right,wrong and overtime situation    
30 JUDGE:33 
34         CLR        complete            
35         SZ        TURE
36         JMP        TURE_SEND                    ;right situation
37         SZ        FALSE
38         JMP        FALSE_SEND                    ;wrong    situation
39         JMP        FALSE_SEND                    ;overtime situation

后面若是用串口进行判断,TURE_SEND/FALSE_SEND可以用串口发送数据。(测试的时候,可以使用,注销的UART SEND DATA,记得清除正确和错误的标志位)

但我们要求是用数码管显示数据,汇编中没有乘除,无法对16进制转化成十进制

所以进行了重新计数,计个位满9,十位加一。

 

具体思路流程图如下:

我中断里设置one是个位,two是十位。测试的时候发现正确切换错误的显示的时候,十位未改变,所以会在局部变量后面对two赋值。

之前没加

;if one bit==9, one bit=0 ,以下的3句代码的时候,会出现计数记到9后直接变成1.
这是由于0~9,判断为0的时候,跳出循环,再次进入函数的时候,0会变成1.
最后加了;if one bit==9, one bit=0 ,以下的3句代码,给0一点缓冲时间。

 

;IF TURE SEND 0X55,SEG DISPLAY TUREVALUE
TURE_SEND:
        SET        LED_PORT.6                    ;LED4 ON
;UART SEND DATA
;        MOV        A,TURETIME
;        MOV        TX_DATA,A
;        CALL    SEND
        CLR        TURE

;Local variables init        
        MOV        A,10
        MOV        VALUE3,A
        MOV        VALUE4,A
;when wrong change right, ten display need change 
        MOV        A,TURETIMETEN
        MOV        TWO,A
        
;one bit ++
        INC        TURETIME
        MOV        A,TURETIME
        MOV        ONE,A
        SUBM    A,VALUE3
        SZ      VALUE3
        JMP        LOOP_RETURN
        
;if one bit==9, one bit=0        
        CLR        TURETIME
        MOV        A,TURETIME
        MOV        ONE,A
    
;ten bit ++        
        INC        TURETIMETEN
        MOV        A,TURETIMETEN
        MOV        TWO,A
        SUBM    A,VALUE4
        SZ        VALUE4
        JMP        LOOP_RETURN    

;if ten bit == 9 ,ten bit=0        
        CLR        TURETIMETEN    
        MOV        A,TURETIMETEN
        MOV        TWO,A
        JMP        LOOP_RETURN

;---------------------------------------                
;IF FALSE SEND 0X60    ,SEG DISPLAY FLASEVALUE    
FALSE_SEND:
    
        SET        LED_PORT.5                    ;LED3 ON
        
;use in test 
;UART SEND DATA
;        MOV        A,FALSETIME
;        MOV        TX_DATA,A
;        CALL    SEND
        CLR        FALSE
        
;Local variables init        
        MOV        A,10
        MOV        VALUE3,A
        MOV        VALUE4,A
;when right change wrong , ten display need change 
        MOV        A,FALSETIMETEN
        MOV        TWO,A            

;one bit ++        
        INC        FALSETIME
        MOV        A,FALSETIME
        MOV        ONE,A                        ;DISPLAY ONE VALUE
        SUBM    A,VALUE3    
        SZ         VALUE3
        JMP        LOOP_RETURN

;if one bit==9,onebit=0            
        CLR        FALSETIME
        MOV        A,FALSETIME                    ;FALSETIME = 0
        MOV        ONE,A                        ;DISPLAY ONE VALUE

;ten bit ++        
        INC        FALSETIMETEN
        MOV        A,FALSETIMETEN
        MOV        TWO,A
        SUBM    A,VALUE4
        SZ        VALUE4
        JMP        LOOP_RETURN    

;if ten bit == 9 ,tenbit=0                
        CLR        FALSETIMETEN
        MOV        A,FALSETIMETEN                ;FALSETIMETEN  = 0
        MOV        TWO,A                        ;DISPLAY TEN VALUE
        JMP        LOOP_RETURN

加上原先写好的中断显示

;========================================================================================
;        STM INTERRUPT SERVICE ROUTINE
;========================================================================================
ISR_STM:

        CLR        CTON                        ;STOP STM COUNTING
        CLR        CTMAF
        
        MOV        STACK_A,A                    ;PUSH A
        MOV        A,STATUS
        MOV        STACK_PSW,A                    ;PUSH STATUS
                
;ONE:
        SET        PAC1
        CALL    DISPLAYONE
        CLR        PAC3
;        INC        CONT
        MOV        A,3
        CALL    DELAY1
     
;TEN:
        SET        PAC3     
        CALL    DISPLAYTEN

        SET        CTON                        ;START GTPU COUNTING         
        MOV        A,STACK_PSW
        MOV        STATUS,A                    ;POP STATUS
        MOV        A,STACK_A                    ;POP A         

        RETI
;========================================================================================
;SEG_DISPLAY    
;========================================================================================
DISPLAYONE    PROC
            TABRDL    SEG_PORT                ;READ TABLE AND SEND TO SEG_PORT
;ARRAY++    0~9
             MOV        A,ONE
            MOV        TBLP,A                        

            RETI        
DISPLAYONE    ENDP


DISPLAYTEN    PROC
            TABRDL    SEG_PORT                ;READ TABLE AND SEND TO SEG_PORT
;ARRAY++    0~9                                ;NO PLACE DISPLAY,BECAUSE TBLP=9
            MOV        A,TWO
            MOV        TBLP,A
            CLR        PAC1

            RETI        
DISPLAYTEN    ENDP

 

初始化不细究,只能看数据手册。

发送的全部代码如下所示

led5,6是为了清楚辨识正确还是错误,所添加的,若不需要可以去掉

;LED_INIT

CLR LED_PORT.6

CLR LED_PORT.5
SET        LED_PORT.5                    ;LED3 ON
SET        LED_PORT.6                    ;LED4 ON
 
#INCLUDE    HT66F3185.INC

;========================================================================================
MY_DATA    .SECTION    'DATA'            ;==DATA SECTION==


TX_DATA        DB  ?                    ;SEND DATA

TURETIME    DB    ?
TURETIMETEN    DB    ?
FALSETIME    DB    ?
FALSETIMETEN    DB    ?

;DELAY(TIM) VALUE
DEL1        DB    ?
;DELAY1 VALUE
DE1            DB    ?
DE2            DB    ?
DE3            DB    ?
;ISM Storage value
STACK_A        DB    ?                    ;STACK BUFFER FOR ACC
STACK_PSW    DB    ?                    ;STACK BUFFER FOR PSW


;Judge Storage value                    
VALUE1        DB    ?
VALUE2        DB    ?
VALUE3        DB    ?
VALUE4        DB    ?

;Debug view value
ONE            DB    ?
TWO            DB    ?
THREE        DB    ?
RX_BUF      DB  ?                    ;RECVICE  DATA

;flag bit
TURE        DB    ?
FALSE        DB    ?
complete    DB    ?


SEG_PORT    EQU    PB
SEG_PORTB    EQU    PBC
LED_PORT      EQU    PC                    ;DEFINE LED_PORT CONTROL REG.  
LED_PORTC      EQU    PCC                    ;DEFINE LED_PORT CONTROL REG
;========================================================================================

MY_CODE    .SECTION    'CODE'            ;==PROGRAM SECTION==
        ORG        00H                    ;HT-66FX0 RESET VECTOR
        JMP        INIT
        ORG        10H                    ;ISR_ADD
        JMP        ISR_STM
        ORG        2CH
        JMP        USART_ISM

;=======================================================================================
;Function name :    INIT
;Description   :     
;        @PIN_INIT                USART PIN_INIT
;        @CLOSE WDTC            Disable WDT Function   
;        @UAST_INIT                9600 8 BIT MODE 
;        @ISR_INIT              SET seg_TIME interrupt
;========================================================================================
INIT:
;PIN_INIT
        MOV        A,00010100B
        MOV        PDS0,A    
        MOV        A,00h                        ;CP1 DISABLE
        MOV        CMPC,A
        MOV        A,00h                        ;CP1 DISABLE
        MOV        PAS0,A
        SET        PAC3
         CLR        PAC2
        CLR        SEG_PORTB                    ;CONFIG SEG_PORT AS OUTPUT MODE    
        
;CLOSE WDTC
        MOV        A,10101000B                    ;Disable WDT Function
        MOV        WDTC,A
;UAST_INIT
        MOV        A,10000000B
        MOV        UCR1,A
        MOV        A,11101100B
        MOV        UCR2,A
        MOV        A,00000000B
        MOV        UCR3,A
        MOV        A,51D
        MOV        BRG,A
        
        MOV        A,00001000B
        MOV        INTC2,A
        
        SET        EMI
        SET        URE
;TIM _init    1MS
        MOV        A,00000000B                    ;STOP CTM, T0CK[2:0]=010
        MOV        STMC0,A                        ;fINT=fH(fSYS/4) (8MHz/4)
        MOV        A,11000001B                    ;CONFIG CTM IN TIMER/COUNTER MODE             
        MOV        STMC1,A                        ;TM0D IS CLEARED BY TM0CCRA MATCH
        MOV        A,LOW 2000                    ;1ms (2000/fINT)
        MOV        STMAL,A                        ;SET TM0CCRA VALUE LO-BYTE
        MOV        A,HIGH 2000
        MOV        STMAH,A                        ;SET TM0CCRA VALUE HI-BYTE
;ISR_INIT
        SET        MF1E                        ;ENABLE STM INTERRUPT            
        SET        CTMAE                        ;ENABLE    STMCCRA COMPARE INTERRUPT
        CLR        CTMC0                        ;fINT=fSYS/4=2MHz
        MOV        A,11000001B                    ;STM IS IN THE TIMER/COUNTER MODE,
        MOV        CTMC1,A                        ;AND TP2CNT IS CLEARED BY TP2CCRA COMPARE MATCH        
        CLR        CTMAF
        CLR        MF1F
        SET        EMI                            ;ENABLE THE MASTER(GLOBAL) INTERRUPT
        
        MOV        A,20H                        ;SET ISR TIME
        MOV        CTMAL,A                
        MOV        A,4EH
        MOV        CTMAH,A                        ;
        SET        CTON                         ;START GTPU COUNTING

;LED_INIT
        MOV        A,00h                        ;CP1 DISABLE
        MOV        CMPC,A
        CLR        LED_PORTC                      ;CONFIG LED_PORT AS O/P MODE 
        CLR        LED_PORT                       ;SET INITIAL LED STATE
        SET        C                              ;SET CARRY FLAG (STATUS.0)                
;=======================================================================================
;Function name :    MAIN
;Description   :     Variable initialization
;Parameter     :
;========================================================================================
MAIN:    
        MOV        A,70
        MOV        A,OFFSET TAB_7_SEG
        MOV        TBLP,A
;        MOV        A,10011010B
        CLR        TXR_RXR

        MOV        A,55H                        ;VALUE1=0X55
        MOV        VALUE1,A                    
        MOV        A,11101110B                    ;VALUE2=0Xee
        MOV        VALUE2,A                    

        MOV        A,0
        MOV        complete,A                    
        MOV        TURETIME,A
        MOV        FALSETIME,A
        MOV        TURETIMETEN,A
        MOV        FALSETIMETEN,A
        MOV        ONE,A
        MOV        TWO,A
        MOV        A,10
        MOV        VALUE3,A
        MOV        VALUE4,A
        
;=======================================================================================
;Function name :    LOOP
;Description   :     Judge flag bit in ISR_STM to send data
;========================================================================================
LOOP:
        CLR        LED_PORT.6
        CLR        LED_PORT.5
;-------------------------------
;SEND OXAA,OX12,0X34        
        MOV        A,10101010B            
        MOV        TX_DATA,A
        CALL    SEND
        MOV        A,00010010B
        MOV        TX_DATA,A
        CALL    SEND
        MOV        A,00110100B
        MOV        TX_DATA,A
        CALL    SEND
;-------------------------------
;DELAY have complete flag
;when delay has done, complete set 1

        CALL    DELAY
        SZ        complete                    ;JUDGE 100ms is complete
        JMP        JUDGE

        
LOOP_RETURN:
        JMP        LOOP
        
;-------------------------------
;when delay has done ,run judge
;ture and false flag in usart_ism,they used to judge right,wrong and overtime situation    
JUDGE:
        MOV        A,ONE
        MOV        A,TWO

        CLR        complete            
        SZ        TURE
        JMP        TURE_SEND                    ;right situation
        SZ        FALSE
        JMP        FALSE_SEND                    ;wrong    situation
        JMP        FALSE_SEND                    ;overtime situation

;-------------------------------
;IF TURE SEND 0X55,SEG DISPLAY TUREVALUE
TURE_SEND:
        SET        LED_PORT.6                    ;LED4 ON
;UART SEND DATA
;        MOV        A,TURETIME
;        MOV        TX_DATA,A
;        CALL    SEND
        CLR        TURE

;Local variables init        
        MOV        A,10
        MOV        VALUE3,A
        MOV        VALUE4,A
;when wrong change right, ten display need change 
        MOV        A,TURETIMETEN
        MOV        TWO,A
        
;one bit ++
        INC        TURETIME
        MOV        A,TURETIME
        MOV        ONE,A
        SUBM    A,VALUE3
        SZ      VALUE3
        JMP        LOOP_RETURN
        
;if one bit==9, one bit=0        
        CLR        TURETIME
        MOV        A,TURETIME
        MOV        ONE,A
    
;ten bit ++        
        INC        TURETIMETEN
        MOV        A,TURETIMETEN
        MOV        TWO,A
        SUBM    A,VALUE4
        SZ        VALUE4
        JMP        LOOP_RETURN    

;if ten bit == 9 ,ten bit=0        
        CLR        TURETIMETEN    
        MOV        A,TURETIMETEN
        MOV        TWO,A
        JMP        LOOP_RETURN

;---------------------------------------                
;IF FALSE SEND 0X60    ,SEG DISPLAY FLASEVALUE    
FALSE_SEND:
    
        SET        LED_PORT.5                    ;LED3 ON
        
;use in test 
;UART SEND DATA
;        MOV        A,FALSETIME
;        MOV        TX_DATA,A
;        CALL    SEND
        CLR        FALSE
        
;Local variables init        
        MOV        A,10
        MOV        VALUE3,A
        MOV        VALUE4,A
;when right change wrong , ten display need change 
        MOV        A,FALSETIMETEN
        MOV        TWO,A            

;one bit ++        
        INC        FALSETIME
        MOV        A,FALSETIME
        MOV        ONE,A                        ;DISPLAY ONE VALUE
        SUBM    A,VALUE3    
        SZ         VALUE3
        JMP        LOOP_RETURN

;if one bit==9,onebit=0            
        CLR        FALSETIME
        MOV        A,FALSETIME                    ;FALSETIME = 0
        MOV        ONE,A                        ;DISPLAY ONE VALUE

;ten bit ++        
        INC        FALSETIMETEN
        MOV        A,FALSETIMETEN
        MOV        TWO,A
        SUBM    A,VALUE4
        SZ        VALUE4
        JMP        LOOP_RETURN    

;if ten bit == 9 ,tenbit=0                
        CLR        FALSETIMETEN
        MOV        A,FALSETIMETEN                ;FALSETIMETEN  = 0
        MOV        TWO,A                        ;DISPLAY TEN VALUE
        JMP        LOOP_RETURN
        
                            
;=======================================================================================
;Function name :    SEND
;Description   :     SEND DATA
;========================================================================================        
SEND    PROC

        MOV        A,TX_DATA
        MOV        TXR_RXR,A            
REC:                                        ;UNTIL DATA COMPLETE SENDED
        SNZ        TIDLE
        JMP        REC    
            
        RET
        
SEND    ENDP

;=======================================================================================
;Function name :    USART_ISM
;Description   :     1.receive  2 datas and set ture false bit
;
;========================================================================================        
USART_ISM:
        MOV        STACK_A,A                    ;PUSH ACC
        MOV        A,STATUS        
        MOV        STACK_PSW,A                    ;PUSH STATUS
        
        MOV        A,55H                        ;VALUE1=0X55
        MOV        VALUE1,A                    
        MOV        A,11101110B                    ;VALUE2=0Xee
        MOV        VALUE2,A                    
        
;It is convenient to view the received data in RX_BUF        
        MOV        A,TXR_RXR            
        MOV        RX_BUF,A                    ;RCE BUF
        
        SUBM    A,VALUE1
        SNZ        VALUE1
        SET        TURE
        SUBM    A,VALUE2
        SNZ        VALUE2
        SET        FALSE

        MOV        A,STACK_PSW
        MOV        STATUS,A                    ;POP PSW
        MOV        A,STACK_A    
        RETI
;========================================================================================
;        STM INTERRUPT SERVICE ROUTINE
;========================================================================================
ISR_STM:

        CLR        CTON                        ;STOP STM COUNTING
        CLR        CTMAF
        
        MOV        STACK_A,A                    ;PUSH A
        MOV        A,STATUS
        MOV        STACK_PSW,A                    ;PUSH STATUS
                
;ONE:
        SET        PAC1
        CALL    DISPLAYONE
        CLR        PAC3
;        INC        CONT
        MOV        A,3
        CALL    DELAY1
     
;TEN:
        SET        PAC3     
        CALL    DISPLAYTEN

        SET        CTON                        ;START GTPU COUNTING         
        MOV        A,STACK_PSW
        MOV        STATUS,A                    ;POP STATUS
        MOV        A,STACK_A                    ;POP A         

        RETI
;========================================================================================
;SEG_DISPLAY    
;========================================================================================
DISPLAYONE    PROC
            TABRDL    SEG_PORT                ;READ TABLE AND SEND TO SEG_PORT
;ARRAY++    0~9
             MOV        A,ONE
            MOV        TBLP,A                        

            RETI        
DISPLAYONE    ENDP


DISPLAYTEN    PROC
            TABRDL    SEG_PORT                ;READ TABLE AND SEND TO SEG_PORT
;ARRAY++    0~9                                ;NO PLACE DISPLAY,BECAUSE TBLP=9
            MOV        A,TWO
            MOV        TBLP,A
            CLR        PAC1

            RETI        
DISPLAYTEN    ENDP            
;=======================================================================================
;    Delay:count 100ms
;========================================================================================
DELAY    PROC
        SET        STON                        ;START COUNTING
DEL_1:    MOV        A,100                        ;DELAY 100*1ms
        MOV        DEL1,A                        ;SET COUNTER
DEL_2:    SNZ        STMAF                        ;COMPARE MATCH TM0CCRA?
        JMP        DEL_2                        ;NO,WAIT!
        CLR        STMAF                        ;YES,100mS IS OVER
        SDZ        DEL1                        ;IS 1 SEC OVER?
        JMP        DEL_2                        ;NO
        
;SET complete bit
        SET        complete
        
        CLR        STON                        ;YES,STOP STPU
        RET
DELAY    ENDP
;========================================================================================
;    Delay1
;========================================================================================
DELAY1    PROC
        MOV        DE1,A                        ;SET DEL1 COUNTER    
DE_1:   MOV        A,30                                           
        MOV        DE2,A                        ;SET DEL2 COUNTER 
DE_2:    MOV        A,110
        MOV        DE3,A                        ;SET DEL3 COUNTER
DE_3:    SDZ        DE3                          ;DEL3 DOWN COUNT
        JMP        DE_3                      
        SDZ        DE2                          ;DEL2 DOWN COUNT
        JMP        DE_2                   
        SDZ        DE1                            ;DEL1 DOWN COUNT
        JMP        DE_1
        RET
DELAY1    ENDP

        ORG        LASTPAGE                    ;LASTPAGE

;========================================================================================
TAB_7_SEG:
        DC      0C0h                             ;7 SEG CODE FOR CC TYPE LED 
        DC        0F9h                         ;CONNECT BIT 0~7 FOR SEGMENT A
        DC        0A4h                          ;LOW-BYTE FOR 7 SEG DISPLAY CO
        DC         0B0h                        
        DC         099h
        DC        092h 
        DC         082h
        DC         0F8h 
        DC         080h
        DC         090h 
;========================================================================================

        END    

 以上,只想吐槽一个,编译器很不喜欢,不能注释。

posted @ 2022-01-18 11:24  明语  阅读(467)  评论(0编辑  收藏  举报