标题:
请教关于程序逻辑框图
[打印本页]
作者:
lyonkon
时间:
2022-12-30 20:25
标题:
请教关于程序逻辑框图
我为了调试一个子程序,花了很长时间。任然没有调试完成。虽然判断的条件只有4个。但是逻辑混乱,总是调试不成功。我想是不是应该有什么准确逻辑分析工具或者方法,于是我试着画了一会子程序逻辑框图。但是有点心情烦躁。或许是对学习逻辑框图将要面临的不确定性感到排斥,也或者是无从下手。但是如果逻辑框图可以解决问题,就想学习一下。就是说产品的目的到逻辑框图的形成流程。或者先画主程序还是先画主程序。是依据指令流程还是逻辑流程??
作者:
Hephaestus
时间:
2023-1-2 02:40
把问题具体的贴出来,让大家帮你分析。
作者:
lyonkon
时间:
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,我凭盲调程序不成功,在纸上画也找不到逻辑
作者:
lyonkon
时间:
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,需要多按一次其他键,才能按其他键
作者:
ZXWPL
时间:
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;//直接发送普通按键通码
}
}
作者:
lyonkon
时间:
2023-1-7 23:02
ZXWPL 发表于 2023-1-6 10:25
你的代码没看,看看我的思路能不能给你带来点启发,若有不对的地方,请不要在意,嘿嘿。
shift_va ...
感谢您的帮助,C语言我现在还没学会,我画程序框图解决的问题。程序框图真的有用,以后写程序之前先画框图。感谢
作者:
man1234567
时间:
2023-1-9 09:29
理论上都要先画框图再写,但由于多数写的程序小且结构简单,多在纸面略过了。
感觉 C 语言自带框图的样子,易读易懂效率低
作者:
gcx19119
时间:
2023-1-13 16:15
有啥好用的画程序框图的软件嘛?每次动手画纸上好麻烦啊
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1