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

📄 iccard.dt

📁 使用EM78P468单片机做的IC卡煤气表程序。
💻 DT
📖 第 1 页 / 共 5 页
字号:
	;lcd_display  0,lcd_data_head,@0
	;lcd_display  0,lcd_data_head,@2
	;lcd_display  0,lcd_data_head,@5
	;lcd_display  0,lcd_data_head,@7
	;lcd_display  0,lcd_data_head,@11
	;lcd_display  0,lcd_data_head,@13
	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
ret
;===================================
;初始化数据 
;===================================
init_data:
	bank 1
	mov	sen,@0	 
	mov	 HEX1,@0
    mov	 HEX2,@0
    mov	 HEX3,@0
    mov	 HEX4,@0
	mov	status_flag,@0x08
	bank 2
	mov	gas_moneyl,@0
	mov	gas_moneyh,@0
	mov	charge_moneyl,@0
	mov	charge_moneyh,@0
;读剩余金额 
    bank    0
    mov     SLAVE_24,@0xa0
    mov     NUM_24,@2
    mov     ADDR_24,@0x14
    bank    3
    mov     iic_ram_address,@0xbe
    page    1
    bank    0
    call    iic_RDPAGE
    call    delay
    page    2    
;读累计充值金额 
    bank    0
    mov     SLAVE_24,@0xa0
    mov     NUM_24,@4
    mov     ADDR_24,@0x16
    bank    3
    mov     iic_ram_address,@0xb7
    page    1
    bank    0
    call    iic_RDPAGE
    call    delay
    page    2
;读强磁标记 
    bank    0
    mov     SLAVE_24,@0xa0
    mov     NUM_24,@1
    mov     ADDR_24,@0x1d
    bank    3
    mov     iic_ram_address,@0xb6
    page    1
    bank    0
    call    iic_RDPAGE
    call    delay
    
    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
	
	page 0
	bank  2
	CJG   gas_moneyh,@0,init_data2
    CJG   gas_moneyl,@100,init_data2
    CJNZ  gas_moneyl,init_data1
	bank  1
    bs    status_flag,close;关阀标志 
    lcd_flag_read 0,lcd_data_head,@19
    mov   a,@0x08
    or    lcd_data_head,a
    lcd_flag_display 0,lcd_data_head,@19
    jmp   init_data3
        
init_data1:
    lcd_flag_read 0,lcd_data_head,@19
    mov   a,@0x08
    or    lcd_data_head,a
    lcd_flag_display 0,lcd_data_head,@19
    
init_data2:
    bank  1
    bs    status_flag,open;关阀标志 
    
init_data3:
    page  0
    bank  2
    CJNE    sensor_status,@0x5a,init_dataend
    lcd_flag_read 0,lcd_data_head,@20
    mov   a,@0x08
    or    lcd_data_head,a
    lcd_flag_display  0,lcd_data_head,@20
   
init_dataend:   	
    nop
    nop
ret
;===================================
;显示金额 
;===================================
display_data:
    bank   0
	mov	lcd_data_head,@0x00
	lcd_display  0,lcd_data_head,@0	
	lcd_display  0,lcd_data_head,@2	
	lcd_display  0,lcd_data_head,@5
	lcd_display  0,lcd_data_head,@7
	lcd_display  0,lcd_data_head,@11
clear_exit:	
;===================================
;显示时钟 
;===================================			
	bank 1
	page  0
	CJEZ     bcd2,lcd_hide8_0_2	;bcd2=0则不显示 
	CJL      bcd2,@10,lcd_hide8_2   ;bcd1<9则不显示7位 
lcd_display8_2:	
	bank 1
    swapa	bcd2
    bank 0
    and      a,@0x0f
    page 0
	call	 lcd_num
	bank 0
	mov      lcd_data_head,a
	lcd_display  0,lcd_data_head,@2
	page 0 
	jmp	 lcd_display8_5
lcd_hide8_2:
	bank 0
	mov      lcd_data_head,@0
	lcd_display  0,lcd_data_head,@2 
lcd_display8_5:
	bank 1
	mov	  A,BCD2
    and      a,@0x0f
    page 0
	call	 lcd_num
	bank 0
	mov      lcd_data_head,a
	lcd_display  0,lcd_data_head,@5	
;===================================	
;显示分钟 
;===================================
	page 0
	jmp	 lcd_display8_7
lcd_hide8_0_2:				;不显示6、7位 
	bank 0
	mov      lcd_data_head,@0
	lcd_display  0,lcd_data_head,@0
	lcd_display  0,lcd_data_head,@2	
	
lcd_display8_7:
	bank 1
	page 0
	CJEZ     bcd2,judge_bcd2		;bcd2=0则不显示 
	jmp	  judge_bcd3
judge_bcd2:
	bank 1
	page 0
	CJEZ     bcd3,lcd_hide8_7_11	  ;bcd3=0则不显示 
	CJL      bcd3,@10,lcd_hide8_7    ;bcd3<9则不显示5位	
judge_bcd3:
	bank 1
    swapa	bcd3    
    and      a,@0x0f
    page 0
	call	 lcd_num
	or	   a,@0x01			;显示剩余 
	bank 0
	mov      lcd_data_head,a	
	lcd_display  0,lcd_data_head,@7
	page 0
	jmp	  lcd_display8_11
lcd_hide8_7:
	bank 0
	mov      lcd_data_head,@0x01
	lcd_display  0,lcd_data_head,@7	
lcd_display8_11:
	bank 1
	mov	  A,BCD3
    and      a,@0x0f
    page 0
	call	 lcd_num
    bank 0
	mov      lcd_data_head,a
	lcd_display  0,lcd_data_head,@11
	nop
;===================================
;显示秒钟 
;=================================== 	
	page 0
	jmp	  lcd_display8_3
lcd_hide8_7_11:
	bank 0
	mov      lcd_data_head,@0x01
	lcd_display  0,lcd_data_head,@7
	mov      lcd_data_head,@0
	lcd_display  0,lcd_data_head,@11
	
lcd_display8_3:    
    bank 1
    swapa	bcd4
    bank 0
    and      a,@0x0f
	;mov	  a,lcd_data_num_temph
	page 0
	call	 lcd_num
	bank 0
	mov      lcd_data_head,a
	lcd_display  0,lcd_data_head,@13
lcd_display8_15:
    bank 1
    mov	  A,BCD4
    bank 0
    and      a,@0x0f
    ;mov      lcd_data_num_templ
	;mov	  a,lcd_data_num_templ
	;page 0
	page 0
	call	 lcd_num			;查表 
	or	   a,@0x01
	bank 0
	mov      lcd_data_head,a
	lcd_display  0,lcd_data_head,@15
/*最后一位总为0*/
	mov      lcd_data_head,@0xfa
	lcd_display  0,lcd_data_head,@17	
	lcd_flag_read 0,lcd_data_head,@20
    mov   a,@0x04
    or    lcd_data_head,a
    lcd_flag_display  0,lcd_data_head,@20	;显示 "M3"

;==================================================
;显示金额结束 
;==========================================
ret	
;=============================================	
;BCD转换子程序 
;入口:H4,H3,H2,H1
;出口:B4,B3,B2,B1
;=============================================
HEXTOBCD:
	bank 1
	MOV A,@0X20
	MOV L,A
	MOV A,@0X00
	MOV Bcd1,A
	MOV Bcd2,A
	MOV Bcd3,A
	MOV Bcd4,A
	BC  0X03,0
BCD_next:
	RLC Hex4
	RLC Hex3
	RLC Hex2
	RLC Hex1
	MOV A,@0X01
	AND A,0X03
	;BC  0X03,0
	ADD A,Bcd4
	ADD A,Bcd4
	DAA
	MOV Bcd4,A
	MOV A,@0X01
	AND A,0X03
	;BC  0X03,0
	ADD A,Bcd3
	ADD A,Bcd3
	DAA
	MOV Bcd3,A
	MOV A,@0X01
	AND A,0X03
	;BC  0X03,0
	ADD A,Bcd2
	ADD A,Bcd2
	DAA
	MOV Bcd2,A
	MOV A,@0X01
	AND A,0X03
	;BC  0X03,0
	ADD A,Bcd1
	ADD A,Bcd1
	DAA
	MOV Bcd1,A
	BC  0X03,0
	page 0
	DJZ L
	JMP BCD_next
	bank 0
RET

;=============================================	
;加法子程序 
;入口: (加数)JS1,JS2,JS3,JS4,BJ1,(被加数)BJ2,BJ3,BJ4
;出口:(结果)JS1,JS2,JS3,JS4
;=============================================
byteadd:
	bank   1
	BC 0X03,0
	MOV A,BJ4
	CLR BJ4
	ADD JS4,A
	JBC 0X03,0
	BS BJ4,0
	MOV A,BJ4
	;
	ADD A,BJ3
	CLR BJ3
	JBC 0X03,0
	BS BJ3,0
	ADD JS3,A
	JBC 0X03,0
	BS BJ3,0
	MOV A,BJ3
	;
	ADD A,BJ2
	CLR BJ2
	JBC 0X03,0
	BS BJ2,0
	ADD JS2,A
	JBC 0X03,0
	BS BJ2,0
	MOV A,BJ2
	;
	ADD A,BJ1
	CLR BJ1
	JBC 0X03,0
	BS BJ1,0
	ADD JS1,A
	JBC 0X03,0
	BS BJ1,0
	MOV A,BJ1
RET

;=============================================	
;减一子程序 
;入口: JY1,JY2,JY3,JY4
;出口:JY1,JY2,JY3,JY4
;=============================================
bytesub:
    page 0
    bank   2
    CJNZ    gas_moneyh,bytesub1
    CJNZ    gas_moneyl,bytesub1
    jmp   bytesubend
bytesub1:   
	BC  0X03,0
	MOV A,@0X01
	;SUB JY4,A
	;MOV A,@0X00
	;JBS 0X03,0
	;MOV A,@0X01
	;SUB JY3,A
	;MOV A,@0X00
	;JBS 0X03,0	
	;MOV A,@0X01
	SUB gas_moneyl,A
	MOV A,@0X00
	JBS 0X03,0	
	MOV A,@0X01
	SUB gas_moneyh,A
bytesubend:
RET

;=================电机开=================
mot_open:
	ior	p5cr
	and	a,@0b11111011
	iow	p5cr	;p8ls设为普通IO口 
	bc	 p8cr,mot1;将IO口设为输出口 
	bc	 p8cr,mot2;
	
	bc	 port8,mot1
	bs	 port8,mot2
	
	mov    a, @0x26	
	mov    delay_time1, a
mot_open_delay21:	 
	mov	a, @0x73
	mov    delay_time2,a
mot_open_delay22:
	mov	a, @0x92
	mov    flag, a
mot_open_delay23:
    page 0
	djz    flag	
	jmp    mot_open_delay23
	page 0
	djz    delay_time2
    jmp    mot_open_delay22
    page 0
    djz    delay_time1
    jmp    mot_open_delay21
    
    bc	 port8,mot1
	bc	 port8,mot2
ret

;=================电机关==============
mot_close:
	ior	p5cr
	and	a,@0b11111011
	iow	p5cr	;p8ls设为普通IO口 
	bc	 p8cr,mot1;将IO口设为输出口 
	bc	 p8cr,mot2;
	
	bs	 port8,mot1
	bc	 port8,mot2
	
	mov    a, @0x26
	mov    delay_time1, a
mot_close_delay21:	 
	mov	a, @0x83
	mov    delay_time2,a
mot_close_delay22:
	mov	a, @0x92
	mov    flag, a
mot_close_delay23:
    page 0
	djz    flag	
	jmp    mot_close_delay23
	page 0
	djz    delay_time2
    jmp    mot_close_delay22
    page 0
    djz    delay_time1
    jmp    mot_close_delay21
    
    bc	 port8,mot1
	bc	 port8,mot2
ret
;===========  change pin int ====================
pinchangesub:
	mov 	stack1,a	;保护A
	swap 	stack1
	swapa 	r3	;保护R3
	mov 	stack2,a
    swapa     0x04	  ;保护R4
	mov 	stack3,a
	
	clr 	isr             ;clr icif bit
	disi
	
/*test_int_0_1:   
    bank 1
    page 0
	jbs	change_flag,0
	jmp	dianchi_xiaoshi
	bc	 change_flag,0
	bank 0
	mov	lcd_data_head,@0x08
	lcd_flag_display  0,lcd_data_head,@19
	page 0
	jmp	dianchi_exit
dianchi_xiaoshi:
	bank 1
	bs	 change_flag,0
	bank 0
	mov	lcd_data_head,@0x00
	lcd_flag_display  0,lcd_data_head,@19	
dianchi_exit:*/

	;mov     a,port6
	page 0	
    jbc	 port6,7
    jmp	 full_power
    bank 0
	mov	 lcd_data_head,@0x08
	lcd_flag_display 0,lcd_data_head,@21	;显示 "T3"
	;低电、关阀们 
	bank 1
	bs	status_flag,close
	page 0
	jmp	power_exit
full_power:
    bank 0	
	mov	 lcd_data_head,@0x00
	lcd_flag_display 0,lcd_data_head,@21	;显示 "T
power_exit:
;===============================================
;计量 
;===============================================
	bank 1	
sensor:
    page 0
    jbc port6,7
    jmp sensor1
    page 1
    ;call DELAY10
    page 0
    jbc port6,6
    jmp sensor2
    bank  1   
    bs  status_flag,magnetic_attack
    page 0    
    ;call bytesub
    page 0
    jmp sensorend
sensor1:
    jbs port6,6
    bs  sen,5
    page 0
    jmp sensorend
sensor2:
    page 0
    jbc port6,7
    jmp sensorend
    page 0
    bank 1
    jbs sen,4
    jmp sensorend
    bc  sen,5
    bc  sen,4
    mov a,@0x0f0
    and sen,a
    bs  sen,6
    page 0
    ;call bytesub 
sensorend:
;================================================
;计量完 
;================================================    
retiend:
	swapa 	stack3
	mov 	  r4,a
	swapa 	stack2
	mov 	  r3,a
	swapa 	stack1
reti	
;================================================
	
;===========  lcd init sub ======================
lcd_init:
	;bc		LCDCR,4 	;enable lcd	
	bc 	   0x05,0
	ior	   ioc50
	or	    a,@0x03
	iow	   ioc50	;将port7设置为LCD segment输出 
					   ;每当运行到这句话的时候,LCD屏幕PORT7所对应的段就会被点亮 
					   ;过一会儿就自动熄灭 
	/*bs	  p5cr,0
	bs		p5cr,1*/
	
	ior	   p7cr
	and	   a,@0x00
	iow	   p7cr	;将port7设置为输出 	
	
	mov	   a,@0x00			 	;ra=0	
	mov	   LCD_ADDR,a	
	bc		LCDCR,4 				;disable lcd	
	bc 	   LCDCR,1 				;frame frequency=70.6hz
	bc		LCDCR,0 	
	bc		LCDCR,2 				;a type			
	bs		LCDCR,7 				;1/3bias		
	bc		SBPCR,1
	bc		SBPCR,2 
	bs		LCDCR,5			 	;1/4duty
	bs		LCDCR,6	
ret
;================================================
;===========  int1_init sub ========================
int1_init:   	
	bc 	 0x05,0      	;select ioc page 0
	mov 	a,@0b00111000   ;wdt disable	 关闭WDT
	iow 	wdtcr
	
	ior	 p5cr

⌨️ 快捷键说明

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