基于单片机的电子秤程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
A_8255 EQU 7C00H
B_8255 EQU 7D00H
C_8255 EQU 7E00H
CON_8255 EQU 7F00H;8255端口定义
ADC_0808 EQU 8000H;ADC0809地址ZHONGLIANG EQU 15H;重量存放地址
DANJIA EQU 16H;单价存放地址
EOC EQU P3.3
W8 EQU 0FEH
W7 EQU 0FDH
W6 EQU 0FBH
W5 EQU 0F7H
W4 EQU 0EFH
W3 EQU 0DFH
W2 EQU 0BFH
W1 EQU 07FH;定义LED位码
;;;;;;;;;主程序;;;;;;;;;;
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP EINT0S
ORG 0100H
MAIN: MOV P1,#0F0H
SETB TCON.0; 外部中断为下降沿触发
MOV IE,#81H; 外部中断开中断
MOV DPTR,#CON_8255
MOV A,#80H;状态字
MOVX @DPTR,A;8255初始化
LOOP: PUSH DPH
PUSH DPL
PUSH ACC
MOV DPTR,#ADC_0808
MOV A,#00H
MOVX @DPTR,A;启动0808,A无实际意义
ADLP1:JNB EOC,ADLP1
ADLP2:JB EOC,ADLP2
MOVX A,@DPTR;读
MOV ZHONGLIANG,A
POP ACC
POP DPL
POP DPH
MOV A,ZHONGLIANG
LCALL XIANSHI1;调用显示程序
MOV A,DANJIA
LCALL XIANSHI2
MOV A,ZHONGLIANG
MOV B,DANJIA
MUL AB;算出总价
LCALL XIANSHI3;只显示低八位
SJMP LOOP
;;;;;;;;;;;;;;;键盘子程序;;;;;;;;;
EINT0S:
LCALL KEY ;调用键盘扫描程序
KEY: CLR EA ;中断总禁止
PUSH PSW ;PSW入栈
LCALL DELAY ;调用延时程序去抖动
LCALL KS ;调用检测按键子程序
JNZ SAOMIAO ;若有按键则跳转至扫描
LJMP INT0R
SAOMIAO:
ACALL K1 ;调用键盘扫描程序
INC A
MOVC A,@A+PC ;查表后将值送入累加器
MOV DANJIA,A ;在P0口显示键盘值
K1: ;键盘扫描子程序
MOV R2,#0EFH ;将扫描值送入R2暂存
MOV R4,#00H ;R4用于存放行值,并将00H暂存
K3: MOV P1,R2 ;将R2的值送入P1口
L6: JB P1.0,L1 ;P1.0等于1跳转到L1
MOV A,#00H ;将第一列的列值00H送入ACC
AJMP LK ;跳转到键值理程序进行键值处理L1: JB P1.1,L2
MOV A,#03H
AJMP LK
L2: JB P1.2,L3
MOV A,#06H
AJMP LK ;跳转到键值处理程序
L3: JB P1.3,NEXT
MOV A,#09H;
LK: ADD A,R4 ;行值和列值等于键值
PUSH ACC; ;A入栈
K4: LCALL DELAY ;调用延时程序,去抖动
LCALL KS
JNZ K4 ;按键没有松开继续返回检测
POP ACC ;A出栈
RET
NEXT:
INC R4 ;将行值加一
MOV A,R2;
JNB ACC.6,INT0R ;未扫描出键值退出中断
RL A ;扫描未完成将A中的值右移一位进行下一列的扫描
MOV R2,A ;将ACC的值送入R2暂存
AJMP K3 ;检测下一行
KS: ;按键检测程序
MOV P1,#0FH ;将P1口高四位置0低四位值1
MOV A,P1 ;读P1口
XRL A,#0FH ;将A中的值与0FH相异或
RET
DELAY:; 10ms延时去抖动子程序2*FA*2=10ms MOV R5,#02H
L7: MOV R6,#0FAH
L8: DJNZ R6,L8
DJNZ R5,L7
RET
INT0R: POP PSW
MOV P1,#0F0H
SETB T CON.0
MOV IE,#81H
RETI
;;;;;;;;;显示子程序1;;;;;;;;;
XIANSHI1: MOV B,#100
DIV AB
LCALL AA1;取段码
MOV DPTR,#B_8255 MOVX @DPTR,A;送段码
MOV DPTR,#A_8255
MOV A,#W8
MOVX @DPTR,A;送位码
LCALL DLY1
;十位数
MOV A,B
MOV B,#10
DIV AB
LCALL AA1;取段码
MOV DPTR,#B_8255 MOVX @DPTR,A;送段码
MOV DPTR,#A_8255
MOV A,#W7
MOVX @DPTR,A;送位码
LCALL DLY1
;个位
MOV A,B
LCALL AA1;取段码
MOV DPTR,#B_8255 MOVX @DPTR,A;送段码
MOV DPTR,#A_8255
MOV A,#W6
MOVX @DPTR,A;送位码
LCALL DLY1
RET
AA1: INC A
MOVC A,@A+PC
RET
DB 03FH,06H,05BH,04FH,66H,06DH DB 07DH,07H,07FH,06FH,77H,07CH DLY1: MOV R7,#18
D11: MOV R6,#210
DJNZ R6,$
DJNZ R7,D11
RET
;;;;;;;;;显示子程序2;;;;;;;;;