zoukankan      html  css  js  c++  java
  • 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    

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

  • 相关阅读:
    布隆过滤器
    django-redis 和 vue 实现的购物车
    富文本编辑器
    django 和 七牛云 交互
    django 提供的加密算法
    DRF mixins 的常用方法
    Python笔记5(作业)
    Python笔记5(random&sys&os模块)
    Python笔记5(collections模块)
    Python笔记5(时间模块)
  • 原文地址:https://www.cnblogs.com/action0/p/15814538.html
Copyright © 2011-2022 走看看