📄 cap1p3.asm
字号:
;-----------------------------------------------------------
;-----------------------------------------------------------
;-- 8142A weigh scale display instrument's program --
;-- version:1.2 --
;-- author:Farway --
;-- date:2005-05-21 --
;-----------------------------------------------------------
;-----------------------------------------------------------
;define bits:
;ad7791 spi communication define
cs bit p1.3
sclk bit p1.2
din bit p1.0
dout bit p1.1
;I2C communication of keyboard and LED display chip(zlg7290)
zdata bit p1.5
clk bit p1.4
key_int bit p3.2
;I2C communication of Memory(FM24C64)
scl bit p1.6
sda bit p1.7
wp_24cxx bit p3.4 ;H---write protect
;I2C communication of RTL(sd2003)
rtl_sda bit P1.6 ;IIC的rtl_sda口线
rtl_scl bit P1.7 ;IIC的rtl_scl口线
;buzzer control
p_buzz bit p3.3
;rs485 and rs232 communication
b8052rxd bit p3.0
b8052txd bit p3.1
p_re bit p3.5
;printer drive
p8052rd bit p3.7
p8052wr bit p3.6
;define printer control status
stb bit p2.3 ;printer data select sign
busy bit p2.2 ;printer busying flag;H--busy L--no busy
;power status indication
ac_test bit p2.6 ;AC power indication ;H--AC power using
dc_test bit p2.0 ;DC power indication ;H--DC power full
;program running status indication or calibration
p_cal bit p2.7
;flag bits
f_cross_zero bit 2bh.7 ;表示曾经回过零位的标志:1=未回过,0=回过
f_zero bit 2ch.0 ;零位标志 0-零位 1-非零位
f_wdhz bit 2ch.1 ;使用微打汇总格式 0-不使用 1-使用
f_bfl bit 2ch.2 ;使用填充打印格式标志位 0-不使用填充打印格式 1-使用填充打印格式
f_soft_bt bit 2ch.3 ;面板软件系统参数设置标志位:0-不允许,1=允许
f_stb_led bit 2ch.4 ;称重稳定状态标志
f_start_send bit 2ch.5 ;start sending flag:0-未准备好,1=准备好
f_printer_busy bit 2ch.6
f_total_over bit 2ch.7 ;data over flag
f_record bit 2dh.0 ;存贮器内有称重记录标志:1-有 0-没有
f_flag2 bit 2dh.1 ;通用标志位
;zlg7290 flag bits
ACK BIT 2dh.2 ;应答标志位
KEYON BIT 2dh.3 ;有键按下的标志位
f_compare bit 2dh.4 ;weight data compare flag
FLAG.0 EQU 2dh.5 ;通用标志寄存器(sd2003)
;BIT0=1, ACK ERR
;BIT0=0 ,ACK OK
FLAG.1 EQU 2dh.6
f_stable bit 2dh.7 ;称重示数稳定标志位 1=稳定0=不稳定
f_key_num bit 2eh.0 ;有数字键按下标志
f_filter_rc bit 2eh.1 ;RC低通滤波器赋初值标志
f_gross bit 2eh.2 ;毛重的正负符号标号
f_sign bit 2eh.3 ;净重重量的正负符号标志
;clr为正
;setb为负
f_rd_data bit 2eh.4 ;读取重量数据标志:1=读取 0=未读取
f_SetZero_key bit 2eh.5 ;"置零"键状态标志
f_flag1 bit 2eh.6 ;通用标志位
f_weight_over bit 2eh.7 ;超载标志位0=正常,1=超载
f_function0 equ 2fh ;功能状态寄存器
; ----------------------------------------------------------------------------------
; 2fh.7 2fh.6 2fh.5 2fh.4 2fh.3 2fh.2 2fh.1 2fh.0
; ----------------------------------------------------------------------------------
; 线性校正 扩展显示 按键音 皮重功能 自动去皮 自动清皮 数字键输入皮重值 保留
; ----------------------------------------------------------------------------------
; 1=允许 0=禁止
;define constant
ram equ 30h
c_sp equ 0d0h ;stack address
c_time0 equ 0d8h ;10ms
;zlg7290 define
ZLG7290 EQU 70H ;ZLG7290的器件地址
;FM24Cxx define
FADDR EQU 0a0h ; fixed address for AT24Cxx EEPROMs
;PADDR EQU 0 ; programmable address (0..7)
SIZE01 EQU 80h ; bytes per AT24C01
SIZE02 EQU 100h ; bytes per AT24C02
SIZE04 EQU 200h ; bytes per AT24C04
SIZE08 EQU 400h ; bytes per AT24C08
SIZE16 EQU 800h ; bytes per AT24C16
;AT24C01 of PSIZE EQU 8
PSIZE01 EQU 8 ; bytes per page for AT24C01
PSIZE EQU 16 ; bytes per page for AT24C02~16
c_filter_base0 equ 06h;07h
c_filter_base1 equ 40h;0d0h ;内码转外码的因子
;impsr data 85h
;sconf data 0bfh
;define RAM register
time_0a data ram ;30h
time_1a data ram+1 ;31h
;kb_lock data ram+2 ;32h(已用于打印缓冲区的数据暂存)
;zlg7290 ram define
MTD EQU ram+3 ;33h~34h 发送数据缓冲器
MRD EQU ram+5 ;35h 接收数据缓冲区
SLA DATA ram+6 ;36h 器件的从地址
SUBA DATA ram+7 ;37h 器件的子地址
NUMBYTE DATA ram+8 ;38h 读/写的字节数变量
DISP_BUF EQU ram+9 ;39h~3eh 显示缓冲区
m_date_time data ram+15 ;3fh 时间/日期键的按键次数
;ad7791
weigh_num data ram+16 ;40h
weigh_min0 data ram+17 ;41h
weigh_min1 data ram+18 ;42h
weigh_min2 data ram+19 ;43h
weigh_max0 data ram+20 ;44h
weigh_max1 data ram+21 ;45h
weigh_max2 data ram+22 ;46h
weigh_0 data ram+23 ;47h
weigh_1 data ram+24 ;48h
weigh_2 data ram+25 ;49h
weigh_3 data ram+26 ;4ah
m_filter_rc equ ram+27 ;4bh
c_weight_scale equ ram+28 ;4ch xx个内码显示一个分度数
m_filter_rc1 data ram+29 ;4dh
m_filter_rc2 data ram+30 ;4eh
m_filter_rc3 data ram+31 ;4fh
;define the general register
;时间寄存器
YEAR EQU ram+32 ;50h 年
MONTH EQU ram+33 ;51h 月
DATE EQU ram+34 ;52h 日
DAY EQU ram+35 ;53h 星期(已用于打印缓冲区的数据暂存)
HOUR EQU ram+36 ;54h 小时
MINUTE EQU ram+37 ;55h 分钟
SECOND EQU ram+38 ;56h 秒
;单片机与实时时钟间通信寄存器
TIMETEMP EQU 2fh ;2fh 时间标志寄存器
TIMETX EQU ram+39 ;57h 时间数据发送寄存器
TIMERX EQU ram+40 ;58h 时间数据接收寄存器
;m_gross_count data ram+41 ;59h "毛重/净重"按键次数(已用于打印缓冲区的数据暂存)
m_tare_count data ram+42 ;5ah "去皮"按键次数
m_gross_0 equ ram+43 ;5bh 毛重字节0
m_gross_1 equ ram+44 ;5ch 毛重字节1
m_gross_2 equ ram+45 ;5dh 毛重字节2
m_tare_0 data ram+46 ;5eh 皮重字节0
m_tare_1 data ram+47 ;5fh 皮重字节1
m_tare_2 data ram+48 ;60h 皮重字节2
m_function_key data ram+49 ;61h 参数设置选择功能键
;FM24Cxx define
addr_h data ram+50 ;62h 2-byte address register
addr_l data ram+51 ;63h 2-byte address register
;------------------------------------------------------------------
m_weight_L0 data ram+52 ;64h 滤波后重量值0
m_weight_L1 data ram+53 ;65h 滤波后重量值1
m_weight_L2 data ram+54 ;66h 滤波后重量值2
m_weight_p0 data ram+55 ;67h 重量修正用寄存器0
m_weight_p1 data ram+56 ;68h 重量修正用寄存器1
m_weight_p2 data ram+57 ;69h 重量修正用寄存器2
m_divid_value equ ram+58 ;6ah 称的分度值的有效数字
m_divid_e0 equ ram+59 ;6bh 称的分度值的小数部分0
m_divid_e1 equ ram+60 ;6ch 称的分度值的小数部分1
m_divid_number0 equ ram+61 ;6dh 称的分度数0
m_divid_number1 equ ram+62 ;6eh 称的分度数1
m_code_max0 equ ram+63 ;6fh 称的最大外码值0
m_code_max1 equ ram+64 ;70h 称的最大外码值1
m_code_max2 equ ram+65 ;71h 称的最大外码值2
m_dp_position equ ram+66 ;72h 小数点位置
m_OpenAutoClrZero equ ram+67 ;73h 开机自动清零范围
m_KeyClrSpan equ ram+68 ;74h 按键自动清零范围
m_AutoZeroFollow equ ram+69 ;75h 自动零跟踪阀值
;m_Warm_upTime equ ram+70 ;76h 开机预热时间(已用于蠕变补偿的定时)
time_1b equ ram+70 ;76h
;m_UnitSelect equ ram+71 ;77h 单位选择(已用于打印缓冲区的数据暂存)
m_FixValueAlam equ ram+72 ;78h 设定值报警
m_base_0 equ ram+73 ;79h 重量值底数字节0
m_base_1 equ ram+74 ;7ah 重量值底数字节1
m_base_2 equ ram+75 ;7bh 重量值底数字节2
m_DigitalFilter equ ram+76 ;7ch 数字滤波器的滤波深度
org 0000h
ljmp start_program
org 0003h
ljmp int0_int ;int0
org 000bh
ljmp time0_int ;T0
org 001bh
;ljmp time1_int ;T1
reti
org 0023h
ljmp sbuf_int ;serial communication
;reti
;=============================================================
org 0030h
;(30h)machine name:8142A (4bytes)(R)
;(31h)machine SN :200505210001 (6bytes)(R)
;(32h)machine addr:1.0 (1byte)(W/R)
;(33h)hardware ver:1.0 (1byte)(R)
;(34h)software ver:1.0 (1byte)(R)
;(35h)company name:Honsta (1byte)(R)
;(36h)memory chip wrong:0a5h (1byte)(W/R) ;only 0a5h is right,and the other is wrong
JQ_name:
db 81h,42h,0Ah,00h
JQ_SN:
db 05h,05h,21h,00h,01h
JQ_addr:
db 01h
hardware_ver:
db 10h
software_ver:
db 01h,00h
company_name:
db 'HONSTA'
fm24c64_wrong:
db 0a5h
;------------------------------------------------------------------------------------
start_program:
; clr ea
mov psw,#00h
nop
mov sp,#c_sp
nop
nop
clr flag.0
clr flag.1
ini_csh:
MOV SCON,#01010000B ;串口Mode 1
mov tmod,#21h
lcall baud_set ;设置波特率
setb ea
setb es
SETB TR1
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
mov th0,#c_time0
lcall long_delay
lcall long_delay ;delay 600ms
;mov impsr,#01h
;mov sconf,#02h
setb it0
;setb ps
setb et0 ;OPEN time0
;setb et1 ;OPEN time1
setb ex0 ;open ext int0
setb tr0
clr p_buzz
lcall delay20ms
setb p_buzz
lcall led_testself ;数码管自检
lcall StatusLed_testself ;状态指示灯自检
ini_csh0:
setb key_int
setb p8052wr
setb p8052rd ;74hc377控制
lcall spi_ini
lcall ini_ad7791
lcall ini_data
lcall ini_sd2003 ;ini RTL(SD2003AP)
lcall ini_system_parameter
lcall get_weight_scale ;计算出x个内码转换为一个分度数
lcall check_adc ;检查传感器或A/D
jb p_cal,no_cal
jmp parameter_set
no_cal:
lcall lack_weighting
mov r0,m_OpenAutoClrZero
lcall weighting_ClrZero_span
lcall over_weighting
lcall find_zero_point
;=========================================================
main_loop:
;debug:
;mov dptr,#print_tab0
;mov r3,#2
;lcall prn_send_loop ;打印机初始化
;mov dptr,#font_style
;mov r3,#3
;lcall prn_send_loop ;字体类型:显赫体
;mov dptr,#printhead_position
;mov r3,#2
;lcall prn_send_loop ;打印头归位
;mov dptr,#line_length
;mov r3,#3
;lcall prn_send_loop ;走纸
;mov 1eh,#01h
;mov 1fh,#00h
;mov 19h,#06h
;mov 1ah,#07h
;mov 1bh,#22h
;mov 16h,#14h
;mov 17h,#51h
;mov 18h,#01h
;mov 08h,#00h
;mov 09h,#30h
;mov 0ah,#39h
;mov 14h,#4dh
;mov 15h,#58h
;mov dptr,#print_space
;mov r3,#9
;lcall prn_send_loop ;空格
;lcall sn_PrntData
;mov a,#13
;lcall printer_cr ;打印
;mov dptr,#print_space
;mov r3,#10
;lcall prn_send_loop ;空格
;lcall date_data_send
;mov a,#13
;lcall printer_cr ;打印
;mov dptr,#print_space
;mov r3,#10
;lcall prn_send_loop ;空格
;lcall time_data_send
;mov a,#13
;lcall printer_cr ;打印
;mov dptr,#print_space
;mov r3,#10
;lcall prn_send_loop ;空格
;lcall vehicle_PrntData
;mov a,#13
;lcall printer_cr ;打印
;mov dptr,#print_space
;mov r3,#10
;lcall prn_send_loop ;空格
;lcall cargo_PrntData
;mov a,#13
;lcall printer_cr ;打印
;mov dptr,#print_space
;mov r3,#10
;lcall prn_send_loop ;空格
;mov r5,0eh
;mov r6,0fh
;mov r7,10h
;lcall btd0 ;毛重数据(out:r6r5r4)
;lcall dp_position_data ;发送带小数点的称重数据
;mov a,#13
;lcall printer_cr ;打印
;mov dptr,#print_space
;mov r3,#10
;lcall prn_send_loop ;空格
;mov r5,0bh
;mov r6,0ch
;mov r7,0dh
;lcall btd0 ;皮重数据(out:r6r5r4)
;lcall dp_position_data ;发送带小数点的称重数据
;mov a,#13
;lcall printer_cr ;打印
;mov dptr,#print_space
;mov r3,#10
;lcall prn_send_loop ;空格
;lcall client_PrntData ;扣率
;mov a,#13
;lcall printer_cr ;打印
;mov dptr,#print_space
;mov r3,#10
;lcall prn_send_loop ;空格
;mov r5,11h
;mov r6,12h
;mov r7,13h
;mov 1ch,08h ;保护车号的最高字节
;lcall btd0 ;净重数据(out:r6r5r4)
;lcall dp_position_data ;发送带小数点的称重数据
;mov a,#13
;lcall printer_cr ;打印
;mov dptr,#top_page
;mov r3,#3
;lcall prn_send_loop ;空格
;mov a,#13
;lcall printer_cr ;打印
;mov dptr,#bottom_page
;mov r3,#3
;lcall prn_send_loop ;走纸
;mov a,#13
;lcall printer_cr ;打印
;mov dptr,#printhead_position
;mov r3,#2
;lcall prn_send_loop ;打印头归位
;jmp main_loop
setb wp_24cxx ;write protect
lcall rd_ad7791 ;AD process
lcall p_weight
lcall weight_mend
lcall key_ClrZero ;按键置零功能
lcall AutoZeroFollow ;自动零跟踪
lcall get_gross
lcall get_weight
lcall scale_over ;超载判断
jb f_weight_over,main_loop
lcall get_net ;若去皮寄存器为零,得到毛重;若去皮寄存器不为零,得到净重
mov a,sp
cjne a,#0d0h,reset_system
lcall dis_weight_led ;显示重量
lcall get_sbuf_data ;将通讯数据写入缓冲区
lcall sbuf_int ;发送数据
lcall keyboard_p
jmp main_loop
;-------------------------------
reset_system:
mov psw,#00h
nop
mov sp,#c_sp
nop
nop
clr flag.0
clr flag.1
MOV SCON,#01010000B ;串口Mode 1
mov tmod,#21h
lcall baud_set ;设置波特率
setb ea
setb es
SETB TR1
mov th0,#c_time0
setb it0
setb et0 ;OPEN time0
setb ex0 ;open ext int0
setb tr0
jmp ini_csh0
;==========================================================
ini_data:
mov r0,#08h ;判断'车号皮重'存贮指针的值若=00h,or,0ffh,or,<005bh
mov r2,#2 ;则赋值005bh
mov addr_h,#00h
mov addr_l,#59h
lcall fm_read_block
mov a,08h
jnz fm_dptr_ini0
mov a,09h
jnz fm_dptr_ini0 ;=00?
jmp fm_dptr_ini
fm_dptr_ini0:
mov a,08h
cpl a
jnz fm_dptr_ini1
mov a,09h
cpl a
jnz fm_dptr_ini1
jmp fm_dptr_ini ;=ffh?
fm_dptr_ini1:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -