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

📄 iccard.dt

📁 使用EM78P468单片机做的IC卡煤气表程序。
💻 DT
📖 第 1 页 / 共 5 页
字号:
include "EM78P468.inc" 			;468头文件	
	
/*
P6.2--CLK
P6.3--I/O
P6.4--RST
P6.5--POWER_CONTROL
*/

;===========  常数定义 ==========================
count1_data	==	255		;count1预置值 
icio     	   equ    3    ;数据脚 
icclk    	   equ    2    ;时钟脚 
icrst		   equ	4
mot1	 	   equ	0
mot2	 	   equ	1
mot_status      equ	0
close           equ    1
open            equ    2
bat_status      equ    3
ic_card_in      equ    4
ic_card_op_end  equ	5
magnetic_attack equ    6

;===========  寄存器定义 ========================
tempr4	   ==	0x12		;r4临时寄存器 
Status   	==	0x03
storeacc	 ==	0x10
storestatus  ==    0x11
delay_time1  ==	0x10		;r4临时寄存器 
delay_time2  ==    0x11
flag		 ==    0x12

;======================bank 0=====================
lcd_data_head     ==    0x23
lcd_data_num      ==	0x24

ic_compare_password_flag == 0x22
temp			== 0x19;延时 
temp1		   == 0x20;延时 
err_temp1       == 0x25
err_temp2	   == 0x24;lcd_data_num
process_temp    == 0x07
rmm_temp		== 0x08

;****************************
;IIC存储器定义 
;****************************
REND_24     	==    1    	   ;读完毕标志(0=未完毕,1=完毕)
IIC_DBUF_24	 ==    0X24		;发送/接受自SDA口的数据缓冲器 
TT_24       	==    0X25        ;标志寄存器 
SLAVE_24   	 ==    0X26        ;从器件地址寄存器(1010XXX0)
ADDR_24    	 ==    0X27        ;地址寄存器 
DATA_24    	 ==    0X28        ;写入/读自I2C的数据寄存器 
NUM_24     	 ==    0X29        ;页写/页读字节数 
;		 ==    
;=======IC卡数据定义========
ic_buffer1	  == 0x30
rmm_address     == 0x31
rmm_len         == 0x32
wmm_address	 == 0x33
wmm_data  	  == 0x34
rsm_data1	   == 0x35
rsm_data2	   == 0x36
rsm_data3	   == 0x37
rsm_data4	   == 0x38
wsm_address 	== 0x39
wsm_data		== 0x3a
ic_command1	 == 0x3b
ic_command2	 == 0x3c
ic_command3	 == 0x3d
password_data   == 0x3e
len			 == 0x3f

COUNT_24		== 0x16
DBUF_24		 == 0x21

rpm_data1     ==	0x2a
rpm_data2     ==	0x2b
rpm_data3     ==	0x2c
rpm_data4     ==	0x2d
wpm_data	  ==	0x2e
wpm_address   ==	0x2f

;=====================bank 1========================
;BCD转换 
L   ==0X20
Hex1==0X21
Hex2==0X22
Hex3==0X23
Hex4==0X24
Bcd1==0X25
Bcd2==0X26
Bcd3==0X27
Bcd4==0X28

sen==0x2a	;计量寄存器 

display_err_flag   == 0x30
display_money_flag == 0x31
status_flag        == 0x32		;状态标志 

;加法 
BJ1==0X3f
BJ2==0X3e
BJ3==0X3d
BJ4==0X3c
JS1==0X3b
JS2==0X3a
JS3==0X39
JS4==0X38

change_flag	==0x37
stack1		 ==0x33
stack2		 ==0x34
stack3		 ==0x35
stack4		 ==0x36
;=====================bank 2========================
;IC卡读取内存 
;bank 2
card_temp	 ==0x2f	;临时变量 
ram_address   ==0x2e
data_buffer   ==0x2d
card_code1	==0x20	;0xA2
card_code2	==0x21	;0x13
card_code3	==0x22	;0x10
card_code4	==0x23	;0x91
system_code1  ==0x24	;g
system_code2  ==0x25	;a
system_code3  ==0x26	;s
system_code4  ==0x27	;_
system_code5  ==0x28	;0
system_code6  ==0x29	;0
system_code7  ==0x2a	;0
system_code8  ==0x2b	;1
card_type	 ==0x2c	;
/******** 各种卡的类型代码定义 ***********
#define TIME      0xaa
#define CLEAR     0x5a
#define INIT      0xa1
#define EXAMINE   0x5e
#define USER_OLD  0x58
#define USER_NEW  0x59
#define COPY      0xa9
#define READ      0xaf
#define SET       0xa8
#define SET1      0xf0
#define MOT       0xa0
#define REPAIR    0x77
/*****************************************/
charge_moneyl  ==0x30	;本次冲值金额低位 
charge_moneyh  ==0x31	;本次冲值金额高位 
user_id1	   ==0x32	;用户编码 
user_id2	   ==0x33
user_id3	   ==0x34
user_id4       ==0x35
sensor_status  ==0x36	;5A表示强磁 
charge_sum1	==0x37	;高位 
charge_sum2	==0x38	;  |
charge_sum3	==0x39	;  |	
charge_sum4	==0x3a	;低位 

gas_moneyl	 ==0x3e	;表中存在的金额低位 
gas_moneyh	 ==0x3f	;表中存在的金额高位 

;=====================bank 3========================
eprom_buffer1  ==0x20
eprom_buffer2  ==0x21
eprom_buffer3  ==0x22
eprom_buffer4  ==0x23
iic_ram_address ==0x24

;===================宏定义===============================
set_clk_out MACRO
	bc    0x05,0
	ior	p6cr
	and	a,@0b11111011
	;mov	a,@0x
	iow	p6cr
	;bc	 p6cr,2
ENDM

set_rst_out macro
	bc    0x05,0
	ior	p6cr
	and	a,@0b11101111
	iow	p6cr
endm
	
set_io_in  macro
	bc    0x05,0
	ior	p6cr
	or	 a,@0b00001000
	iow	p6cr
	;bs	p6cr,3
endm

set_io_out macro
	bc    0x05,0
	ior	p6cr
	and	a,@0b11110111	;P6.3
	iow	p6cr
endm
;=================
;设置SCL,SDA为输出口0 
;=================
iic_SDA_OUT    MACRO
	bc    0x05,0
	ior	p6cr
	and	a,@0b11111100
	iow	p6cr
ENDM
;=================
;设置SCL-P6.1为输出口0,SDA-P6.0为输入口1 
;=================
iic_SDA_IN    MACRO
	bc    0x05,0
	ior	p6cr
	and	a,@0b11111101
	or	 a,@0b00000001
	iow	p6cr
ENDM

;=================
; COMPARE AND JUMP IF REG1<REG2
;=================
CJL    MACRO    REG1,REG2,ADDRESS
    MOV    A,REG2
    SUB    A,REG1
    JBS    0X03,0
    JMP    ADDRESS
ENDM
;=================
; COMPARE AND JUMP IF REG<@LITERAL
;=================
CJL    MACRO    REG,@LITERAL,ADDRESS
    MOV    A,@LITERAL
    SUB    A,REG
    JBS    0X03,0
    JMP    ADDRESS
ENDM
;=================
; COMPARE AND JUMP IF REG<>@LITERAL
;=================
CJNE    MACRO    REG,@LITERAL,ADDRESS
    MOV    A,@LITERAL
    SUB    A,REG
    JBS    0X03,2
    JMP    ADDRESS
ENDM

;=================
; COMPARE AND JUMP IF REG<=@LITERAL
;=================
CJLE    MACRO    REG,@LITERAL,ADDRESS
    MOV    A,REG
    SUB    A,@LITERAL
    JBC    0X03,0
    JMP    ADDRESS
ENDM
;=================
; COMPARE AND JUMP IF REG=@LITERAL
;=================
CJE    MACRO    REG,@LITERAL,ADDRESS
    MOV    A,@LITERAL
    SUB    A,REG
    JBC    0X03,2
    JMP    ADDRESS
ENDM

;=================
; COMPARE AND JUMP IF REG=0
;=================
CJEZ    MACRO    REG,ADDRESS
    MOV    REG,REG
    JBC    0X03,2
    JMP    ADDRESS
ENDM
;=================
; COMPARE AND JUMP IF REG<>0
;=================
CJNZ    MACRO    REG,ADDRESS
    MOV    REG,REG
    JBS    0X03,2
    JMP    ADDRESS
ENDM
;=================
; COMPARE AND JUMP IF REG>@LITERAL
;=================
CJG    MACRO    REG,@LITERAL,ADDRESS
    MOV    A,REG
    SUB    A,@LITERAL
    JBS    0X03,0
    JMP    ADDRESS
ENDM

;=================
; COMPARE AND JUMP IF REG1>REG2
;=================
CJG    MACRO    REG1,REG2,ADDRESS
    MOV    A,REG1
    SUB    A,REG2
    JBS    0X03,0
    JMP    ADDRESS
ENDM
;=================
; COMPARE AND JUMP IF REG1<>REG2
;=================
CJNE    MACRO    REG1,REG2,ADDRESS
    MOV    A,REG2
    SUB    A,REG1
    JBS    0X03,2
    JMP    ADDRESS
ENDM

;=================
; MOVE REG2 TO REG1
;=================
MOV     MACRO    REG1,REG2
    MOV    A,REG2
    MOV    REG1,A
ENDM

;=================
; MOVE @LITERAL INTO REG
;=================
MOV    MACRO    REG,@LITERAL
    MOV    A,@LITERAL
    MOV    REG,A
ENDM

;===========  lcd display macro ===================
;================================================	
lcd_display macro bank_lcd,lcd_data_head,@lcd_address

	bank	   bank_lcd
	;mov		a,@lcd_data_num
	;mov		lcd_data_head,a
	;bs		 LCDCR,4	;enable LCD
	mov		a,@lcd_address
	mov		LCD_ADDR,a	
	mov		a,@lcd_data_head
	mov		r4,a
	bank	   bank_lcd
;$display_next:
	mov		a,r0			;get data
	mov		LCD_DB,a		
	inc		LCD_ADDR
	swapa	  r0
	;mov		a,r0
	mov		LCD_DB,a		
	;djz		lcd_data_head
	;jmp		$display_next
	bs		 LCDCR,4 	;enable lcd		
	nop
	endm

;================================================	
lcd_data_read macro bank_lcd,lcd_data_head,@lcd_address

	bank	   bank_lcd
	;mov		a,@lcd_data_num
	;mov		lcd_data_head,a
	;bs		 LCDCR,4	;enable LCD
	mov		a,@lcd_address
	mov		LCD_ADDR,a	
	mov		a,@lcd_data_head
	mov		r4,a
	bank	   bank_lcd
;$display_next:
    mov		a,LCD_DB
    and        a,@0x0f
	mov		r0,a			;get data
	swap       r0		
	inc		LCD_ADDR	
	;mov		a,r0
	mov		a,LCD_DB
	and        a,@0x0f
	or         r0,a
	swap       r0		
	;djz		lcd_data_head
	;jmp		$display_next
	;bs		 LCDCR,4 	;enable lcd		
	nop
	endm	
;===========  lcd flag display macro ===================
;================================================	
lcd_flag_display macro bank_lcd,lcd_data_head,@lcd_address

	bank	   bank_lcd
	;mov		a,@lcd_data_num
	;mov		lcd_data_head,a
	;bs		 LCDCR,4	
	mov		a,@lcd_address
	mov		LCD_ADDR,a	
	mov		a,@lcd_data_head
	mov		r4,a
	bank	   bank_lcd
;$display_next:
	mov		a,r0			;get data
	mov		LCD_DB,a		
	;inc		LCD_ADDR
	;swapa	  r0
	;mov		a,r0
	;mov		LCD_DB,a		
	;djz		lcd_data_head
	;jmp		$display_next
	bs		 LCDCR,4 	;enable lcd		
	nop
	endm
;================================================	
lcd_flag_read macro bank_lcd,lcd_data_head,@lcd_address

	bank	   bank_lcd
	;mov		a,@lcd_data_num
	;mov		lcd_data_head,a
	;bs		 LCDCR,4	
	mov		a,@lcd_address
	mov		LCD_ADDR,a		
	mov		a,@lcd_data_head
	mov		r4,a
	bank	   bank_lcd
;$display_next:
    mov		a,LCD_DB	
    and	    a,@0x0f
	mov		r0,a			;get data
	;inc		LC_ADDR
	;swapa	  r0
	;mov		a,r0
	;mov		LCD_DB,a		
	;djz		lcd_data_head
	;jmp		$display_next
	;bs		 LCDCR,4 	;enable lcd		
	nop
	endm
;===========  程序 ==============================
	org	000h
	page    0			
	jmp	start			;main program
	org	006h		    ;INT0
	page	0
	jmp	int1		
	org    00ch			 ;count1 int server		 
	page    0
	jmp	count1_int
	org    018h			;pin change int	
	page	0
	jmp    pinchangesub 

lcd_num:
	add	 pc,a
	retl	@0xfa	
	retl	@0xc0
	retl	@0x7c
	retl	@0xf4	
	retl	@0xc6
	retl	@0xb6
	retl	@0xbe
	retl	@0xe0
	retl	@0xfe
	retl	@0xf6	
;=========================  main program =========================
;=========================  main program ========================
;=========================  main program ========================
;=========================  main program ========================
;=========================  main program ========================

start:	
	bs	sbpcr,0		;cpus=1
	bs	sbpcr,4		;main clock=2.13M
	bc	sbpcr,5
	bc	sbpcr,6
main:
	;.
	;.
	;.
	mov     a,@0xfe
	iow     p6cr
	page    0
	call    lcd_init		;初始化LCD
	;page    1
	page    0
	call	 int1_init	  ;初始化外部中断	
	page    0
	call     count1_init	;初始化时钟中断 
	mov	  a,@32
	mov      lcd_data_num,a
clr_data:
	mov		a,lcd_data_num
	mov		lcd_addr,a
	mov		a,@0x00
	mov		lcd_db,a
	page    0
	djz		lcd_data_num
	jmp		clr_data
	eni				;enable int
	
  
    nop 
    bs     0x05,0
	ior	p6cr
	and	a,@0b11011111
	iow	p6cr
	bc	 port6,5	;IC卡读写掉电 
	bank   0
	mov    ic_buffer1,@0
	;mov      ic_read_flag,@1

;==========init port6 change wakeup==================
	bc  0x05,0 	;select ioc page
	mov a,@0xc0	;p67 is input
	iow ioc60
	mov a,@0xc0 	;p67 internal pullhigh
	iow p6ph
	mov a,@0b00000000 ;wdt disable
	iow wdtcr
	mov port6,port6 	;read port6
	eni 			;eable grobal interrupt
	mov a,@0b00000010 ;p6 input status
	mov wucr,a
	
	mov a,@0b10000000 ;enable p6 intput
	ior imr
	or  a,@0b10000000
	iow imr
	
	bs  wucr,2	;disable p8
	ior ioc50
	and a,@0b11110011
	iow ioc50	;select p8 as normal
	mov a,@0xff
	iow p8cr		;set input pin
;=======================================

	ior	p5cr
	and	a,@0b11111011
	iow	p5cr	;p8ls设为普通IO口 
	bs	 p8ph,mot1
	bs	 p8ph,mot2
	bc	 p8cr,mot1;将IO口设为输出口 
	bc	 p8cr,mot2;
	bs	 port8,mot1
	bs	 port8,mot2	
	
	call init_data;初始化数据 
loop: 
		
	nop
	nop
	;page 1
	;call	ic_read_data_block
	nop
    ;bank 0
	
	;inc	  lcd_data_num
	;cjle	 lcd_data_num,@0x09,loop
	nop
;ic_read:

	;mov      0x2a,@2
	;bs	 0x03,5	;select page 1
	;call   ic_reset

	;mov	  ic_buffer1,@0x22
       
	nop
	nop
	page    2
	call    ic_work
	nop
	nop
	page    2
	call    measure
	nop
	nop
	page    3
	call    mot_control
	nop
	nop	
	slep 		;in sleep mode
	nop
	nop
	page   0
	jmp   loop
;========================= End main program ========================
;========================= End main program ========================
;========================= End main program ========================
;========================= End main program ========================	
	
;===================================
;IC卡退出操作 
;===================================
Ic_Card_Exit:
	;bank 0
	;mov	lcd_data_head,@0x00

⌨️ 快捷键说明

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