找回密码
 立即注册

QQ登录

只需一步,快速开始

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

请教关于程序逻辑框图

[复制链接]
跳转到指定楼层
楼主
ID:73992 发表于 2022-12-30 20:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我为了调试一个子程序,花了很长时间。任然没有调试完成。虽然判断的条件只有4个。但是逻辑混乱,总是调试不成功。我想是不是应该有什么准确逻辑分析工具或者方法,于是我试着画了一会子程序逻辑框图。但是有点心情烦躁。或许是对学习逻辑框图将要面临的不确定性感到排斥,也或者是无从下手。但是如果逻辑框图可以解决问题,就想学习一下。就是说产品的目的到逻辑框图的形成流程。或者先画主程序还是先画主程序。是依据指令流程还是逻辑流程??
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:883242 发表于 2023-1-2 02:40 | 只看该作者
把问题具体的贴出来,让大家帮你分析。
回复

使用道具 举报

板凳
ID:73992 发表于 2023-1-2 08:35 来自手机 | 只看该作者
asc键盘,按键按下产生通码 按的时间长就会连续发送通码。按键松开键盘发送二字节断码。不如A键按下键盘发送0x1c通码,松开0xf0 0x1c两个字节断码。数字键2,当shift键按下再按2 键盘发送@,shift松开时按下2键盘发送2。现在问题是shift键是否按下 是否断开我分析不出逻辑重点。因为shift按下键盘发送0x12,再按2键,键盘发送@,再发送0xf0 2的断码。shift没有松开的情况继续下按3键,键盘发送#。shift键松开时,键盘发送0xf0 0x12,我凭盲调程序不成功,在纸上画也找不到逻辑
回复

使用道具 举报

地板
ID:73992 发表于 2023-1-2 19:13 | 只看该作者
SYSTEMSET:
       
        PUSHR0        EQU        0060H
        PUSHR1        EQU        0061H
        PUSHR2        EQU        0062H
        PUSHR3        EQU        0063H
        PUSHR4        EQU        0064H
        PUSHR5        EQU        0065H
        PUSHR6        EQU        0066H
        PUSHR7        EQU        0067H

        LCDCMDRAM        EQU        70H                        //        LCD12864写子令程序暂存器
        LCDDATRAM        EQU        71H                        //        LCD12864写数据程序暂存器
        KEYTONG0        EQU        72H                                //        键盘通码存放地址
        KEYDUAN        EQU        73H                                //        键盘断码存放地址
        KEYASCI        EQU        74H                                //        键盘ASCII码存放地址         
        KEYPAN        EQU        75H                                //        键盘有无输入ASCII判断地址        有则0X02
        KEYCMDPAN        EQU        76H                        //        键盘有无命令判断地址
        KEYRAMPAN        EQU        77H                        //        键盘值是否被转换判断地址,有则
        KEYSHIFT0        EQU        78H                        //        shift键值存放地址
        KEYTONG1        EQU        79H
这里开始,键值已经在ACC中
keydat:       
MOV        PUSHR7,R7
MOV        R7,KEYDUAN       


KEYREA00:
        CJNE        A,#0XF0,KEYREA01
        MOV        KEYDUAN,#0XF0
        LJMP        KEYREAD1
KEYREA01:
        CJNE        R7,#0XF0,KEYREAD0
        MOV        KEYTONG1,A
        MOV        KEYDUAN,#0X00
        LJMP        KEYREAD1
KEYREAD0:       
        MOV        KEYTONG0,A
        MOV        KEYPAN,#0X02       
KEYREAD1:
        MOV        R7,PUSHR7
        POP ACC       
        RETI
KEYASCMD:
                MOV        PUSHR5,R5
                MOV        PUSHR6,R6
                MOV        PUSHR7,R7
                MOV        R5,KEYTONG1
                MOV        R6,KEYCMDPAN
                MOV        R7,KEYTONG0
                MOV        KEYPAN,#0X00
                CJNE        R6,#0X02,SHIFT
                CJNE        R5,#0X12,KEYMING
                MOV          KEYTONG1,#0X00
                MOV          KEYCMDPAN,#0X00
                MOV          KEYDUAN,#0X00
                LJMP        OUT
SHIFT:        CJNE        R7,#0X12,KEYX
                MOV        KEYCMDPAN,#0X02
                LJMP        OUT
KEYX:        CJNE        R7,#0X22,KEYY
                MOV        KEYASCI,#0X58
                AJMP        OUT1
KEYY:        CJNE        R7,#0X35,KEYZ
                MOV        KEYASCI,#0X59
                AJMP        OUT1
KEYZ:        CJNE        R7,#0X1A,KEY0
                MOV        KEYASCI,#0X5A
                AJMP        OUT1       
KEY0:        CJNE        R7,#0X45,KEY1
                MOV        KEYASCI,#0X30
                AJMP        OUT1
KEY1:        CJNE        R7,#0X16,KEY2
                MOV        KEYASCI,#0X31
                AJMP        OUT1       
KEY2:        CJNE        R7,#0X1E,KEY3
                MOV        KEYASCI,#0X32
                AJMP        OUT1
KEY3:        CJNE        R7,#0X26,KEY4
                MOV        KEYASCI,#0X33
                AJMP        OUT1       
KEY4:        CJNE        R7,#0X25,KEY5
                MOV        KEYASCI,#0X34
                AJMP        OUT1
KEY5:        CJNE        R7,#0X2E,KEY6
                MOV        KEYASCI,#0X35
                AJMP        OUT1       
KEY6:        CJNE        R7,#0X36,KEY7
                MOV        KEYASCI,#0X36
                AJMP        OUT1
KEY7:        CJNE        R7,#0X3D,KEY8
                MOV        KEYASCI,#0X37
                AJMP        OUT1       
KEY8:        CJNE        R7,#0X3E,KEY9
                MOV        KEYASCI,#0X38
                AJMP        OUT1
KEY9:        CJNE        R7,#0X46,OUT1
                MOV        KEYASCI,#0X39
                AJMP        OUT1
KEYMING:                         ;键盘命令处理程序        SHIFT组合键处理程序
SHIFT1:        CJNE        R7,#0X16,SHIFT2                          ;!
                MOV        KEYASCI,#0X21
                AJMP        OUT0
SHIFT2:        CJNE        R7,#0X1E,SHIFT3                          ;@
                MOV        KEYASCI,#0X40
                AJMP        OUT0
SHIFT3:        CJNE        R7,#0X26,SHIFT4                         ;#
                MOV        KEYASCI,#0X23
                AJMP        OUT0
SHIFT4:        CJNE        R7,#0X25,SHIFT5                          ;$
                MOV        KEYASCI,#0X24
                AJMP        OUT0
SHIFT5:        CJNE        R7,#0X2E,SHIFT6                          ;%                        
                MOV        KEYASCI,#0X25
                AJMP        OUT0
SHIFT6:        CJNE        R7,#0X36,SHIFT7                          ;^
                MOV        KEYASCI,#0X5E
                AJMP        OUT0
SHIFT7:        CJNE        R7,#0X3D,SHIFT8                          ;&
                MOV        KEYASCI,#0X26
                AJMP        OUT0
SHIFT8:        CJNE        R7,#0X3E,SHIFT9                        ;*
                MOV        KEYASCI,#0X2A
                AJMP        OUT0
SHIFT9:        CJNE        R7,#0X46,OUT1                          ;(
                MOV        KEYASCI,#0X28
                AJMP        OUT0
OUT0:        CJNE        R5,#0X12,OUT
                MOV        KEYCMDPAN,#0X00
                MOV        KEYTONG1,#0X00
                MOV        KEYPAN,#0X00
                LJMP        OUT
OUT1:       
OUT:        MOV        KEYPAN,#0X00
                MOV        R5,PUSHR5
                MOV        R6,PUSHR6
                MOV        R7,PUSHR7
                RET
MAIN:                                         //主程序                     
        LCALL        INIT
        LCALL        SYSTEMSET                              
D1:  
        MOV        PUSHR4,R4
        MOV        R4,KEYPAN
        CJNE        R4,#0X02,D3
        MOV        R4,PUSHR4
        LJMP        D2
D2:
        LCALL        KEYASCMD   
D3:
        MOV        DPTR,#1700H
        MOV        A,KEYASCI
        MOVX        @DPTR,A
        INC        DPTR
        MOV        A,KEYTONG0
        MOVX        @DPTR,A
        INC        DPTR
        MOV        A,KEYTONG1
        MOVX        @DPTR,A
        LCALL        LCD12864REDRAMADDR

        LJMP        D1
        RET
程序调试到,按下shift,再按其他的都正常。但松开shift,需要多按一次其他键,才能按其他键
回复

使用道具 举报

5#
ID:487569 发表于 2023-1-6 10:25 | 只看该作者
你的代码没看,看看我的思路能不能给你带来点启发,若有不对的地方,请不要在意,嘿嘿。

shift_value         //shift通码      
shift_value_duan         //shift断码        用于在无按键时判断曾经是否按下过此按键

key_value         //普通按键通码
key_value_duan         //普通按键断码  用于在无按键时判断曾经是否按下过此按键

key_send                //最终要发送的键值

        shift按下 shift_value=shift通码;shift_value_duan=shift断码   
        shift断开 shift_value=0;
        |
        |
        普通按键按下 key_value =key通码1?2?3?,key_value_duan = key断码1?2?3?;
        普通按键断开 key_value =0;
        |
        |
       
情况一:       
if(shift_value==shift通码)//有shift键
{
       
if(key_value ==0)
key_send=shift_value;//无其他按键按下,直接发送shift
                                                                                                                               
else if(key_value ==1)                               
key_send=!;       
                                       
else if(key_value ==2)                                                        
key_send=@;       
                         
else if(key_value ==3)
key_send=#;

}       

情况二:
if(shift_value==shift断码)//无shift键
{

if( shift_value_duan )//shift曾经按下过
{
        key_send=shift_value_duan;//发送shift断码;
        shift_value_duan=0;
}
else if(key_value==0)//无普通按键
{
        if(key_value_duan)//普通按键曾按下过
        {
                key_send=key_value_duan;//发送上次按下的普通键断码
                key_have_value=0;
        }
        else
        {
                key_send=0;//清除发送内容
        }
}
else if(key_value)
{
        key_send=key_value;//直接发送普通按键通码
}


}


回复

使用道具 举报

6#
ID:73992 发表于 2023-1-7 23:02 | 只看该作者
ZXWPL 发表于 2023-1-6 10:25
你的代码没看,看看我的思路能不能给你带来点启发,若有不对的地方,请不要在意,嘿嘿。

shift_va ...

感谢您的帮助,C语言我现在还没学会,我画程序框图解决的问题。程序框图真的有用,以后写程序之前先画框图。感谢
回复

使用道具 举报

7#
ID:584814 发表于 2023-1-9 09:29 | 只看该作者
理论上都要先画框图再写,但由于多数写的程序小且结构简单,多在纸面略过了。
感觉 C 语言自带框图的样子,易读易懂效率低
回复

使用道具 举报

8#
ID:1061063 发表于 2023-1-13 16:15 来自手机 | 只看该作者
有啥好用的画程序框图的软件嘛?每次动手画纸上好麻烦啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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