⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 led_key.src

📁 一个完整的51单片机的操作糸统源程序! 内容十分丰富!很有借鉴价值!
💻 SRC
📖 第 1 页 / 共 2 页
字号:
	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 + -