单片机电子秤设计软件程序清单

时间:2020-08-28 18:07:51 电子信息工程毕业论文 我要投稿

单片机电子秤设计软件程序清单

程序清单
;定义  中文LCD液晶 128X64 的地址
W_C_GLCD   XDATA  0E000H
W_D_GLCD   XDATA  0E001H
R_B_GLCD   XDATA  0E002H
R_D_GLCD   XDATA  0E003H
;-------------------------------------------------------
TIMER0     DATA  30H ;延时时间的初值
TIMER1     DATA  31H ;调用延时子程序的次数
DATA1      DATA  32H ;点阵显示的变量1
DATA2      DATA  33H ;点阵显示的变量2
X          DATA  34H ;X方向的'位置
Y          DATA  35H ;Y方向的位置
COUNTER    DATA  36H ;计数器
N          DATA  37H ;行数变量
D1         DATA  38H ;点变量1
D2         DATA  39H ;点变量1
ADDR       DATA  3AH ;起始的显示位置
ADDR1      DATA  3BH ;起始的显示位置临时变量
N1         DATA  3CH ;行数的临时变量
;*******************************************************
;*                                主程序开始                                       
;*******************************************************
ORG     0000H
AJMP    START
ORG     0030H
START:   CLR     P1.0
         SETB    P1.1
         MOV     SP,#60H
    LCALL   INITIAL_GLCD      ; 调用LCD初始化
         LCALL   KAIJI             ; 显示开机画面
         LCALL   DELAY500
         LCALL   DELAY500
         LCALL   DELAY500
         LCALL   TISHI             ; 显示主界面
         LCALL   INI_8279
;------------------------------------------
;判断是否继续
;------------------------------------------
KEY_A:     MOV     DPTR,#8101H     ; 8101H为8279命令
           MOVX    A,@DPTR         ; 读状态字
            ANL     A,#07H          ; 判断低三位是否为0
           CJNE    A,#00H,LP1      ; 不为0(有键按下)则跳转
           SJMP    KEY_A           ; 为0(没键按下)则继续查询
LP1:       MOV     DPTR,#8100H     ; 8100H为8279数据口
           MOVX    A,@DPTR         ; 读键值
           CJNE    A,#0DBH,KEY_A   ; 判断是否按D键
           AJMP    K1
K1:        LCALL   YUZHI            ; 值设定
           LCALL   celianjieguo     ; 结果显示界面
           LCALL   CELIANGJIEGUO    ; 结果显示
           AJMP    $
;*******************************************************
;*                                主程序开始                                       
;*******************************************************
;=======================================================
;各界面显示内容
;=======================================================
DHTABLE1:  DB      "  欢  迎  使  用  "
DHTABLE2:  DB      "  半桥电子秤  "
DHTABLE3:  DB      " 设计人: x x x  "
DHTABLE4:  DB      " 时间:xxxx "
DHTABLE5:  DB      "****************"
DHTABLE6:  DB      "  设置报警上限    "
DHTABLE7:  DB      "  确定  "
DHTABLE8:  DB      "  请按D 键  "
DHTABLE9:  DB      "                "
DHTABLE10: DB      " 报警上限重量:   "
DHTABLE11: DB      "      .     g  "
DHTABLE12: DB      "        确定(E) "
CELIANG1:  DB      "  电子秤  "
CELIANG2:  DB      " 重量是:         "
CELIANG3:  DB      "      .     g   "
CELIANG4:DB      "      返回 (F)  "
;=======================================================
;开机界面子程序
;=======================================================
KAIJI:   MOV     ADDR1,#00H        ; 第一行显示
         MOV     N1,#08H           ; 数量 8 个
 MOV     DPTR,#DHTABLE1     ; 需要显示的汉字位置
    CALL    DHZ               ; 调用汉字子序 
 MOV     ADDR1,#10H         ; 第二行显示
         MOV     N1,#08H
 MOV     DPTR,#DHTABLE2
  CALL    DHZ
         MOV     ADDR1,#08H            ; 第三行显示
         MOV     N1,#08H
 MOV     DPTR,#DHTABLE3 
 CALL    DHZ
         MOV     ADDR1,#18H       ; 第四行显示
         MOV     N1,#08H
         MOV     DPTR,#DHTABLE4
         CALL    DHZ
         RET
;=======================================================
;提示界面子程序
;=======================================================
TISHI:   LCALL   CLEAR_GLCD           ; 清除LCD显示屏幕
         MOV     ADDR1,#00H
         MOV     N1,#08H
 MOV     DPTR,#DHTABLE5
 CALL    DHZ
 MOV     ADDR1,#10H
         MOV     N1,#08H
         MOV     DPTR,#DHTABLE6
         CALL    DHZ
 MOV     ADDR1,#08H
         MOV     N1,#08H
 MOV     DPTR,#DHTABLE7
 CALL    DHZ
           MOV     ADDR1,#18H
           MOV     N1,#08H
           MOV     DPTR,#DHTABLE8
           CALL    DHZ
           RET
;=======================================================
;值设定界面子程序
;=======================================================
SHEDING:        LCALL   CLEAR_GLCD
                MOV     ADDR1,#00H
                MOV     N1,#08H
                MOV     DPTR,#DHTABLE9
                CALL    DHZ
                MOV     ADDR1,#10H
                MOV     N1,#08H
                MOV     DPTR,#DHTABLE10
                CALL    DHZ
 MOV     ADDR1,#08H
                MOV     N1,#08H
 MOV     DPTR,#DHTABLE11
 CALL    DHZ
                MOV     ADDR1,#18H
                MOV     N1,#08H
                MOV     DPTR,#DHTABLE12
                CALL    DHZ
                RET
;=======================================================
;测量界面子程序
;=======================================================
celianjieguo:   LCALL   CLEAR_GLCD
                MOV     ADDR1,#00H
                MOV     N1,#08H
 MOV     DPTR,#CELIANG1
 CALL    DHZ
                MOV     ADDR1,#10H
                MOV     N1,#08H
 MOV     DPTR,#CELIANG2
 CALL    DHZ
                MOV     ADDR1,#08H
                MOV     N1,#08
                MOV     DPTR,#CELIANG3
                CALL    DHZ
                MOV     ADDR1,#18H
                MOV     N1,#08
                MOV     DPTR,#CELIANG4
                CALL    DHZ
                RET
;=======================================================
;8279初始化子程序
;=======================================================
INI_8279:       MOV     DPTR,#8101H
                MOV     A,#00H
                MOVX    @DPTR,A
                MOV     A,#32H
                MOVX    @DPTR,A
                MOV     A,#0DFH
                MOVX    @DPTR,A
                RET
;=======================================================
;键盘设定值子程序
;=======================================================
YUZHI:        LCALL   SHEDING
              MOV     44H,#00H      ; 44H单元存按键次数,先清0
;******************键盘按键存储空间   *******
                MOV     55H,#00H        ;存入四次按键值
                MOV     56H,#00H
                MOV     57H,#00H
                MOV     58H,#00H
                MOV     50H,#00H          ; 存值百位
                MOV     51H,#00H      ; 存值十位和个位
                MOV     52H,#00H          ; 存值小数位
;*************************************************************
KEY_09:         MOV     DPTR,#8101H   ; 判断是否有键按下
                MOVX    A,@DPTR
                ANL     A,#07H
                CJNE    A,#00H,LPP1
                AJMP    KEY_09
;-------------------------------------------
;各个键的处理
;------------------------------------------
LPP1:           MOV     DPTR,#8100H
                MOVX    A,@DPTR
B0:             CJNE    A,#0D8H,B1
                AJMP    KK0
B1:             CJNE    A,#0D0H,B2
                AJMP    KK1
B2:             CJNE    A,#0D1H,B3
                AJMP    KK2
B3:             CJNE    A,#0D2H,B4
                AJMP    KK3
B4:             CJNE    A,#0C8H,B5
                AJMP    KK4
B5:             CJNE    A,#0C9H,B6
                AJMP    KK5
B6:             CJNE    A,#0CAH,B7
                AJMP    KK6
B7:             CJNE    A,#0C0H,B8
                AJMP    KK7
B8:             CJNE    A,#0C1H,B9
                AJMP    KK8
B9:             CJNE    A,#0C2H,BE
                AJMP    KK9
BE:             CJNE    A,#0DAH,YUZHI
                AJMP    KKE
KK0:            MOV     5BH,#00H            ; 5BH存键值
                AJMP    COUNT_1
KK1:            MOV     5BH,#01H
                AJMP    COUNT_1
KK2:            MOV     5BH,#02H
                AJMP    COUNT_1
KK3:            MOV     5BH,#03H
               AJMP    COUNT_1
KK4:           MOV     5BH,#04H
               AJMP    COUNT_1
KK5:           MOV     5BH,#05H
               AJMP    COUNT_1
KK6:           MOV     5BH,#06H
               AJMP    COUNT_1
KK7:           MOV     5BH,#07H
               AJMP    COUNT_1
KK8:           MOV     5BH,#08H
               AJMP    COUNT_1
KK9:           MOV     5BH,#09H
               AJMP    COUNT_1
KKE:           AJMP    END_P
COUNT_1:       MOV     A,44H            ; 44H存按键次数
               INC     A
               MOV     44H,A
               CJNE    A,#05H ,CW1       ; 按键次数是否达到4次
               AJMP    YUZHI       ; 五次按键则重设
CW1:           ADD     A,#54H        ; 键盘按键存储空间
               MOV     R0,A
CW2:           CLR     A
               MOV     A,5BH
               MOV     @R0,A
               LCALL   PRO_SHOW
               AJMP    KEY_09
               RET
;=========================================
;各次报警值按键处理子程序
;=========================================
PRO_SHOW:       NOP
    PR_1:       CLR     A                     ; 一次按键
                MOV     A,44H
                CJNE    A,#01H,PR_2
                MOV     R0,#55H
                MOV     A,@R0
                SUBB    A,#05H
                JNC     SS
                MOV     51H,55H
                MOV     A,55H
                MOV     ADDR1,#0AH
                LCALL   SHUZIXIANSHI
                SJMP    END_P
  PR_2:        CLR     A                     ; 二次按键
                MOV     A,44H
                CJNE    A,#02H,PR_3
                CLR     A
                MOV     A,55H
                SWAP    A
                ADD     A,56H
                MOV     51H,A
                MOV     A,55H
                MOV     ADDR1,#09H
                LCALL   SHUZIXIANSHI
                MOV     A,56H
                MOV     ADDR1,#0AH
                LCALL   SHUZIXIANSHI
                AJMP    END_P
   PR_3:       CLR     A                     ; 三次按键
                MOV     A,44H
                CJNE    A,#03H,PR_4
                CLR     A
                MOV     50H,55H
                MOV     A,56H
                SWAP    A
                ADD     A,57H
                MOV     51H,A
                MOV     A,55H
                MOV     ADDR1,#08H
                LCALL   SHUZIXIANSHI
                MOV     A,56H
                MOV     ADDR1,#09H
                LCALL   SHUZIXIANSHI
                MOV     A,57H
                MOV     ADDR1,#0AH
                LCALL   SHUZIXIANSHI
                SJMP    END_P
         PR_4:       CLR     A             ; 四次按键
                MOV     A,58H
                SWAP    A
                MOV     52H,A
                SWAP    A
                MOV     ADDR1,#0CH
                LCALL   SHUZIXIANSHI
                SJMP    END_P
   END_P:       RET
   SS:          LJMP    YUZHI
;=============================================================
;结果显示子程序
;=============================================================
CELIANGJIEGUO:   LCALL ADC0809     ; 调用0809采样程序
 LCALL ZHH        ; 调用转换程序
 MOV ADDR1,#08H       ; 采数据送LCD显示
                 MOV A,40H
                 LCALL   SHUZIXIANSHI
                 MOV ADDR1,#09H
                 MOV     A,41H
                 SWAP    A
                 LCALL   SHUZIXIANSHI
                 MOV ADDR1,#0AH
 MOV A,41H
                 LCALL   SHUZIXIANSHI
                 MOV ADDR1,#0CH
                 MOV     A,43H
                 SWAP    A
                 LCALL   SHUZIXIANSHI
 CALL    DELAY500              ; 调用延时
                 CALL    BJ     ; 判断是否超过值,超过则报警
;------------------------------------------
 ;F键判断是否返回提示界面
;------------------------------------------
KEY_F:          MOV     DPTR,#8101H
                MOVX    A,@DPTR
                ANL     A,#07H
                CJNE    A,#00H,LP2
                SJMP    CELIANGJIEGUO
LP2:            MOV     DPTR,#8100H
                MOVX    A,@DPTR
                CJNE    A,#0D9H,CELIANGJIEGUO ;判断是否按F键
                SETB    P1.1
                CLR     P1.0
                AJMP    K1
;=======================================================
;报警子程序
;=======================================================
BJ:             MOV     R1,#50H
                MOV     A,@R1
                CLR     C
                SUBB    A,40H
                JC      WARNING
                JZ      COMP1
                SETB    P1.1
                CLR     P1.0
                RET
COMP1:          INC     R1
                MOV     A,@R1
                CLR     C
                SUBB    A,41H
                JC      WARNING
                JZ      COMP2
                SETB    P1.1
                CLR     P1.0
                RET
COMP2:          INC     R1
                MOV     A,@R1
                CLR     C
                SUBB    A,43H
                JC      WARNING
                SETB    P1.1
                CLR     P1.0
                RET
WARNING:        CLR     P1.1
                SETB    P1.0
                RET
;=======================================================
;0809采样程序
ADC0809:       PUSH    DPL
             PUSH    DPH
             PUSH    ACC
              MOV     DPTR,#W_D_0809    ; AD0809的启动地址
             MOV     A,#00H
             MOVX    @DPTR,A               ; 0 通道
             LCALL   DELAY01               ; 延时100US
             MOVX    A,@DPTR             ; 读出A/D的结果
             MOV     3FH,A        ; 暂存
 POP     ACC
             POP     DPH
             POP     DPL
             RET
;=======================================================
;转换子程序 : 3FH的内容(A/D采样的结果)*(5V/256(FFH))=十进制结果;40H,41H.例如:3FH=0FFH,  那么程序执行后:40H=04H  , 41H=99H 既4.99V
;=======================================================
ZHH:          PUSH    PSW
              PUSH    ACC
                SETB    RS0
              MOV     A,#4eH
                MOV     B,3FH
                 MUL     AB
              MOV     R6,B
              MOV     R7,A
HB2:          CLR     A
              MOV     R3,A
              MOV     R4,A
         MOV     R5,A
         MOV     R2,#10H
HB3:     MOV     A,R7
         RLC     A
         MOV     R7,A
         MOV     A,R6
          RLC     A
         MOV     R6,A
         MOV     A,R5
         ADDC    A,R5
         DA      A
         MOV     R5,A
         MOV     A,R4
         ADDC    A,R4
         DA      A
         MOV     R4,A
         MOV     A,R3
         ADDC    A,R3
         MOV     R3,A
         DJNZ    R2,HB3
         MOV     40H,R3
         MOV     41H,R4
           MOV     43H,R5
         POP     ACC
         POP     PSW
         RET
;=======================================================
;点阵式 LCD(128X64)模块显示部分子程序 ;以下是公共的程序:
;=======================================================
;LCD 初始化子程序
;=========================================
INITIAL_GLCD:   PUSH    ACC
                MOV     A,#30H                ; 功能设定
                CALL    COMMAND_GLCD
                MOV     A,#30H                ; 功能设定
                CALL    COMMAND_GLCD
                MOV     A,#30H                ; 功能设定
                CALL    COMMAND_GLCD
                MOV     A,#06H         ; 显示器控制:游标不显示;
                CALL    COMMAND_GLCD
                MOV     A,#01H              ; 清除显示器
                CALL    COMMAND_GLCD
                MOV     A,#0CH            ; 进入模式设定
                CALL    COMMAND_GLCD
                POP     ACC
                RET
;=========================================
;汉字显示子程序(16X16点阵)
;=========================================
DHZ:            MOV    ADDR,ADDR1       ; 开始行位置
                MOV   B,N1        ; 显示数量
DHZ1:           MOV    A,ADDR;
                ORL    A,#80H         ; 送显示地址
                LCALL  COMMAND_GLCD       ; 调写命令子程序
DHZ2:           CLR   A
                MOVC   A,@A+DPTR    ; 查找汉字的高位码
                INC    DPTR
             LCALL  WRITE_GLCD       ; 送显示
                CLR   A
               MOVC   A,@A+DPTR         ; 查找汉字的低位码
                INC    DPTR
                LCALL  WRITE_GLCD            ; 送显示
                DJNZ   B,DHZ2
                RET
;=========================================
;数字显示子程序
;=========================================
SHUZIXIANSHI:   MOV     42H,A
                MOV     ADDR,ADDR1       ; 开始行位置
                MOV     A,ADDR;
                ORL     A,#80H         ; 送显示地址
             LCALL   COMMAND_GLCD
                MOV     A,42H
;------------------------------------------
;将 ACC 内容,以十六进制值显示
;------------------------------------------
HEX_LCD:    PUSH    DPH
            PUSH    DPL
            PUSH    ACC
         ANL     A,#0FH
            MOV     DPTR,#ASCII_CODE    ; DPTR 指到 ASCII_CODE
            MOVC    A,@A+DPTR        ; 取得 ASCII 码
            CALL    WRITE_GLCD            ; 写到 LCD
            POP     ACC
            POP     DPL
            POP     DPH
            RET
ASCII_CODE:     DB     '0123456789ABCDEF'
;=========================================
;检查LCD 忙碌标志
;=========================================
CHKBUSY_GLCD:   PUSH    DPH
              PUSH    DPL
                PUSH    ACC
                MOV     DPTR,#R_B_GLCD
CHK:            MOVX    A,@DPTR
                JB      ACC.7,CHK       ; 判别是不是忙?
                POP     ACC
                POP     DPL
  POP     DPH
                RET
;=========================================
;写命令到 GLCD
;=========================================
COMMAND_GLCD:   PUSH    DPH
              PUSH    DPL
                CALL    CHKBUSY_GLCD     ; 判别是不是忙?
                MOV     DPTR,#W_C_GLCD
                MOVX    @DPTR,A        ; 写入命令
                POP     DPL
              POP     DPH
                RET
;=========================================
;写资料到 GLCD
;=========================================
WRITE_GLCD:     PUSH    DPH
                PUSH    DPL
                CALL    CHKBUSY_GLCD     ; 判别是不是忙?
                MOV     DPTR,#W_D_GLCD        ; 写入数据
                MOVX    @DPTR,A
                POP     DPL
              POP     DPH
                RET
;=========================================
;清除 LCD 的显示幕
;=========================================
CLEAR_GLCD:     PUSH    ACC
                MOV     A,#01H              ; 清除显示器
                CALL    COMMAND_GLCD
                POP     ACC
                RET
;=======================================================
;延时子程序
;=======================================================
DELAY:          PUSH    TIMER1   ; 延时TIMER1*1 ms for 12MHz
             PUSH    TIMER0
DELAY1:         MOV     TIMER0,#250       ;时间为4*1μS
DELAY2:         NOP         ; 1个周期
                NOP         ; 1个周期
                DJNZ    TIMER0,DELAY2         ; 2个周期
             DJNZ    TIMER1,DELAY1
             POP     TIMER0
             POP     TIMER1
                RET
                NOP
;------------------------------------------
;延时 1 ms
;------------------------------------------
DELAY01:        NOP
                PUSH    TIMER1
                MOV     TIMER1,#01H
                LCALL   DELAY
                POP     TIMER1
                RET
                NOP
;------------------------------------------
;延时500ms
;------------------------------------------
DELAY500:       NOP
             PUSH    TIMER1
             MOV TIMER1,#250
             LCALL DELAY
             LCALL   DELAY
             POP     TIMER1
             RET
             NOP
 

单片机电子秤设计软件程序清单

【单片机电子秤设计软件程序清单】相关文章:

1.计算机监控软件程序设计论文

2.软件工程专业程序设计课程群创建

3.计算机监控软件程序设计方法的论文

4.软件程序员简历范文

5.CCIE安全实验考试设备及软件清单

6.探析程序设计竞赛在软件工程专业中的应用

7.探析程序设计竞赛在软件工程专业中的应用

8.单片机毕业设计论文

9.单片机毕业设计范文