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

📄 iccard.dt

📁 使用EM78P468单片机做的IC卡煤气表程序。
💻 DT
📖 第 1 页 / 共 5 页
字号:
    bank  0
    MOV    A,@1
    XOR    A,NUM_24
    BS    TT_24,REND_24        
    JBS    R3,Z            ;NUM_24=1跳;判断是否最后一个字节,决定应答信号    
    BC    TT_24,REND_24        
    CALL   iic_RX            ;读数据并发送应答信号 
    
    bank  0
    MOV    0x18,IIC_DBUF_24
    
    bank  3
    mov    R4,iic_ram_address 
 
    MOV    R0,0x18            ;保存数据到R0
    bank 3
    INC    iic_ram_address
    bank  0
    DJZ    NUM_24
    JMP    RDPAGE1            ;未读完继续 
    CALL   iic_BSTOP            ;送停止位 
    RET

;****************************
;I2C总线读/写的程序全部结束 !
;****************************


org	0x800
;eop
;==========================================
;IC卡识别,比较卡代码和系统代码 
;==========================================
/*ic_identify:
	bank 2
	page 2
	CJNE     card_code1,@0xa2,err_00
	CJNE     card_code2,@0x13,err_00
	CJNE     card_code3,@0x10,err_00
	CJNE     card_code4,@0x91,err_00
	jmp	  compare_system_code
;比较卡代码,错误则输出ERR-00
err_00:
	bank 0
	mov 	err_temp1,@0xfa
	mov	 err_temp2,@0xfa
	page 2
	call	display_error
	page 2
	jmp	 ic_identify_exit
compare_system_code:
	bank 2
	page 2
	CJNE     system_code1,@0x67,err_01
	CJNE     system_code2,@0x61,err_01
	CJNE     system_code3,@0x73,err_01
	CJNE     system_code4,@0x5f,err_01
	CJNE     system_code5,@0x30,err_01
	CJNE     system_code6,@0x30,err_01
	CJNE     system_code7,@0x30,err_01
	CJNE     system_code8,@0x31,err_01
	jmp	  ic_identify_exit
err_01:
	bank 0
	mov 	err_temp1,@0xfa
	mov	 err_temp2,@0xc0
	page 2
	call	display_error
	page 2
	jmp	 ic_identify_exit
;return_card_type:
		
ic_identify_exit:
ret*/
;============================================

;****************************
;计量模块 
;****************************
measure:
    bank   1
    jbs   status_flag,magnetic_attack;强磁标志 
    jmp   measure10
    page 0
    call bytesub
    page 2
    bs    status_flag,close;关阀标志 
    lcd_flag_read 0,lcd_data_head,@20
    mov   a,@0x08
    or    lcd_data_head,a
    lcd_flag_display  0,lcd_data_head,@20
    bank   2
    mov   a,@0x5a  ;写强磁记录 
    mov   sensor_status,a
    bank   0
    mov   data_24,a
    mov   addr_24,@0x1d
    mov   slave_24,@0xa0
    page  1
    call  iic_WRBYTE
    page  2
    bank  1 
    bc    status_flag,magnetic_attack;强磁标志 
    jmp   measur20
measure10:
    bank  1
    jbs   sen,6
    jmp   measureend
    page  0
    call bytesub
    page  2
    bank  1
    bc    sen,6     
    bank  2  
    CJG   gas_moneyh,@0,measur20
    cjg   gas_moneyl,@100,measur20
    cjl   gas_moneyl,@100,measur11
    bank  1
    bs    status_flag,close;关阀标志 
measur11:
    lcd_flag_read 0,lcd_data_head,@19
    mov   a,@0x08
    or    lcd_data_head,a
    lcd_flag_display 0,lcd_data_head,@19
    bank  2    
    cjnz  gas_moneyl,measur20
    bank  1
    bs    status_flag,close;关阀标志 
measur20:
    bank 1
    mov    a,@0x00
    mov    hex1,a
    mov    hex2,a
    bank 2
    mov    a,gas_moneyh
    bank 1
    mov	hex3,a
    bank 2
    mov	a,gas_moneyl
    bank 1
    mov    hex4,a    
    page 0
	call	 HEXTOBCD	
	page 0
    call	display_data;显示数据       
measureend:
    ret
;****************************
;计量模块完 
;****************************    

;==========================================
;显示错误代码 
;==========================================
display_error:
    bank   0
	mov	lcd_data_head,@0x00
	lcd_display  0,lcd_data_head,@15
	lcd_display  0,lcd_data_head,@17
	lcd_flag_read 0,lcd_data_head,@20
    mov   a,@0x08
    and    lcd_data_head,a
	lcd_flag_display 0,lcd_data_head,@20	;显示 "M3"
	
	mov	lcd_data_head,@0x3e
	lcd_display  0,lcd_data_head,@0
	mov	lcd_data_head,@0x0e
	lcd_display  0,lcd_data_head,@2
	mov	lcd_data_head,@0x0e
	lcd_display  0,lcd_data_head,@5
	mov	lcd_data_head,@0x04
	lcd_display  0,lcd_data_head,@7
	bank 0
	mov	lcd_data_head,err_temp1
	lcd_display  0,lcd_data_head,@11
	mov	lcd_data_head,err_temp2
	lcd_display  0,lcd_data_head,@13
	
	bank 1
	mov 	display_err_flag,@0
ret
;=========================================

;============================================
;从EEPROM中读取user_id
;============================================
eprom_read_id:
    bank    0
    mov     SLAVE_24,@0xa0
    mov     NUM_24,@0x04
    mov     ADDR_24,@0x10
    bank    3
    mov     iic_ram_address,@0xe0
    page    1
    bank    0
    call    iic_RDPAGE
    call    delay	
    
/*	mov	 a,@2
	bank 3
	mov 	eprom_buffer1,a
	mov 	eprom_buffer2,a
	mov 	eprom_buffer3,a
	mov 	eprom_buffer4,a
	page 1
	call	DELAY10
	bank 0
	mov	 addr_24,@0x10	;数据地址 
	mov	 slave_24,@0xa0 ;从器件地址(1010XXX0)
	page 1
	call	iic_RDBYTE
	bank 0
	mov	 a,data_24
	bank 3
	mov	 eprom_buffer1,a
	page 1
	call	DELAY10
	
	bank 0
	mov	 addr_24,@0x11	;数据地址 
	mov	 slave_24,@0xa0 ;从器件地址(1010XXX0)
	page 1
	call	iic_RDBYTE
	bank 0
	mov	 a,data_24
	bank 3
	mov	 eprom_buffer2,a
	page 1
	call	DELAY10
		
	bank 0
	mov	 addr_24,@0x12	;数据地址 
	mov	 slave_24,@0xa0 ;从器件地址(1010XXX0)
	page 1
	call	iic_RDBYTE
	bank 0
	mov	 a,data_24
	bank 3
	mov	 eprom_buffer3,a
	page 1
	call	DELAY10
		
	bank 0
	mov	 addr_24,@0x13	;数据地址 
	mov	 slave_24,@0xa0 ;从器件地址(1010XXX0)
	page 1
	call	iic_RDBYTE
	bank 0
	mov	 a,data_24
	bank 3
	mov	 eprom_buffer4,a	
	nop
	
	bank 0
	mov	 addr_24,@0x10	;数据地址 
	mov	 slave_24,@0xa0 ;从器件地址(1010XXX0)
	page 1
	call	iic_RDBYTE
	bank 0
	mov	 a,data_24
	bank 3
	mov	 eprom_buffer1,a*/
	nop
ret
;==========================================
;IC卡操作模块 
;==========================================	
ic_work:
	;bank  0
    ;MOV    ic_read_flag,ic_read_flag
    ;JBC    0X03,2
    bank 1
    page 2
    jbs	status_flag,ic_card_in	;有卡时候为1
    jmp	exit_ic_end
    page 2
    jbc	status_flag,ic_card_op_end;操作完成为1
    jmp	exit_ic_card_op
    page 2
    jbc    port5,4;如果PORT5.4为0则卡在里面 
    jmp    exit_ic_card_op
    page 2
    jmp    ic_read
	;jmp      no_write
	nop
	;bc	 port6,5
	;call     delay10
	;call     delay10
	;mov a,@0x04
	;mov sbpcr,a
	;slep 		;in sleep mode
	;inc     lcd_data_num_sec
		
	;jmp	  loop
/**********************************************/
;===============================================
/**********************************************/
ic_read:    
	;call	test_int_0_2
	mov	a,@0
	bank 2
	mov	card_code1,a
	mov	card_code2,a
	mov	card_code3,a
	mov	card_code4,a
	mov	system_code1,a
	mov	system_code2,a
	mov	system_code3,a
	mov	system_code4,a
	mov	system_code5,a
	mov	system_code6,a
	mov	system_code7,a
	mov	system_code8,a
	bc     port6,5	;IC卡读写上电 
	page 2
	jbc    port5,4;如果PORT5.4为0则卡在里面 
    jmp    no_write
    page  1
	call   ic_reset
	page  2
	jbc    port5,4;如果PORT5.4为0则卡在里面 
    jmp    no_write
	page  1
	call   delay
	page  2	
	jbc    port5,4;如果PORT5.4为0则卡在里面 
    jmp    no_write
    page 1
	call   ic_read_data_block
	page  2
	jbc    port5,4;如果PORT5.4为0则卡在里面 
    jmp    no_write
    page 2
	;jmp	compare_password;进入充值 
	;call	ic_identify
;===============ic_identify====================================
	bank 2
	page 2
	CJNE     card_code1,@0xa2,err_00
	CJNE     card_code2,@0x13,err_00
	CJNE     card_code3,@0x10,err_00
	CJNE     card_code4,@0x91,err_00
	jmp	  compare_system_code
;比较卡代码,错误则输出ERR-00
err_00:
	bank 0
	mov 	err_temp1,@0xfa
	mov	 err_temp2,@0xfa
	page 2
	call	display_error
	bank 1
	bs	  status_flag,ic_card_op_end
	jmp	 exit_ic_card_op
	page 2
	jmp	 ic_identify_exit
compare_system_code:
	bank 2
	page 2
	CJNE     system_code1,@0x67,err_01
	CJNE     system_code2,@0x61,err_01
	CJNE     system_code3,@0x73,err_01
	CJNE     system_code4,@0x5f,err_01
	CJNE     system_code5,@0x30,err_01
	CJNE     system_code6,@0x30,err_01
	CJNE     system_code7,@0x30,err_01
	CJNE     system_code8,@0x31,err_01
	jmp	  ic_identify_exit
err_01:
	bank 0
	mov 	err_temp1,@0xfa
	mov	 err_temp2,@0xc0
	page 2
	call	display_error
	bank 1
	bs	  status_flag,ic_card_op_end
	jmp	 exit_ic_card_op
	page 2
	jmp	 ic_identify_exit
ic_identify_exit:
;=============================================================
	page  2	
	;IC卡识别,比较卡代码和系统代码 返回卡类型 
	bank  2
	CJE     card_type,@0xa1,user_ic_init
	jmp     user_ic_mot
user_ic_init:
	page 2
	call    init_card    
	bank 1
	bs	  status_flag,ic_card_op_end
	page 2
	jmp     exit_ic_card_op
user_ic_mot:
    bank  2
	CJE     card_type,@0xa0,user_ic_mot1
	jmp     user_ic_identify
user_ic_mot1:
	page 3
	call    gas_mot_card
	bank 1
	bs	  status_flag,ic_card_op_end
	page 2
	jmp     exit_ic_card_op	
user_ic_identify:	 
	bank 2
	CJE     card_type,@0x59,user_new
	bank    2
	CJE     card_type,@0x58,user_old_operator
	;CJE     card_type,@0xa1,init
	;jmp	 ic_card_exit
		 
/*	bank 0
	mov	  rmm_address,@75	;读取的地址243
	mov      rmm_len,@1		  ;读取长度1
	call	  ic_readmainmemory
	mov	a,ic_buffer1
	bank 1
	mov    HEX3,a
	bank 0*/
;============用户卡操作========================
user_new:
    page 2
    mov	a,@0
    bank 3
    mov	eprom_buffer1,a
    mov	eprom_buffer2,a
    mov	eprom_buffer3,a
    mov	eprom_buffer4,a
	call    eprom_read_id	
	page 2
	bank 3
	CJNZ    eprom_buffer1,err_04;eprom_buffer1 =读到的数据 
	CJNZ    eprom_buffer3,err_04;eprom_buffer3 =读到的数据 
	jmp	 user_new_operator
err_04:
	bank 0
	mov 	err_temp1,@0xfa
	mov	 err_temp2,@0xc6
	page 2
	call	display_error
	bank 1
	bs	  status_flag,ic_card_op_end
	jmp	 exit_ic_card_op
user_new_operator:	;新用户卡的操作 
	;将卡上面的ID赋给EEPROM中 
	page 2
	call	eprom_write_id
user_old_operator:	;老用户卡的操作 
	;否则为老用户,进行老用户处理 
	;比较用户ID是否一致 
	page 2
	call    eprom_read_id
	bank 3
    MOV    A,eprom_buffer1
    bank 2
    page 2
    SUB    A,user_id1	;比较用户ID的第一位 
    JBS    0X03,2
    JMP    err_02
        	
	bank 3
    MOV    A,eprom_buffer2   
    bank 2
    page 2
    SUB    A,user_id2	;比较用户ID的第二位 
    JBS    0X03,2
    JMP    err_02    
    
	bank 3
    MOV    A,eprom_buffer3
    bank 2
    page 2
    SUB    A,user_id3	;比较用户ID的第三位 
    JBS    0X03,2
    JMP    err_02
    
	bank 3
    MOV    A,eprom_buffer4
    bank 2
    page 2
    SUB    A,user_id4	;比较用户ID的第四位 
    JBS    0X03,2
    JMP    err_02    
	
	jmp	compare_password	;USER_ID相等,比较密码 
err_02:
	;jmp     case_end;显示错误,退出 
	bank 0
	mov 	err_temp1,@0xfa
	mov	 err_temp2,@0x7c
	page 2
	call	display_error
	bank 1
	bs	  status_flag,ic_card_op_end
	jmp	 exit_ic_card_op
compare_password:
	nop
	nop
	page 1
	;call	ic_compareverifdata
	page 2
	bank 0
	CJE     ic_compare_password_flag,@1,password_success
	;jmp	 password_fail
/*err_03:	;密码不正确 
	bank 0
	mov 	err_temp1,@0xfa
	mov	 err_temp2,@0xf4
	page 2
	call	display_error
	bank 1
	bs	  status_flag,ic_card_op_end
	jmp	 exit_ic_card_op
	nop*/
	nop
password_success:
	 ;密码比较成功后就要返写IC卡数据、充值 
;=============================================	
;加法子程序 
;入口: (加数)JS1,JS2,JS3,JS4,(被加数)BJ1,BJ2,BJ3,BJ4
;出口:(结果)JS1,JS2,JS3,JS4
;============================================
case_end:
	nop
	nop
	page 2
	call	ic_charge
    call	save_gas_money
/*data_efficacy_err:
	;bc	   0x03,5	;select page 0
	bank 0
	CJE       ic_compare_password_flag,@1,ic_write
	jmp	   no_write
ic_write:
	;call      ic_writemainmemory   ;写243地址的内容 0X56
	nop*/
no_write:
	;call	  ic_readmainmemory		

	;bank 0
	;mov	   ic_read_flag,@0xff
	bs  	  port6,5	;IC卡读写掉电 
	nop
	nop
	bank 1
	bs	    status_flag,ic_card_op_end
	;IC卡读写操作完毕 
;CASE结束、检测IC卡是否在里面 
exit_ic_card_op:
    page 2
	jbs     port5,4;如果PORT5.4为0则卡在里面 
	jmp	 exit_ic_end	 	 
	bank 1	
	bc	   status_flag,ic_card_op_end	
	bc	   status_flag,ic_card_in;IC卡退出为0
    page 0
	call	Ic_Card_Exit
	;page 2 
exit_ic_end:
	nop	
	nop
	nop
ret

;==================================================
;ic卡充值 
;==================================================
ic_charge:
	bank   2
	page 2	
	CJE    charge_moneyl,@0xff,data_efficacy
	jmp	data_efficacy_end
data_efficacy:
    bank   2
	CJE    charge_moneyh,@0xff,no_write
data_efficacy_end:
	bank 1
	mov	js1,@0
	mov	js2,@0
	bank 2
	mov	a,gas_moneyh	
	bank 1
	mov	js3,a
	bank 2
	mov	a,gas_moneyl
	bank 1
	mov	js4,a	;加数 
	
	bank 1
	mov	bj1,@0
	mov	bj2,@0
	bank 2
	mov	a,charge_moneyh	
	bank 1
	mo

⌨️ 快捷键说明

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