📄 led_key.src
字号:
CLR SCL
; SCL = 1;
; SOURCE LINE # 100
SETB SCL
; }
; SOURCE LINE # 101
MOV DPTR,#counter?142
MOVX A,@DPTR
INC A
MOVX @DPTR,A
MOVX A,@DPTR
CJNE A,#08H,?C0007
?C0008:
; SDA = 0; /*r然后逐行置为低电平,侦测P1.2(KEY反馈线)*/
; SOURCE LINE # 102
CLR SDA
;
; for(counter = 0; counter < 8; counter++) /*需要修改计数值*/
; SOURCE LINE # 104
CLR A
MOV DPTR,#counter?142
MOVX @DPTR,A
?C0010:
; {
; SOURCE LINE # 105
; SCL = 0;
; SOURCE LINE # 106
CLR SCL
; SCL = 1;
; SOURCE LINE # 107
SETB SCL
; delay(1); /*必须的延迟,否则数据出错*/
; SOURCE LINE # 108
MOV R7,#01H
MOV R6,#00H
LCALL _delay
; if(!KEY)
; SOURCE LINE # 109
JB KEY,?C0012
; {
; SOURCE LINE # 110
; return(counter); /*r扫描出按下键就返回按下的键值并退出函数*/
; SOURCE LINE # 111
MOV DPTR,#counter?142
MOVX A,@DPTR
MOV R7,A
RET
; }
; SOURCE LINE # 112
; }
; SOURCE LINE # 113
?C0012:
MOV DPTR,#counter?142
MOVX A,@DPTR
INC A
MOVX @DPTR,A
MOVX A,@DPTR
CLR C
SUBB A,#08H
JC ?C0010
?C0011:
; return(ERROR); /*r若没有扫描到按下键就返回ERROR*/
; SOURCE LINE # 114
MOV R7,#0FFH
; }
; SOURCE LINE # 115
?C0014:
RET
; END OF KeyCheck
;
;
;
;
; /******************************************************************************************
; *函数名: led_key_led_control
; *参数: LedIndex 点亮的LED发光管号,其取值从1~8有效
; *返回值: 无
; *描述: 根据LedIndex的值决定选择点亮哪一只LED管
; *编写: 王绍伟
; *版本信息: V1.0 2003年8月15日
; ******************************************************************************************/
;
; extern void led_key_led_control(byte LedIndex)
RSEG ?PR?_led_key_led_control?LED_KEY
_led_key_led_control:
USING 0
; SOURCE LINE # 129
;---- Variable 'LedIndex?243' assigned to Register 'R7' ----
; {
; SOURCE LINE # 130
; P1 = 0xFF;
; SOURCE LINE # 131
MOV P1,#0FFH
; if(LedIndex)
; SOURCE LINE # 132
MOV A,R7
JZ ?C0016
; {
; SOURCE LINE # 133
; LedIndex = 1 << (LedIndex - 1); /*r当1左移(LedIndex-1)位后,发送到串并行转换电路*/
; SOURCE LINE # 134
DEC A
MOV R7,A
MOV A,#01H
MOV R0,AR7
INC R0
SJMP ?C0029
?C0028:
CLR C
RLC A
?C0029:
DJNZ R0,?C0028
; SendData(~LedIndex);
; SOURCE LINE # 135
CPL A
MOV R7,A
LCALL _SendData
; LED = 0; /*r开启DP-51的Q1三极管,这样就可以开启LED管点亮*/
; SOURCE LINE # 136
CLR LED
; }
; SOURCE LINE # 137
;
;
; }
; SOURCE LINE # 140
?C0016:
RET
; END OF _led_key_led_control
;
;
; /******************************************************************************************
; *函数名: led_key_led_display_control
; *参数: value LED显示数码值
; boDp 是否显示小数点
; LedDisplayIndex 代表显示那一块LED
; *返回值: 无
; *描述: 对选择的LED模块让其显示一个数码的程序
; *编写: 王绍伟
; *版本信息: V1.0 2003年8月15日
; ******************************************************************************************/
; extern void led_key_led_display_control(byte LedDisplayIndex, bool boDp, byte value)
RSEG ?PR?_led_key_led_display_control?LED_KEY
_led_key_led_display_control:
USING 0
; SOURCE LINE # 153
;---- Variable 'LedDisplayIndex?344' assigned to Register 'R6' ----
MOV R6,AR7
; {
; SOURCE LINE # 154
; byte i;
; i = boDp;
; SOURCE LINE # 156
MOV C,boDp?345
CLR A
RLC A
MOV R7,A
;---- Variable 'i?347' assigned to Register 'R7' ----
; P1 = 0xFF;
; SOURCE LINE # 157
MOV P1,#0FFH
; SendData(LedDisplayMap[i][value]); /*r发送LED显示数据到串并转换电路*/
; SOURCE LINE # 158
MOV DPTR,#value?346
MOVX A,@DPTR
MOV R5,A
MOV A,R7
SWAP A
ANL A,#0F0H
ADD A,#LOW (LedDisplayMap)
MOV DPL,A
CLR A
ADDC A,#HIGH (LedDisplayMap)
MOV DPH,A
MOV A,DPL
ADD A,R5
MOV DPL,A
CLR A
ADDC A,DPH
MOV DPH,A
CLR A
MOVC A,@A+DPTR
MOV R7,A
LCALL _SendData
;
; P1 &= ~(0x04 << LedDisplayIndex);
; SOURCE LINE # 160
MOV R7,AR6
MOV A,#04H
MOV R0,AR7
INC R0
SJMP ?C0031
?C0030:
CLR C
RLC A
?C0031:
DJNZ R0,?C0030
CPL A
ANL P1,A
; }
; SOURCE LINE # 161
RET
; END OF _led_key_led_display_control
;
;
; /******************************************************************************************
; *函数名: led_key_key_check
; *参数: 无
; *返回值: 无
; *描述: 按键扫描判定程序
; *编写: 王绍伟
; *版本信息: V1.0 2003年8月15日
; ******************************************************************************************/
; extern void led_key_key_check(void) /*5*5=25mS*/
RSEG ?PR?led_key_key_check?LED_KEY
led_key_key_check:
USING 0
; SOURCE LINE # 172
; {
; SOURCE LINE # 173
; byte i;
;
; P1 = 0xFF; /*初始化原状态,以免引起错误*/
; SOURCE LINE # 176
MOV P1,#0FFH
; SDA = 0;
; SOURCE LINE # 177
CLR SDA
; for(i = 0; i < 8; i++) /*r基于DP-51硬件构造,先向扫描线上发送低电平*/
; SOURCE LINE # 178
CLR A
MOV DPTR,#i?448
MOVX @DPTR,A
?C0018:
; {
; SOURCE LINE # 179
; SCL = 0;
; SOURCE LINE # 180
CLR SCL
; SCL = 1;
; SOURCE LINE # 181
SETB SCL
; }
; SOURCE LINE # 182
MOV DPTR,#i?448
MOVX A,@DPTR
INC A
MOVX @DPTR,A
MOVX A,@DPTR
CJNE A,#08H,?C0018
?C0019:
;
; if(KEY) /*r检测反馈线,若无键按下,则KEY(P1.2)则会保持高电平,此时判定无键按下,退出键扫程序*/
; SOURCE LINE # 184
JNB KEY,?C0021
; {
; SOURCE LINE # 185
; KeyCounter = 0;
; SOURCE LINE # 186
CLR A
MOV KeyCounter,A
RET
; return;
; }
; SOURCE LINE # 188
?C0021:
;
; if(KeyIntervalSafeguard) /*设置这段程序是为了让判定两次按键之间的时间间隔大于等于0.1s,此段程序在初始化后第一次按键时并不执行*/
; SOURCE LINE # 190
MOV A,KeyIntervalSafeguard
JZ ?C0023
; {
; SOURCE LINE # 191
; KeyIntervalSafeguard--;
; SOURCE LINE # 192
DEC KeyIntervalSafeguard
RET
; return;
; }
; SOURCE LINE # 194
?C0023:
;
; KeyCounter++; /*r每25ms执行一次本程序,也就使KeyCounter自加1*/
; SOURCE LINE # 196
INC KeyCounter
;
;
; if(KeyCounter == KEY_SHORT_INTERVAL) /*r若非保持持续按键状态(超过75ms),系统每50ms检测一次按键,若没有按键,退出;若有,发出消息*/
; SOURCE LINE # 199
MOV A,KeyCounter
CJNE A,#02H,?C0024
; {
; SOURCE LINE # 200
; i = KeyCheck();
; SOURCE LINE # 201
LCALL KeyCheck
MOV DPTR,#i?448
MOV A,R7
MOVX @DPTR,A
; if(i == ERROR)
; SOURCE LINE # 202
CPL A
JZ ?C0022
; {
; SOURCE LINE # 203
; return;
; }
; SOURCE LINE # 205
?C0025:
; msg_queue_in(MSG_KEY, KeyMap[i]);
; SOURCE LINE # 206
MOV DPTR,#i?448
MOVX A,@DPTR
MOV DPTR,#KeyMap
MOVC A,@A+DPTR
MOV R5,A
MOV R7,#01H
LCALL _msg_queue_in
; KeyIntervalSafeguard = 3; /*r确保系统在判定有按键按下后的0.1s内不会对按键的抖动作出多次按键判定*/
; SOURCE LINE # 207
MOV KeyIntervalSafeguard,#03H
; }
; SOURCE LINE # 208
?C0024:
;
; if(KeyCounter == KEY_LONG_INTERVAL) /*r连续按键判定,如果持续按键超过一秒钟,若不松键,则接下去每经过0.1s,系统就认定又按了一次键*/
; SOURCE LINE # 210
MOV A,KeyCounter
CJNE A,#028H,?C0022
; {
; SOURCE LINE # 211
; i = KeyCheck();
; SOURCE LINE # 212
LCALL KeyCheck
MOV DPTR,#i?448
MOV A,R7
MOVX @DPTR,A
; if(i == ERROR)
; SOURCE LINE # 213
CPL A
JZ ?C0022
; {
; SOURCE LINE # 214
; return;
; }
; SOURCE LINE # 216
?C0027:
; msg_queue_in(MSG_KEY, KeyMap[i]);
; SOURCE LINE # 217
MOV DPTR,#i?448
MOVX A,@DPTR
MOV DPTR,#KeyMap
MOVC A,@A+DPTR
MOV R5,A
MOV R7,#01H
LCALL _msg_queue_in
; KeyCounter -= 4;
; SOURCE LINE # 218
MOV A,#0FCH
ADD A,KeyCounter
MOV KeyCounter,A
; }
; SOURCE LINE # 219
; }
; SOURCE LINE # 220
?C0022:
RET
; END OF led_key_key_check
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -