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