標(biāo)題: 請教關(guān)于程序邏輯框圖 [打印本頁]

作者: lyonkon    時(shí)間: 2022-12-30 20:25
標(biāo)題: 請教關(guān)于程序邏輯框圖
我為了調(diào)試一個(gè)子程序,花了很長時(shí)間。任然沒有調(diào)試完成。雖然判斷的條件只有4個(gè)。但是邏輯混亂,總是調(diào)試不成功。我想是不是應(yīng)該有什么準(zhǔn)確邏輯分析工具或者方法,于是我試著畫了一會子程序邏輯框圖。但是有點(diǎn)心情煩躁;蛟S是對學(xué)習(xí)邏輯框圖將要面臨的不確定性感到排斥,也或者是無從下手。但是如果邏輯框圖可以解決問題,就想學(xué)習(xí)一下。就是說產(chǎn)品的目的到邏輯框圖的形成流程;蛘呦犬嬛鞒绦蜻是先畫主程序。是依據(jù)指令流程還是邏輯流程??

作者: Hephaestus    時(shí)間: 2023-1-2 02:40
把問題具體的貼出來,讓大家?guī)湍惴治觥?hr noshade size="2" width="100%" color="#808080"> 作者: lyonkon    時(shí)間: 2023-1-2 08:35
asc鍵盤,按鍵按下產(chǎn)生通碼 按的時(shí)間長就會連續(xù)發(fā)送通碼。按鍵松開鍵盤發(fā)送二字節(jié)斷碼。不如A鍵按下鍵盤發(fā)送0x1c通碼,松開0xf0 0x1c兩個(gè)字節(jié)斷碼。數(shù)字鍵2,當(dāng)shift鍵按下再按2 鍵盤發(fā)送@,shift松開時(shí)按下2鍵盤發(fā)送2,F(xiàn)在問題是shift鍵是否按下 是否斷開我分析不出邏輯重點(diǎn)。因?yàn)閟hift按下鍵盤發(fā)送0x12,再按2鍵,鍵盤發(fā)送@,再發(fā)送0xf0 2的斷碼。shift沒有松開的情況繼續(xù)下按3鍵,鍵盤發(fā)送#。shift鍵松開時(shí),鍵盤發(fā)送0xf0 0x12,我憑盲調(diào)程序不成功,在紙上畫也找不到邏輯
作者: lyonkon    時(shí)間: 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                        //        鍵盤值是否被轉(zhuǎn)換判斷地址,有則
        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
程序調(diào)試到,按下shift,再按其他的都正常。但松開shift,需要多按一次其他鍵,才能按其他鍵
作者: ZXWPL    時(shí)間: 2023-1-6 10:25
你的代碼沒看,看看我的思路能不能給你帶來點(diǎn)啟發(fā),若有不對的地方,請不要在意,嘿嘿。

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

key_value         //普通按鍵通碼
key_value_duan         //普通按鍵斷碼  用于在無按鍵時(shí)判斷曾經(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ā)送內(nèi)容
        }
}
else if(key_value)
{
        key_send=key_value;//直接發(fā)送普通按鍵通碼
}


}



作者: lyonkon    時(shí)間: 2023-1-7 23:02
ZXWPL 發(fā)表于 2023-1-6 10:25
你的代碼沒看,看看我的思路能不能給你帶來點(diǎn)啟發(fā),若有不對的地方,請不要在意,嘿嘿。

shift_va ...

感謝您的幫助,C語言我現(xiàn)在還沒學(xué)會,我畫程序框圖解決的問題。程序框圖真的有用,以后寫程序之前先畫框圖。感謝
作者: man1234567    時(shí)間: 2023-1-9 09:29
理論上都要先畫框圖再寫,但由于多數(shù)寫的程序小且結(jié)構(gòu)簡單,多在紙面略過了。
感覺 C 語言自帶框圖的樣子,易讀易懂效率低
作者: gcx19119    時(shí)間: 2023-1-13 16:15
有啥好用的畫程序框圖的軟件嘛?每次動手畫紙上好麻煩啊




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1