;; ****************************************************
; * Filename : HT6221.ASM *
; * Function : 23:21 2011-7-1 *
; * MICroprocessor : HT46R47/18DIP *
; * Crystal : 4MHz *
; *****************************************************
; ___________
; PA3/PFD---| |-----PA4/TMR
; PA2-------| |-----PA5/ /INT
; PA1-------| |-----PA6
; PA0-------| |-----PA7
; PB3/AN3---| |-----OSC2
; PB2/AN2---| |-----OSC1
; PB1/AN1---| |-----VDD
; PB0/AN0---| |-----/RES
; VSS-------| |-----PD0/PWM
; ___________
; HT46R47
;******************************************************
#include HT46R47.INC ;
;******************************************************
DATA .SECTION ’DATA’ ;
R11 EQU [40H] ;
R22 EQU [41H] ;
AD_DL EQU [42H] ;
AD_DM EQU [43H] ;
AD_DH EQU [44H] ;
TEMP EQU [45H] ;
BIT_CNT EQU [46H] ;
TIME_CNT EQU [47H] ;
CNT0 EQU [48H] ;
CSR0 EQU [49H] ;
CSR1 EQU [4AH] ;
CSR2 EQU [4BH] ;
CSR3 EQU [4CH] ;
INT_ACC EQU [4DH] ;
SEC1_CNT EQU [4EH] ;
SEC2_CNT EQU [4FH] ;
;--------------------------------
FLAG1 EQU [50H] ;
B_BEGIN EQU FLAG1.0 ;
B_REC_OK EQU FLAG1.1 ;
B_KEY_WORK EQU FLAG1.2 ;
B_DP1 EQU FLAG1.3 ;
B_DP2 EQU FLAG1.4 ;
B_KEY EQU FLAG1.5 ;
B_KEY_OK EQU FLAG1.6 ;
B_DISP_E EQU FLAG1.7 ;
;--------------------------------
K_ION EQU PA.0 ;
K_TIMER EQU PA.1 ;
K_RH EQU PA.2 ;
K_ONOFF EQU PA.3 ;
;---------------------------------
;K_ION EQU KEY_TEMP.0 ;
;K_TIMER EQU KEY_TEMP.1 ;
;K_RH EQU KEY_TEMP.2 ;
;K_ONOFF EQU KEY_TEMP.3 ;
;---------------------------------
WORK_TMR0 EQU [51H] ;
WORK_TMR1 EQU [52H] ;
KEY_BUF EQU [53H] ;
KEY_TEMP EQU [54H] ;
TIMER_LOW_CNT EQU [55H] ;
TIMER_HI_CNT EQU [56H] ;
RH_LOW_CNT EQU [57H] ;
RH_HI_CNT EQU [58H] ;
ONOFF_LOW_CNT EQU [59H] ;
ONOFF_HI_CNT EQU [5AH] ;
CNT1 EQU [5BH] ;
CNT2 EQU [5CH] ;
BUF1 EQU [5DH] ;
BUF2 EQU [5EH] ;
BUF3 EQU [5FH] ;
BUF EQU [60H] ;
;----------------------------------
KEY_SAVE EQU [61H] ;
KEY_SAVE0 EQU [62H] ;
KEY_SAVE1 EQU [63H] ;
KEY_DELAY EQU [64H] ;
KEY_DELAY1 EQU [69H] ;
BUF1A EQU [65H] ;
BUF2A EQU [66H] ;
BUF3A EQU [67H] ;
DISP_BIT EQU [68H] ;
KEY_VALUE EQU [6AH] ;
;***********************************
CODE .SECTION AT 00H ’CODE’
ORG 00H ;
JMP START1 ;
ORG 04H ;INT中断入口
JMP ACCEPT_INT ;
ORG 08H ;定时/计数器中断入口
JMP ACCEPT_TMR0 ;
ORG 0CH ;A/D转换中断入口
RETI ;
;---------------------------------
START1:
CALL RAM_CLR ;
MOV A,00100000B ;
MOV PAC,A ;
MOV PA,A ;PA0--PA7=输出
MOV A,00000000B ;
MOV PBC,A ;PB0--PB3=输入
MOV PB,A ;
;--------------------------------
MOV A,10000010B ;Fsys/2 定时器方式 TMRC.4=TON=0关定时/计时器
MOV TMRC,A ;
MOV A,00H ;
MOV ADCR,A ;PCR2,PCR1,PCR0=0为数字I/O口
MOV A,01H ;
MOV ACSR,A ;SYS/8
MOV A,156 ;初值206
MOV TMR,A ;100us*{(Fint=Fsys/4) [系统时间=1/(4M/4)=1]}=100us中断
SET TMRC.4 ;开定时/计时器
MOV A,07H ;开总中断,开外部中断,开定时器中断
MOV INTC,A ;
MOV A,32 ;
MOV BIT_CNT,A ;
MOV A,0FFH ;
MOV KEY_VALUE,A ;
CLR B_DISP_E ;
; MOV A,02H ;
; MOV BUF1,A ;
; MOV BUF2,A ;
; MOV BUF3,A ;
; SET BUF2 ;
; SET BUF3 ;
SET B_DISP_E ;
;***********************************
;***********************************
LOOP_MAIN:
CLR WDT ;
CALL KEY_TEST ;
;-----------------------------------
; MOV A,0FFH ;
; XOR A,KEY_VALUE ;
; SZ Z ;
; JMP LOOP_MAIN ;
;-----------------------------------
; MOV A,01H ;
; XOR A,KEY_VALUE ;
; SNZ Z ;
; JMP LOOP_MAIN ;
; CLR B_DISP_E ;
; MOV A,01H ;
; XORM A,BUF1 ;
; SET B_DISP_E ;
JMP LOOP_MAIN ;
;**********************************
;**********************************
KEY_TEST:
SZ KEY_SAVE1 ;
JMP $+2 ;
RET ;
MOV A,07H ;
XOR A,KEY_SAVE1 ;
SZ Z ;
JMP ONOFF_1 ;
MOV A,0BH ;
XOR A,KEY_SAVE1 ;
SZ Z ;
JMP RH_1 ;
MOV A,0DH ;
XOR A,KEY_SAVE1 ;
SZ Z ;
JMP TIMER_1 ;
MOV A,0EH ;
XOR A,KEY_SAVE1 ;
SZ Z ;
JMP ION_1 ;
;===================================
MOV A,0FFH ;
MOV KEY_VALUE,A ;
KEY_OUT:
CLR KEY_SAVE1 ;
RET ;
;==================================
ONOFF_1:
MOV A,01H ;
MOV KEY_VALUE,A ;
CLR B_DISP_E ;
MOV A,01H ;
XORM A,BUF1 ;
SET B_DISP_E ;
JMP KEY_OUT ;
;=====================================
RH_1:
MOV A,02H ;
MOV KEY_VALUE,A ;
CLR B_DISP_E ;
MOV A,01H ;
XORM A,BUF2 ;
SET B_DISP_E ;
JMP KEY_OUT ;
;======================================
TIMER_1:
MOV A,03H ;
MOV KEY_VALUE,A ;
CLR B_DISP_E ;
CLR BUF1 ;
CLR BUF2 ;
CLR BUF3 ;
SET B_DISP_E ;
JMP KEY_OUT ;
;=====================================
ION_1:
MOV A,04H ;
MOV KEY_VALUE,A ;
CLR B_DISP_E ;
SET BUF1 ;
SET BUF2 ;
SET BUF3 ;
SET B_DISP_E ;
JMP KEY_OUT ;
;*************************************
;**********************************
ACCEPT_TMR0:
INC TIME_CNT ;
CLR INTC.5 ;
MOV A,156 ;初值156
MOV TMR,A ;100us*1=100us中断
INC WORK_TMR0 ;
MOV A,10 ;10*100US=1MS
SUB A,WORK_TMR0 ;
SZ C ;
JMP KEY_EXIT ;
CLR WORK_TMR0 ;
INC WORK_TMR1 ;
MOV A,6 ;6*1MS=6MS
SUB A,WORK_TMR1 ;
SZ C ;
JMP DISP_SCAN ;
CLR WORK_TMR1 ;
;==================================
KEY_SCAN:
SZ B_KEY_OK ;
JMP KEY_WAIT ;
;==================================
MOV A,00100000B ;
MOV PAC,A ;
MOV A,2FH ;
MOV PA,A ;
CLR PB.2 ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
MOV A,00101111B ;
MOV PAC,A ;
MOV PA,A ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
MOV A,PA ;
AND A,0FH ;
MOV KEY_SAVE,A ;
MOV A,0FH ;
XOR A,KEY_SAVE ;
SNZ Z ;KEY_BUF=0FH Z=1 KEY_BUF不等于0FH Z=0
JMP KEY_SCAN0 ;
CLR KEY_SAVE ;
CLR KEY_SAVE0 ;
JMP KEY_EXIT ;
;===================================
KEY_SCAN0:
MOV A,00100000B ;
MOV PAC,A ;
MOV A,2FH ;
MOV PA,A ;
CLR PB.2 ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
MOV A,00101111B ;
MOV PAC,A ;
MOV PA,A ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
MOV A,PA ;
AND A,0FH ;
MOV KEY_SAVE0,A ;
MOV A,0FH ;
XOR A,KEY_SAVE0 ;
SNZ Z ;
JMP KEY_SCAN1 ;
CLR KEY_SAVE ;
CLR KEY_SAVE0 ;
JMP KEY_EXIT ;
;===================================
KEY_WAIT:
MOV A,00100000B ;
MOV PAC,A ;
MOV A,2FH ;
MOV PA,A ;
CLR PB.2 ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
MOV A,00101111B ;
MOV PAC,A ;
MOV PA,A ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
MOV A,PA ;
AND A,0FH ;
MOV KEY_SAVE,A ;
MOV A,0FH ;
XOR A,KEY_SAVE ;
SNZ Z ;KEY_BUF=0FH Z=1 KEY_BUF不等于0FH Z=0
JMP KEY_SCAN2 ;
;---------------------------------
KEY_SCANA:
INC KEY_DELAY1 ;
MOV A,3 ;3*5MS=15MS
SUB A,KEY_DELAY1 ;
SZ C ;
JMP KEY_SCAN2 ;
CLR KEY_DELAY1 ;
CLR B_KEY_OK ;
MOV A,KEY_SAVE0 ;
MOV KEY_SAVE1,A ;
JMP KEY_SCAN2 ;
;==================================
KEY_SCAN1:
MOV A,KEY_SAVE ;
XOR A,KEY_SAVE0 ;
SNZ Z ;
JMP KEY_SCAN2 ;
INC KEY_DELAY ;
MOV A,6 ;6*5MS=30MS
SUB A,KEY_DELAY ;
SZ C ;
JMP KEY_EXIT ;
SET B_KEY_OK ;
CLR KEY_SAVE ;
CLR KEY_SAVE1 ;
;==================================
KEY_SCAN2:
CLR KEY_DELAY ;
KEY_EXIT:
MOV A,00100000B ;
MOV PAC,A ;
RETI ;
;=================================
;=================================
DISP_SCAN:
MOV A,00100000B ;
MOV PAC,A ;
MOV A,0FH ;
MOV PA,A ;
SNZ B_DISP_E ;
JMP DISP_SCAN0 ;
CLR B_DISP_E ;
MOV A,BUF1 ;更新显示数据
MOV BUF1A,A ;
MOV A,BUF2 ;
MOV BUF2A,A ;
MOV A,BUF3 ;
MOV BUF3A,A ;
DISP_SCAN0:
MOV A,DISP_BIT ;
ADDM A,PCL ;
JMP DISP_COM1 ;
JMP DISP_COM2 ;
JMP DISP_COM3 ;
DISP_COM1:
MOV A,BUF1A ;
AND A,0FH ;
MOV PA,A ;
SET PA.4 ;
JMP DISP_COM ;
DISP_COM2:
MOV A,BUF2A ;
AND A,0FH ;
MOV PA,A ;
SET PA.6 ;
JMP DISP_COM ;
DISP_COM3:
MOV A,BUF3A ;
AND A,0FH ;
MOV PA,A ;
SET PB.2 ;
JMP DISP_COM ;
DISP_COM:
INC DISP_BIT ;
NOP ;
MOV A,3 ;
SUB A,DISP_BIT ;
SZ C ;
JMP KEY_EXIT ;
CLR DISP_BIT ;
JMP KEY_EXIT ;
;*********************************
;*********************************
ACCEPT_INT:
MOV INT_ACC,A ;
CLR INTC.4 ;清INT中断标志位
CLR INTC.0 ;关总中断
CLR TMRC.4 ;关定时/计时器
MOV A,TIME_CNT ;
MOV CNT0,A ;
CLR TIME_CNT ;
;---------------------------------
SZ B_BEGIN ;
JMP BIT_0 ;
MOV A,125 ;125*100US=12.5MS
SUB A,CNT0 ;
SZ C ;
JMP INT_EXIT ;
MOV A,145 ;145*100US=14.5MS
SUB A,CNT0 ;A > CNT0 C=1 A < CNT0 C=0
SNZ C ;
JMP INT_EXIT ;
SET B_BEGIN ;
CLR TIME_CNT ;
CLR CNT0 ;
JMP INT_EXIT ;
;==================================
BIT_0:
MOV A,8 ;data 值小于100μs*8=800μs 判断错误
SUB A,CNT0 ;
SZ C ;
JMP INT_ERR ;
MOV A,26 ;data 值大于100μs*26=2.6ms 判断错误
SUB A,CNT0 ;A-CNT0 无借位 C=1 有借位 C=0
SNZ C ;
JMP INT_ERR ;
MOV A,CNT0 ;data 值大于100μs*16=1.6ms c=1, data=1
SUB A,16 ;data 值小于100μs*16=1.6ms c=0, data=0
;---------------------------------
RRC CSR3 ;
RRC CSR2 ;
RRC CSR1 ;
RRC CSR0 ;
SDZ BIT_CNT ;
JMP INT_EXIT ;
SET B_REC_OK ;
MOV A,32 ;
MOV BIT_CNT,A ;
;----------------------------------
CLR B_DISP_E ;
MOV A,01H ;
XORM A,BUF2 ;
SET B_DISP_E ;
;----------------------------------
INT_ERR:
CLR B_BEGIN ;
INT_EXIT:
MOV A,156 ;初值156
MOV TMR,A ;100us*1=100us中断
MOV A,INT_ACC ;
SET TMRC.4 ;开定时/计时器
SET INTC.0 ;开总中断
RETI ;
;**********************************
;**********************************
RES_AD:
CLR INTC.0 ;关总中断
CLR INTC.3 ;A/D中断控制位EADI
MOV A,00001000B ;
MOV ADCR,A ;PB0/AN0湿度检测口 PB1--PB3=0为数字I/O口
MOV A,01H ;
MOV ACSR,A ;SYS/8
;---------------------------------
CLR ADCR.7 ;
NOP ;
SET ADCR.7 ;ADCR.7=START
NOP ;
CLR ADCR.7 ;
AD_LOOP:
NOP ;
NOP ;
SZ ADCR.6 ;ADCR.6=EOR
JMP AD_LOOP ;
;---------------------------------
CLR INTC.6 ;ADF转换中断请求位
MOV A,ADRH ;
MOV AD_DL,A ;
MOV AD_DM,A ;
RL AD_DL ;高位左移一位
MOV A,0FEH ;
ANDM A,AD_DL ;
;---------------------------------
MOV A,ADRL ;低位数据右移7位
MOV AD_DH,A ;
RR AD_DH ;
RR AD_DH ;
RR AD_DH ;
RR AD_DH ;
RR AD_DH ;
RR AD_DH ;
RR AD_DH ;
MOV A,01H ;
AND A,AD_DH ;
OR A,AD_DL ;
MOV AD_DL,A ;D0-D7数据
;---------------------------------
RR AD_DM ;高位右移7位
RR AD_DM ;
RR AD_DM ;
RR AD_DM ;
RR AD_DM ;
RR AD_DM ;
RR AD_DM ;
MOV A,01H ;
AND A,AD_DM ;
MOV AD_DH,A ;D8高位数据
CLR AD_DM ;
CLR ADCR.7 ;
SET ADCR.7 ;
SET INTC.0 ;开总中断
NOP ;
RET ;
;**********************************
;**********************************
RAM_CLR PROC ;
MOV A,40H ;
MOV MP0,A ;
MOV A,64 ;
MOV TEMP,A ;
RAM_CLR1:
CLR R0 ;
INC MP0 ;
SDZ TEMP ;
JMP RAM_CLR1 ;
RET ;
RAM_CLR ENDP ;
;**********************************
;==================================
; INC SEC1_CNT ;
; MOV A,100 ;
; SUB A,SEC1_CNT ;
; SZ C ;
; JMP TMR0_EXIT ;
; CLR SEC1_CNT ;
; INC SEC2_CNT ;
; MOV A,100 ;
; SUB A,SEC2_CNT ;
; SZ C ;
; JMP TMR0_EXIT ;
; CLR SEC2_CNT ;
; MOV A,08H ;
; XORM A,PA ;
;=================================
;=================================
; SNZ B_REC_OK ;
; JMP MAIN1 ;
; CLR B_REC_OK ;
; MOV A,04H ;
; XORM A,PA ;
; CALL RES_AD ;
;MAIN1:
;=================================
;**********************************
DELAY:
MOV A,90H ;
MOV R11,A ;
MOV R22,A ;
DEL1:
SDZ R22 ;
JMP DEL1 ;
SDZ R11 ;
JMP DEL1 ;
RET ;
;**********************************
ORG 400H ;
DC 007EH,003CH,0018H,0000H,00E7H,00C3H,0081H,0055H ;
DC 00AAH,0000H,00FFH,0001H,0002H,0004H,0008H,0010H ;
END ;HT46R47单片机HT6221遥控接收程序