標(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