📄 iccard.dt
字号:
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 + -