找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1124|回复: 5
打印 上一主题 下一主题
收起左侧

新手求助单片机I/O 直接LCD加數器

[复制链接]
跳转到指定楼层
楼主
問題: 按一下開關數字加一,按到00062時亂碼,再按到00065時自動復位00000.
更改: SP,#30 ,加到00102時亂碼,00105時自動復位00000.
問題已糾結了一段時間,能力所限未能解決,懇請師兄師姐相助,感激不盡.



单片机源程序如下:
;20201202
;STC15W202S
;5位數LCD 加數器
;I/O口直接輸出
;SEG=P3.0~P3.3,P3.6~P3.7,P1.1
;COM1~COM5=P1.3~P1.5,P5.4,P5.5
;計數開關=P1.2
;RC:11.0592MHz

                                P1M1 EQU 0x91
                                P1M0 EQU 0x92
                                P3M1 EQU 0xB1
                                P3M0 EQU 0xB2
                                P5M1 EQU 0xC9
                                P5M0 EQU 0xCA
                                P5      EQU 0C8H
;------------------------------------------------
                        ORG 0000H
                        AJMP SETTING
                  
                        ORG 100H
;------------------------------------------------                                                        
SETTING:                  MOV SP, #80H
;設定SEG推挽輸出
;設定COM高阻抗
                                MOV P3M1,#00000000B                                
                                MOV P3M0,#11111111B
                                MOV P1M1,#11111000B
                                MOV P1M0,#00000001B
                                MOV P5M1,#11111111B
                                MOV P5M0,#00000000B
;------------------------------------------------
;R0=個位數,R1=十位數....
;預載入 "00000"
                                MOV R0,#0
                                MOV R1,#0
                                MOV R2,#0
                                MOV R3,#0
                                MOV R4,#0
;------------------------------------------------
;等P1.2高電位(通過開關)         
WAIT_SW_H:             ACALL DISP_ALL;掃瞄顯示全部
                                JNB P1.2,WAIT_SW_H;P1.2=0,JMP

;等P1.2低電位(通過開關)                                                                                                        
WAIT_SW_L:              ACALL DISP_ALL;掃瞄顯示全部
                                JB P1.2,WAIT_SW_L;P1.2=1,JMP
                                ACALL DISP_ALL
                                    

CALC:                                      CJNE R0,#9,INC_R0;R0少於9,跳轉R0+1
                                               MOV R0,#0;R0=9,清0
                                               CJNE R1,#9,INC_R1
                                               MOV R1,#0
                                               CJNE R2,#9,INC_R2
                                                MOV R2,#0
                                                CJNE R3,#9,INC_R3
                                                MOV R3,#0
                                                CJNE R4,#9,INC_R4
                                               AJMP CALC;累加至"99999"後停止
;------------------------------------------------
;個位數加1
INC_R0:           INC R0
                      AJMP WAIT_SW_H
                                                
;十位數加1
INC_R1:        INC R1
                   AJMP WAIT_SW_H
;百位數加1                                                
INC_R2:        INC R2
                  AJMP WAIT_SW_H
;千位數加1
INC_R3:       INC R3
                 AJMP WAIT_SW_H
;萬位數加1                                                
INC_R4:       INC R4
                 AJMP WAIT_SW_H
;------------------------------------------------
;顯示全部
DISP_ALL:

;顯示個位數
                  MOV A,R0
                 MOV DPTR,#TABLE                  
                 MOVC A,@A+DPTR
                 MOV P3,A
                  RLC A
                  RLC A
                  RLC A
                  MOV P1.0,C
                  MOV P5M1,#11011111B
                  MOV P5M0,#00100000B                 
                  SETB P5.5                  
                  ACALL DELAY_1MS
                  ACALL COM_HI_IMPEDANCE
                  
                 MOV A,R0
                 MOV DPTR,#TABLE                  
                 MOVC A,@A+DPTR
                  CPL A
                 MOV P3,A
                  RLC A
                  RLC A
                  RLC A
                  MOV P1.0,C
                   MOV P5M1,#11011111B
                  MOV P5M0,#00100000B        
                  CLR P5.5                          
                  ACALL DELAY_1MS
                   ACALL COM_HI_IMPEDANCE
                  
; 顯示十位數
                  MOV A,R1
                 MOV DPTR,#TABLE                  
                 MOVC A,@A+DPTR
                 MOV P3,A
                  RLC A
                  RLC A
                  RLC A
                  MOV P1.0,C
                  MOV P5M1,#11101111B
                  MOV P5M0,#00010000B
                  SETB P5.4
                  ACALL DELAY_1MS                  
                  ACALL COM_HI_IMPEDANCE
                  
                 MOV A,R1
                 MOV DPTR,#TABLE                  
                 MOVC A,@A+DPTR
                  CPL A
                 MOV P3,A
                  RLC A
                  RLC A
                  RLC A
                  MOV P1.0,C
                  MOV P5M1,#11101111B
                  MOV P5M0,#00010000B                  
                  CLR P5.4
                  ACALL DELAY_1MS
                  ACALL COM_HI_IMPEDANCE
                  
;顯示百位數
                  MOV A,R2
                 MOV DPTR,#TABLE                  
                 MOVC A,@A+DPTR
                 MOV P3,A
                  RLC A
                  RLC A
                  RLC A
                  MOV P1.0,C
                  MOV P1M1,#11011000B
                  MOV P1M0,#00100001B
                  SETB P1.5
                  ACALL DELAY_1MS                  
                  ACALL COM_HI_IMPEDANCE
                  
                 MOV A,R2
                 MOV DPTR,#TABLE                  
                 MOVC A,@A+DPTR
                  CPL A
                 MOV P3,A
                  RLC A
                  RLC A
                  RLC A
                  MOV P1.0,C
                  MOV P1M1,#11011000B
                  MOV P1M0,#00100001B
                  CLR P1.5
                  ACALL DELAY_1MS
                  ACALL COM_HI_IMPEDANCE
                  
;顯示千位數
                  MOV A,R3
                 MOV DPTR,#TABLE                  
                 MOVC A,@A+DPTR
                 MOV P3,A
                  RLC A
                  RLC A
                  RLC A
                  MOV P1.0,C
                  MOV P1M1,#11101000B
                  MOV P1M0,#00010001B
                  SETB P1.4
                  ACALL DELAY_1MS                  
                  ACALL COM_HI_IMPEDANCE
                  
                 MOV A,R3
                 MOV DPTR,#TABLE                  
                 MOVC A,@A+DPTR
                  CPL A
                 MOV P3,A
                  RLC A
                  RLC A
                  RLC A
                  MOV P1.0,C
                  MOV P1M1,#11101000B
                  MOV P1M0,#00010001B
                  CLR P1.4
                  ACALL DELAY_1MS
                  ACALL COM_HI_IMPEDANCE                  
                  
;顯示萬位數
                  MOV A,R4
                 MOV DPTR,#TABLE                  
                 MOVC A,@A+DPTR
                 MOV P3,A
                  RLC A
                  RLC A
                  RLC A
                  MOV P1.0,C
                  MOV P1M1,#11110000B
                  MOV P1M0,#00001001B
                  SETB P1.3
                  ACALL DELAY_1MS                  
                  ACALL COM_HI_IMPEDANCE
                  
                 MOV A,R4
                 MOV DPTR,#TABLE                  
                 MOVC A,@A+DPTR
                  CPL A
                 MOV P3,A
                  RLC A
                  RLC A
                  RLC A
                  MOV P1.0,C
                  MOV P1M1,#11110000B
                  MOV P1M0,#00001001B
                  CLR P1.3
                  ACALL DELAY_1MS
                  ACALL COM_HI_IMPEDANCE
                 RET
;------------------------------------------------
;COM1~COM5=設定高阻抗
COM_HI_IMPEDANCE:
                               MOV P1M1,#11111000B
                                MOV P1M0,#00000001B
                                MOV P5M1,#11111111B
                                MOV P5M0,#00000000B        
                        RET                  
;------------------------------------------------
DELAY_1MS:
                       MOV R7,#10
DL1_1MS:         MOV R6,#10
DL2_1MS:         MOV R5,#26
DL3_1MS:         DJNZ R5,DL3_1MS
                        DJNZ R6,DL2_1MS
                        DJNZ R7,DL1_1MS
                        RET
;------------------------------------------------                  
TABLE:  
          DB 008H,0BDH,054H,094H,0B1H,092H,02H,0BCH,010H,090H;0~9
;------------------------------------------------
                  END


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:235200 发表于 2020-12-2 19:04 | 只看该作者
跟堆栈指针关系不大,程序中并无中断,子程序调用也不多,问题主要是计数值存放在寄存器后的处理问题
回复

使用道具 举报

板凳
ID:809671 发表于 2020-12-3 11:21 | 只看该作者
今天再測試後更新:
SP,#80H ,按一下開關數字加一,按到00063,64時亂碼,再按一下時單片機自動復位 00000.
更改: SP,#30H ,情況一樣.,按到00063,64時亂碼,再按一下時單片機自動復位 00000.
回复

使用道具 举报

地板
ID:88256 发表于 2020-12-3 12:29 | 只看该作者
没细看,感觉流程有点混乱,为什么加法程序不放在一起?管它有没进位,先处理完加法再一起送显示
回复

使用道具 举报

5#
ID:809671 发表于 2020-12-3 13:30 | 只看该作者
hhdsdy 发表于 2020-12-3 12:29
没细看,感觉流程有点混乱,为什么加法程序不放在一起?管它有没进位,先处理完加法再一起送显示

是邊想邊寫的有點亂,碰到問題就停下來了,還有其他功能未寫,最後才優化.
以為很容易怎知都有困難.
回复

使用道具 举报

6#
ID:809671 发表于 2020-12-3 18:39 来自手机 | 只看该作者
csmyldl 发表于 2020-12-2 19:04
跟堆栈指针关系不大,程序中并无中断,子程序调用也不多,问题主要是计数值存放在寄存器后的处理问题

確認了與堆栈指针無關。
沒有開全局中斷及看門狗,供電電壓穩定,就是不明白為何會軟件復位。
與編程器有關嗎?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表