⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iccard.dt

📁 使用EM78P468单片机做的IC卡煤气表程序。
💻 DT
📖 第 1 页 / 共 5 页
字号:
	or	  a,@0x10		  ;p5.4 internal pullhigh
	iow 	p5cr			 ;将P5.4设置为输入 
		
	;mov 	a,@0x01         ;p5.4 is int0
	;iow 	re			  ;将P5.4口设置为外部中断 
	bs	  re,0
	
	;eni                 	;eable grobal interrupt
	;mov 	a,@0b00000010   ;enable int0 开INT0中断 
	ior	 imr
	or	  a,@0b00000010
	iow 	imr
		
	bc	  rf,1			;清INT0寄存器 
	
	bs      0x05,0
	mov	 a,@0x80
	iow	 tcccr			;P5.4-INT0下降沿触发		
	ret
;================================================
;===========  count1 init sub ========================
count1_init:   	
    bs		 port5 ,0			;Reg page 1
	ior		ioc91
	and		a     ,@0xf0
	or		 a     ,@0x06
	iow		ioc91			;scale 1:64--0.5s中断    1:128 1s--断 
	bc		 port5 ,0			;Reg page 0
	mov		a     ,@255		;count1_data
	iow		iocb0			;count1 preset
	bs	 	rc    ,0				;count1 enable
	bc		 rf    ,3				;clr count1 int flag	
	ior		iocf0
	or		 a     ,@0x08		
	iow		iocf0			;count1 int enable		
	ret
	
;===========  count1 int server =================
count1_int:
    mov 	stack1,a	;保护A
	swap 	stack1
	swapa 	r3	;保护R3
	mov 	stack2,a	
	swapa     0x04	;保护R4
	mov 	stack3,a
	
	bc 		rf,3				;clr count1 flag
	;.
	;.
	;djz        time
	;bc         port6,0
	;mov        time,a       
	;.
	disi
	;bank    1
	;page 0
	;jbc     status_flag,ic_card_in
	;jbs     port5,4;如果PORT5.4为0则卡在里面 
	;jmp	 exit_card_sensor
	;bank 1
	;bc	   status_flag,ic_card_op_end	
	;bc	   status_flag,ic_card_in;IC卡退出为0	
	;page 0
	;call	Ic_Card_Exit
exit_card_sensor:
/*	jbs        flag,0
	jmp        setport1
	jmp        setport0
	
setport1   bs         port6, 0	  ;P6.0输出为1
	   	bs         flag, 0
	   	inc	    lcd_data_num
	   	jmp        process

setport0   bc		 port6, 0
		   bc         flag, 0*/
;==================================================
;计量 
;==================================================
	;call	test_int_0_2
	bank 1
	page 0
sensort:
    jbs sen,5
    jmp sensortend
    mov a,@0x0f
    and a,sen
    sub a,@0x01
    page 0
    jbc 0x03,0
    jmp sensort1
    bs  sen,4
    page 0    
    jmp sensortend    
sensort1:    
    inc sen
sensortend:
;==================================================
;计量完 
;==================================================		   		   
process:
   
	swapa 	stack3
	mov 	  r4,a
	swapa 	stack2
	mov 	  r3,a
	swapa 	stack1
reti
	
;================================================
;===========  int1 sub ========================	
int1:
    mov 	stack1,a	;保护A
	swap 	stack1
	swapa 	r3	;保护R3
	mov 	stack2,a   
	swapa     0x04	;保护R4
	mov 	stack3,a	
	;bc	rf,1	;清中断标志 
	clr 	isr             ;clr icif bit
	disi
	mov    a, @0x16
	mov    delay_time1, a
delay21:	 
	mov	a, @0x53
	mov    delay_time2,a
delay22:
	mov	a, @0x62
	mov    flag, a
delay23:
    page 0
	djz    flag	
	jmp    delay23
	djz    delay_time2
    jmp    delay22
    djz    delay_time1
    jmp    delay21
    

	;or     a,0b00100000
	;mov	a,@0x
	;jbs    port5,4;如果PORT5.4为1则卡不在里面 
	;jmp	int1_youka
	bc	 port6,5	;IC卡读写上电 
	;bank 0
	;mov    ic_read_flag,@0	
	page 0
	jbc    port5,4;如果PORT5.4为1则卡不在里面 
	jmp	int1_youka
	bank  1	
	bs	status_flag,ic_card_in	;有卡时候为1
	;call	test_int_0_1
int1_youka:
/*    
    nop
	mov   a,port5
	and   a,@0x10
	;mov   flag,a
	;CJE   flag,@0,next1
	jmp   exit_int1
next1:	
	inc   lcd_data_num_sec
	CJG   lcd_data_num_sec,@59,next
	jmp   exit_int1
next:
	clr   lcd_data_num_sec
exit_int1:*/
   
	swapa 	stack3
	mov 	  r4,a
	swapa 	stack2
	mov 	  r3,a
	swapa 	stack1
reti


	
org	0x400
;eop
/**********************page 1***************************/
/**********************page 1***************************/
/**********************page 1***************************/
/**********************page 1***************************/



;============================================
;IC卡读数据块程序 
;============================================
ic_read_data_block:

;读取卡代码A2,13,10,91
/*	nop
	nop
	bank 0
	mov	  rmm_address,@0	;读取的地址 
	bank 2
	mov      card_temp,@0
	mov      ram_address,@0xa0	;card_code address
begin_read_card_code:
	bank 2
	page 1
	CJL      card_temp,@4,read_card_code
	jmp	  exit_read_card_code
read_card_code:
    page 1	
    jbc     port5,4;如果PORT5.4为0则卡在里面 
	jmp	 ic_read_data_block_end
	bank 0	 	 
	mov      rmm_len,@1		  ;读取长度1
	page 1
	call	 ic_readmainmemory	;读地址的内容 	
	bank 0
	mov	  a,ic_buffer1
	bank 2
	mov      data_buffer,a
	mov a,ram_address	;地址给A
	mov r4,a	   	  ;间接寻址 
	mov a,r0	  	   ;附值给A	
	mov r0,data_buffer
	;bank 2
	;mov      card_code1,a
	bank 0
	inc	  rmm_address
	bank 2
	inc	  card_temp
	inc	  ram_address
	page 1
	jbc     port5,4;如果PORT5.4为0则卡在里面 
	jmp	 ic_read_data_block_end
	jmp	  begin_read_card_code
exit_read_card_code:
	bank 0
	mov	  rmm_address,@1	;读取的地址243
	mov      rmm_len,@1		  ;读取长度1
	page 1
	call	  ic_readmainmemory
	bank 0
	mov      a,ic_buffer1
	bank 2
	mov      card_code2,a*/
	
		
;读取系统代码gas_0001(67、61、73、75、30、30、30、31)
	bank 0
	mov	  rmm_address,@240	;读取的地址 
	bank 2
	mov      card_temp,@0
	mov      ram_address,@0xa4	;system_code address
begin_read_system_code:
	bank 2
	page 1
	CJL      card_temp,@8,read_system_code
	jmp	  exit_read_system_code
read_system_code:
	bank 0
	page 1
    jbc     port5,4;如果PORT5.4为0则卡在里面 
	jmp	 ic_read_data_block_end
	mov      rmm_len,@1		  ;读取长度1
	page 1
	call	 ic_readmainmemory	;读地址的内容 	
	bank 0
	mov	  a,ic_buffer1
	bank 2
	mov      data_buffer,a
	mov a,ram_address	;地址给A
	mov r4,a	   	  ;间接寻址 
	mov a,r0	  	   ;附值给A	
	mov r0,data_buffer
	;bank 2
	;mov      card_code1,a
	bank 0
	inc	  rmm_address
	bank 2
	inc	  card_temp
	inc	  ram_address
	page 1
	jbc     port5,4;如果PORT5.4为0则卡在里面 
	jmp	 ic_read_data_block_end
	jmp	  begin_read_system_code
exit_read_system_code:
	nop
	nop
	;读取card_tpye,address=48
	bank 0
	mov	  rmm_address,@48	  ;读取卡类型 
	mov      rmm_len,@1		   ;读取长度1
	page 1
	call	 ic_readmainmemory	;读地址的内容 	
	bank 0
	mov	  a,ic_buffer1
	bank 2
	mov	  card_type,a
	bank 0
;读取user_id,address=49~52
	mov	  rmm_address,@49	  ;读取user_id1
	mov      rmm_len,@1		   ;读取长度1
	page 1
	call	 ic_readmainmemory	;读地址的内容 	
	bank 0
	mov	  a,ic_buffer1
	bank 2
	mov	  user_id1,a
	bank 0
	
	mov	  rmm_address,@50	  ;读取user_id2
	mov      rmm_len,@1		   ;读取长度1
	page 1
	call	 ic_readmainmemory	;读地址的内容 	
	bank 0
	mov	  a,ic_buffer1
	bank 2
	mov	  user_id2,a
	bank 0	

	mov	  rmm_address,@51	  ;读取user_id3
	mov      rmm_len,@1		   ;读取长度1
	page 1
	call	 ic_readmainmemory	;读地址的内容 	
	bank 0
	mov	  a,ic_buffer1
	bank 2
	mov	  user_id3,a
	bank 0

	mov	  rmm_address,@52	  ;读取user_id4
	mov      rmm_len,@1		   ;读取长度1
	page 1
	call	 ic_readmainmemory	;读地址的内容 	
	bank 0
	mov	  a,ic_buffer1
	bank 2
	mov	  user_id4,a
	bank 0
		
	bank 0
	mov	  rmm_address,@0xf0
	;读取charge_money,address=0x30,0x31
	page 1
    jbc     port5,4;如果PORT5.4为0则卡在里面 
	jmp	 ic_read_data_block_end
	mov	  rmm_address,@74	  ;读取charge_money低位 
	mov      rmm_len,@1		   ;读取长度1
	page 1
	call	 ic_readmainmemory	;读地址的内容 	
	bank 0
	mov	  a,ic_buffer1
	bank 2
	mov      charge_moneyl,a

	bank 0
	page 1
    jbc     port5,4;如果PORT5.4为0则卡在里面 
	jmp	 ic_read_data_block_end
	mov	  rmm_address,@75	  ;读取charge_money高位 
	mov      rmm_len,@1		   ;读取长度1
	page 1
	call	 ic_readmainmemory	;读地址的内容 	
	bank 0
	mov	  a,ic_buffer1
	bank 2
	mov      charge_moneyh,a
ic_read_data_block_end:
ret

;============================
;发送数据子程序 
;入口:    DBUF_24    =要发送的数据(8_BIT)
;============================
ic_send_data:
    bank   0
    MOV    A,@8            ;循环次数=8
    MOV    COUNT_24,A
TXLP:
    RRC    DBUF_24            ;左移(带C)
    CALL   ic_BITOUT          ;输出1_BIT
    page 1
    DJZ    COUNT_24        ;循环结束?
    JMP    TXLP        
RET
;=================
;位输出子程序 
;说明:    每当SCL=0时,改写SDA上的电平 
;入口:    C=要写到SDA上的位值 
;=================
ic_BITOUT:
    ;SDA_OUT                ;设置SDA为输出口 
    set_io_out
    set_clk_out
	page 1
    JBS    R3,0
    JMP    BITOUT_BIT0
    BS     port6,icio        ;io=C=1
    page 1
    JMP    BITOUT_io1        
BITOUT_BIT0:
    BC     port6,icio        ;io=C=0
BITOUT_io1:
	nop
	nop						;延时0.6US
    bs     port6,icclk        ;clk=1
BITOUT_BIT2:
	nop						;延时0.6US
	nop
	nop
	nop
    bc     port6,icclk        ;clk=0
RET
;=================
;位输入子程序 
;说明:    当SCL=1时,从SDA上读电平 
;出口:    C=从SDA上读入的位值    
;=================
ic_BITIN:
    set_io_in          ;设置i/o为输入口 
    set_clk_out
    bc    0x05,0
    bs	port6,icclk	   ;clk=1
	nop
	nop					;延时0.6US
    BC    R3,0
    JBC   port6,icio        
    BS    R3,0         ;C=io
	nop
	nop
    BC    port6,icclk       ;clk=0
    page 1
	nop
	nop				;延时0.6US
RET	
;============================
;接收数据子程序 
;入口:    TT_24.REND_24    =读完毕标志 
;出口:    DBUF_24    =接受到的数据(8_BIT)
;============================    
ic_receive_data:
    bank 0
    MOV    A,@8            ;循环次数=8
    MOV    COUNT_24,A
    CLR    DBUF_24
RXLP:
    page 1
    CALL   ic_BITIN            ;输入1_BIT   	
    bank 0
    RRC    DBUF_24            ;左移(带C)
    page 1
    DJZ    COUNT_24        ;循环结束?
    JMP    RXLP       
RET
  

;===========================
;复位操作 
;============================
ic_reset:
	set_clk_out
	set_io_out
	set_rst_out
				
	bc	port6,icclk	;clk=0
	page 1
	call  delay10
	bc	port6,icrst	;rst=0
	page 1
	call  delay10	
	bs	port6,icio	;i/o=1
	page 1
	call  delay10	
	bs	port6,icrst	;rst=1
	page 1
	call  delay10	
	bs	port6,icclk	;clk=1
	page 1
	call  delay10	
	bc	port6,icclk	;clk=0
	page 1
	call  delay10	
	bc	port6,icrst	;rst=0
	page 1
	call  delay10
	page 1
	call  ic_receive_data
	bank  0
	mov   a,dbuf_24
	bank 2
	mov	card_code1,a
	page 1	
	call  ic_receive_data
	bank  0
	mov   a,dbuf_24
	bank 2
	mov	card_code2,a
	page 1
	call  ic_receive_data
	bank  0
	mov   a,dbuf_24
	bank 2
	mov	card_code3,a
	page 1
	call  ic_receive_data
	bank  0
	mov   a,dbuf_24
	bank 2
	mov	card_code4,a
ret

;============================延时子程序====================================
;功能:短延时         入口:NONE             出口:NONE                     
;影响资源:A,TEMP ,STATUS                                                      
;==========================================================================
DELAY:  
        bank   0                    
        MOV         A,@0X02
        MOV         TEMP,A
        DJZ         TEMP
        JMP         $-1
        RET                
;============================延时子程序10MS================================
;功能:延时         入口:NONE             出口:NONE                     
;影响资源:A,TEMP ,STATUS                                                      
;==========================================================================
DELAY10:                      
        bank   0
        MOV         A,@0x10
        MOV         TEMP,A
        MOV         A,@0xff
        MOV         TEMP1,A
        DJZ         TEMP1
        JMP         $-1
        DJZ         TEMP
        JMP         $-5
RET 

 
;=========发送命令=========
;send command                             
;==========================     
ic_sendcommand:
	;start condition
	set_clk_out
	set_io_out
	bc	port6,icclk
	bs	port6,icio
	call  delay
	bs	port6,icclk
	call  delay
	bc	port6,icio
	call  delay
	bc	port6,icclk
	call  delay			
	bank  0
	mov	dbuf_24,ic_command1
	call   ic_send_data
	bank 0
	mov	dbuf_24,ic_command2
	call   ic_send_data
	bank 0
	mov	dbuf_24,ic_command3
	call   ic_send_data
	
	;stop condition
	bc	port6,icio
	call  delay	
	bs	port6,icclk
	call  delay
	bs	port6,icio
	call  delay	
ret

;process
/*ic_process:
	bc	port6,icclk
	call  delay
	bc	port6,icio
	mov   process_temp,@254
puls:
	bs	port6,icclk
	call  delay
	bc	port6,icclk
	djz   process_temp
	jmp   puls 
ret*/

/*================读主存储器==================
入口:rmm_address 读取的地址 
	  rmm_len 读取的长度 
出口:ic_buffer1
;============================================*/
ic_readmainmemory:
	bank 0
	mov	ic_command1,@0x30
	mov	ic_command2,rmm_address
	mov	ic_command3,@0
	call   ic_sendcommand 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -