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
以上,只想吐槽一个,编译器很不喜欢,不能注释。