找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2107|回復: 7
打印 上一主題 下一主題
收起左側

請教關于程序邏輯框圖

[復制鏈接]
跳轉到指定樓層
樓主
ID:73992 發(fā)表于 2022-12-30 20:25 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
我為了調試一個子程序,花了很長時間。任然沒有調試完成。雖然判斷的條件只有4個。但是邏輯混亂,總是調試不成功。我想是不是應該有什么準確邏輯分析工具或者方法,于是我試著畫了一會子程序邏輯框圖。但是有點心情煩躁;蛟S是對學習邏輯框圖將要面臨的不確定性感到排斥,也或者是無從下手。但是如果邏輯框圖可以解決問題,就想學習一下。就是說產(chǎn)品的目的到邏輯框圖的形成流程;蛘呦犬嬛鞒绦蜻是先畫主程序。是依據(jù)指令流程還是邏輯流程??
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:883242 發(fā)表于 2023-1-2 02:40 | 只看該作者
把問題具體的貼出來,讓大家?guī)湍惴治觥?/td>
回復

使用道具 舉報

板凳
ID:73992 發(fā)表于 2023-1-2 08:35 來自觸屏版 | 只看該作者
asc鍵盤,按鍵按下產(chǎn)生通碼 按的時間長就會連續(xù)發(fā)送通碼。按鍵松開鍵盤發(fā)送二字節(jié)斷碼。不如A鍵按下鍵盤發(fā)送0x1c通碼,松開0xf0 0x1c兩個字節(jié)斷碼。數(shù)字鍵2,當shift鍵按下再按2 鍵盤發(fā)送@,shift松開時按下2鍵盤發(fā)送2。現(xiàn)在問題是shift鍵是否按下 是否斷開我分析不出邏輯重點。因為shift按下鍵盤發(fā)送0x12,再按2鍵,鍵盤發(fā)送@,再發(fā)送0xf0 2的斷碼。shift沒有松開的情況繼續(xù)下按3鍵,鍵盤發(fā)送#。shift鍵松開時,鍵盤發(fā)送0xf0 0x12,我憑盲調程序不成功,在紙上畫也找不到邏輯
回復

使用道具 舉報

地板
ID:73992 發(fā)表于 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寫數(shù)據(jù)程序暫存器
        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
這里開始,鍵值已經(jīng)在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 發(fā)表于 2023-1-6 10:25 | 只看該作者
你的代碼沒看,看看我的思路能不能給你帶來點啟發(fā),若有不對的地方,請不要在意,嘿嘿。

shift_value         //shift通碼      
shift_value_duan         //shift斷碼        用于在無按鍵時判斷曾經(jīng)是否按下過此按鍵

key_value         //普通按鍵通碼
key_value_duan         //普通按鍵斷碼  用于在無按鍵時判斷曾經(jīng)是否按下過此按鍵

key_send                //最終要發(fā)送的鍵值

        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;//無其他按鍵按下,直接發(fā)送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曾經(jīng)按下過
{
        key_send=shift_value_duan;//發(fā)送shift斷碼;
        shift_value_duan=0;
}
else if(key_value==0)//無普通按鍵
{
        if(key_value_duan)//普通按鍵曾按下過
        {
                key_send=key_value_duan;//發(fā)送上次按下的普通鍵斷碼
                key_have_value=0;
        }
        else
        {
                key_send=0;//清除發(fā)送內容
        }
}
else if(key_value)
{
        key_send=key_value;//直接發(fā)送普通按鍵通碼
}


}


回復

使用道具 舉報

6#
ID:73992 發(fā)表于 2023-1-7 23:02 | 只看該作者
ZXWPL 發(fā)表于 2023-1-6 10:25
你的代碼沒看,看看我的思路能不能給你帶來點啟發(fā),若有不對的地方,請不要在意,嘿嘿。

shift_va ...

感謝您的幫助,C語言我現(xiàn)在還沒學會,我畫程序框圖解決的問題。程序框圖真的有用,以后寫程序之前先畫框圖。感謝
回復

使用道具 舉報

7#
ID:584814 發(fā)表于 2023-1-9 09:29 | 只看該作者
理論上都要先畫框圖再寫,但由于多數(shù)寫的程序小且結構簡單,多在紙面略過了。
感覺 C 語言自帶框圖的樣子,易讀易懂效率低
回復

使用道具 舉報

8#
ID:1061063 發(fā)表于 2023-1-13 16:15 來自觸屏版 | 只看該作者
有啥好用的畫程序框圖的軟件嘛?每次動手畫紙上好麻煩啊
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表