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

📄 keyscan_led.src

📁 基于51单片机的键盘扫描程序
💻 SRC
字号:
; keyscan_led.SRC generated from: keyscan_led.c
; COMPILER INVOKED BY:
;        C:\Program Files\Keil\C51\BIN\C51.EXE keyscan_led.c BROWSE DEBUG OBJECTEXTEND

$NOMOD51

NAME	KEYSCAN_LED

P0	DATA	080H
P1	DATA	090H
P2	DATA	0A0H
P3	DATA	0B0H
T0	BIT	0B0H.4
AC	BIT	0D0H.6
T1	BIT	0B0H.5
EA	BIT	0A8H.7
IE	DATA	0A8H
P0_0	BIT	080H.0
P1_0	BIT	090H.0
P0_1	BIT	080H.1
P1_1	BIT	090H.1
P0_2	BIT	080H.2
P1_2	BIT	090H.2
P0_3	BIT	080H.3
P1_3	BIT	090H.3
P0_4	BIT	080H.4
P1_4	BIT	090H.4
P0_5	BIT	080H.5
P1_5	BIT	090H.5
RD	BIT	0B0H.7
P1_6	BIT	090H.6
P1_7	BIT	090H.7
ES	BIT	0A8H.4
IP	DATA	0B8H
RI	BIT	098H.0
INT0	BIT	0B0H.2
CY	BIT	0D0H.7
TI	BIT	098H.1
INT1	BIT	0B0H.3
PS	BIT	0B8H.4
SP	DATA	081H
OV	BIT	0D0H.2
WR	BIT	0B0H.6
SBUF	DATA	099H
PCON	DATA	087H
SCON	DATA	098H
TMOD	DATA	089H
TCON	DATA	088H
IE0	BIT	088H.1
IE1	BIT	088H.3
B	DATA	0F0H
ACC	DATA	0E0H
ET0	BIT	0A8H.1
ET1	BIT	0A8H.3
TF0	BIT	088H.5
TF1	BIT	088H.7
RB8	BIT	098H.2
TH0	DATA	08CH
EX0	BIT	0A8H.0
IT0	BIT	088H.0
TH1	DATA	08DH
TB8	BIT	098H.3
EX1	BIT	0A8H.2
IT1	BIT	088H.2
P	BIT	0D0H.0
SM0	BIT	098H.7
TL0	DATA	08AH
SM1	BIT	098H.6
TL1	DATA	08BH
SM2	BIT	098H.5
PT0	BIT	0B8H.1
PT1	BIT	0B8H.3
RS0	BIT	0D0H.3
TR0	BIT	088H.4
RS1	BIT	0D0H.4
TR1	BIT	088H.6
PX0	BIT	0B8H.0
PX1	BIT	0B8H.2
DPH	DATA	083H
DPL	DATA	082H
REN	BIT	098H.4
RXD	BIT	0B0H.0
TXD	BIT	0B0H.1
F0	BIT	0D0H.5
PSW	DATA	0D0H
?PR?main?KEYSCAN_LED SEGMENT CODE 
?DT?main?KEYSCAN_LED SEGMENT DATA OVERLAYABLE 
?PR?init?KEYSCAN_LED SEGMENT CODE 
?PR?keyscan?KEYSCAN_LED                  SEGMENT CODE 
?PR?_display?KEYSCAN_LED                 SEGMENT CODE 
?PR?_deci_7?KEYSCAN_LED                  SEGMENT CODE 
?PR?_delay?KEYSCAN_LED                   SEGMENT CODE 
?C_INITSEG           SEGMENT CODE 
?DT?KEYSCAN_LED      SEGMENT DATA 
	EXTRN	CODE (?C_STARTUP)
	EXTRN	CODE (?C?IMUL)
	PUBLIC	LED_disp
	PUBLIC	LED_count
	PUBLIC	LED_num
	PUBLIC	_delay
	PUBLIC	_deci_7
	PUBLIC	_display
	PUBLIC	keyscan
	PUBLIC	init
	PUBLIC	main

	RSEG  ?DT?main?KEYSCAN_LED
?main?BYTE:
    keyword?040:   DS   2

	RSEG  ?DT?KEYSCAN_LED
        LED_num:   DS   12
      LED_count:   DS   2
       LED_disp:   DS   2

	RSEG  ?C_INITSEG
	DB	002H
	DB	LED_disp
	DW	00001H

	DB	002H
	DB	LED_count
	DW	00000H

; //4×4键盘扫描及6位LED显示程序
; #pragma SRC
; #include "stdio.h"
; #include "reg51.h"
; 
; #define TRUE 1
; #define FALSE 0
; #define DELAY_VALUE 3
; 
; #define PinDrvKey0 P1_0	//定义驱动IO口
; #define PinDrvKey1 P1_1
; #define PinDrvKey2 P1_2
; #define PinDrvKey3 P1_3
; 
; #define PinScanKey0 P1_4//定义扫描信号获取IO口
; #define PinScanKey1 P1_5
; #define PinScanKey2 P1_6
; #define PinScanKey3 P1_7
; 
; #define PinLamP0 P0_0//定义LED显示IO口
; #define PinLamP1 P0_1
; #define PinLamP2 P0_2
; #define PinLamP3 P0_3
; #define PinLamP4 P0_4
; #define PinLamP5 P0_5
; 
; sbit P0_0=P0^0;
; sbit P0_1=P0^1;
; sbit P0_2=P0^2;
; sbit P0_3=P0^3;
; sbit P0_4=P0^4;
; sbit P0_5=P0^5;
; 
; sbit P1_0=P1^0;
; sbit P1_1=P1^1;
; sbit P1_2=P1^2;
; sbit P1_3=P1^3;
; sbit P1_4=P1^4;
; sbit P1_5=P1^5;
; sbit P1_6=P1^6;
; sbit P1_7=P1^7;
; 
; void init(void);
; void delay(int i);
; int keyscan(void);
; int deci_7(int keyword);
; void display(int keyword);
; int LED_disp=1;//00000001B
; int LED_count=0;
; int LED_num[6];
; 
; void main(void)//主程序开始

	RSEG  ?PR?main?KEYSCAN_LED
main:
	USING	0
			; SOURCE LINE # 52
; 	{
			; SOURCE LINE # 53
; 	int keyword;
; 	init();
			; SOURCE LINE # 55
	LCALL	init
?C0001:
; 	while(1)
			; SOURCE LINE # 56
; 		{
			; SOURCE LINE # 57
; 		 keyword=keyscan();
			; SOURCE LINE # 58
	LCALL	keyscan
	MOV  	keyword?040,R6
	MOV  	keyword?040+01H,R7
; 		 LED_num[LED_count]=deci_7(keyword);//七段码转换并保存每个LED上的数值
			; SOURCE LINE # 59
	LCALL	_deci_7
	MOV  	A,LED_count+01H
	ADD  	A,ACC
	ADD  	A,#LOW (LED_num)
	MOV  	R0,A
	MOV  	@R0,AR6
	INC  	R0
	MOV  	@R0,AR7
; 		 display(keyword);
			; SOURCE LINE # 60
	MOV  	R7,keyword?040+01H
	MOV  	R6,keyword?040
	LCALL	_display
; 		}
			; SOURCE LINE # 61
	SJMP 	?C0001
; END OF main

; 	}
; 
; void init(void)

	RSEG  ?PR?init?KEYSCAN_LED
init:
			; SOURCE LINE # 64
; 	{
			; SOURCE LINE # 65
; 	PinDrvKey0=FALSE; //驱动信号线设为低
			; SOURCE LINE # 66
	CLR  	P1_0
; 	PinDrvKey0=FALSE;
			; SOURCE LINE # 67
	CLR  	P1_0
; 	PinDrvKey0=FALSE;
			; SOURCE LINE # 68
	CLR  	P1_0
; 	PinDrvKey0=FALSE;
			; SOURCE LINE # 69
	CLR  	P1_0
; 	PinLamP0=FALSE;	  //LED为高电平驱动,不亮
			; SOURCE LINE # 70
	CLR  	P0_0
; 	PinLamP1=FALSE;	
			; SOURCE LINE # 71
	CLR  	P0_1
; 	PinLamP2=FALSE;	
			; SOURCE LINE # 72
	CLR  	P0_2
; 	PinLamP3=FALSE;	
			; SOURCE LINE # 73
	CLR  	P0_3
; 	PinLamP4=FALSE;	
			; SOURCE LINE # 74
	CLR  	P0_4
; 	PinLamP5=FALSE;	
			; SOURCE LINE # 75
	CLR  	P0_5
; 	}
			; SOURCE LINE # 76
	RET  	
; END OF init

; 
; int keyscan(void)

	RSEG  ?PR?keyscan?KEYSCAN_LED
keyscan:
	USING	0
			; SOURCE LINE # 78
;---- Variable 'i?241' assigned to Register 'R4/R5' ----
;---- Variable 'j?242' assigned to Register 'R2/R3' ----
; 	{
			; SOURCE LINE # 79
; 	 int i,j,scancode=1;
			; SOURCE LINE # 80
;---- Variable 'scancode?243' assigned to Register 'R6/R7' ----
	MOV  	R7,#01H
	MOV  	R6,#00H
; 	 P1=15;//00001111B
			; SOURCE LINE # 81
	MOV  	P1,#0FH
?C0005:
; 	 while(1)
			; SOURCE LINE # 82
; 	 	{
			; SOURCE LINE # 83
; 		 if(P1>15)//有按键则大于15
			; SOURCE LINE # 84
	MOV  	A,P1
	SETB 	C
	SUBB 	A,#0FH
	JC   	?C0005
; 		 	{
			; SOURCE LINE # 85
; 			 for(i=0;i<1000;i++);//软件延时
			; SOURCE LINE # 86
	CLR  	A
	MOV  	R4,A
	MOV  	R5,A
?C0008:
	INC  	R5
	CJNE 	R5,#00H,?C0053
	INC  	R4
?C0053:
	CJNE 	R4,#03H,?C0008
	CJNE 	R5,#0E8H,?C0008
?C0009:
; 			 if(P1>15)//去抖
			; SOURCE LINE # 87
	MOV  	A,P1
	SETB 	C
	SUBB 	A,#0FH
	JC   	?C0005
; 			 	break;
			; SOURCE LINE # 88
; 			}
			; SOURCE LINE # 89
; 		}
			; SOURCE LINE # 90
?C0006:
; 	if(P1==31)
			; SOURCE LINE # 91
	MOV  	A,P1
	CJNE 	A,#01FH,?C0012
; 		j=0;
			; SOURCE LINE # 92
	CLR  	A
	MOV  	R2,A
	MOV  	R3,A
	SJMP 	?C0013
?C0012:
; 	else if(P1==47)
			; SOURCE LINE # 93
	MOV  	A,P1
	CJNE 	A,#02FH,?C0014
; 		j=1;
			; SOURCE LINE # 94
	MOV  	R2,#00H
	MOV  	R3,#01H
	SJMP 	?C0013
?C0014:
; 	else if(P1==79)
			; SOURCE LINE # 95
	MOV  	A,P1
	CJNE 	A,#04FH,?C0016
; 		j=2;
			; SOURCE LINE # 96
	MOV  	R2,#00H
	MOV  	R3,#02H
	SJMP 	?C0013
?C0016:
; 	else if(P1==143)
			; SOURCE LINE # 97
	MOV  	A,P1
	CJNE 	A,#08FH,?C0013
; 		j=3;
			; SOURCE LINE # 98
	MOV  	R2,#00H
	MOV  	R3,#03H
?C0013:
; 	P1=scancode;//00000001B
			; SOURCE LINE # 99
	MOV  	P1,R7
; 	for(i=1;i<4;i++)
			; SOURCE LINE # 100
	MOV  	R4,#00H
	MOV  	R5,#01H
?C0019:
; 		{
			; SOURCE LINE # 101
; 		 if(P1!=scancode)
			; SOURCE LINE # 102
	MOV  	R1,P1
	MOV  	A,R1
	CJNE 	A,AR7,?C0020
	CLR  	A
	CJNE 	A,AR6,?C0020
; 		 	break;
			; SOURCE LINE # 103
?C0022:
; 		 else 
; 		 	{scancode=scancode<<1;//扫描码左移一位
			; SOURCE LINE # 105
	MOV  	A,R7
	ADD  	A,ACC
	MOV  	R7,A
	MOV  	A,R6
	RLC  	A
	MOV  	R6,A
; 			 P1=scancode;
			; SOURCE LINE # 106
	MOV  	P1,R7
; 			}
			; SOURCE LINE # 107
; 		}
			; SOURCE LINE # 108
?C0021:
	INC  	R5
	CJNE 	R5,#00H,?C0055
	INC  	R4
?C0055:
	MOV  	A,R5
	XRL  	A,#04H
	ORL  	A,R4
	JNZ  	?C0019
?C0020:
; 	return (j*4+i);
			; SOURCE LINE # 109
	MOV  	A,R3
	MOV  	R6,AR2
	MOV  	R0,#02H
?C0056:
	CLR  	C
	RLC  	A
	XCH  	A,R6
	RLC  	A
	XCH  	A,R6
	DJNZ 	R0,?C0056
	ADD  	A,R5
	MOV  	R7,A
	MOV  	A,R6
	ADDC 	A,R4
	MOV  	R6,A
; 	}
			; SOURCE LINE # 110
?C0024:
	RET  	
; END OF keyscan

; 
; void display(int keyword)

	RSEG  ?PR?_display?KEYSCAN_LED
_display:
	USING	0
			; SOURCE LINE # 112
;---- Variable 'keyword?344' assigned to Register 'R6/R7' ----
; 	{
			; SOURCE LINE # 113
; 	 int i,j=LED_count;
			; SOURCE LINE # 114
;---- Variable 'j?346' assigned to Register 'R4/R5' ----
	MOV  	R5,LED_count+01H
	MOV  	R4,LED_count
; 	 P0=LED_disp;//P0口选择位,P2口送键盘扫描码
			; SOURCE LINE # 115
	MOV  	P0,LED_disp+01H
; 	 for(i=0;i<LED_count;i++)
			; SOURCE LINE # 116
;---- Variable 'i?345' assigned to Register 'R2/R3' ----
	CLR  	A
	MOV  	R3,A
	MOV  	R2,A
?C0025:
	CLR  	C
	MOV  	A,R3
	SUBB 	A,LED_count+01H
	MOV  	A,LED_count
	XRL  	A,#080H
	MOV  	R0,A
	MOV  	A,R2
	XRL  	A,#080H
	SUBB 	A,R0
	JNC  	?C0026
; 	 	{
			; SOURCE LINE # 117
; 		 P2=LED_num[j--];//送数
			; SOURCE LINE # 118
	MOV  	A,R5
	DEC  	R5
	JNZ  	?C0057
	DEC  	R4
?C0057:
	ADD  	A,ACC
	ADD  	A,#LOW (LED_num)
	MOV  	R0,A
	INC  	R0
	MOV  	A,@R0
	MOV  	P2,A
; 		 P0=P0>>1;//右移1位,控制位		 
			; SOURCE LINE # 119
	MOV  	A,P0
	CLR  	C
	RRC  	A
	MOV  	P0,A
; 		}
			; SOURCE LINE # 120
	INC  	R3
	CJNE 	R3,#00H,?C0058
	INC  	R2
?C0058:
	SJMP 	?C0025
?C0026:
; 	P0=1;//00000001B
			; SOURCE LINE # 121
	MOV  	P0,#01H
; 	P2=deci_7(keyword);
			; SOURCE LINE # 122
	LCALL	_deci_7
	MOV  	P2,R7
; 	if(LED_count==6)//当前以显示到第六位
			; SOURCE LINE # 123
	MOV  	A,LED_count+01H
	XRL  	A,#06H
	ORL  	A,LED_count
	JNZ  	?C0028
; 		{
			; SOURCE LINE # 124
; 		LED_disp=32;//不变
			; SOURCE LINE # 125
	MOV  	LED_disp,A
	MOV  	LED_disp+01H,#020H
; 		LED_count=6;
			; SOURCE LINE # 126
	MOV  	LED_count,A
	MOV  	LED_count+01H,#06H
; 		}
			; SOURCE LINE # 127
	RET  	
?C0028:
; 	else 
; 		{
			; SOURCE LINE # 129
; 		LED_disp=LED_disp<<1;	
			; SOURCE LINE # 130
	MOV  	A,LED_disp+01H
	ADD  	A,ACC
	MOV  	LED_disp+01H,A
	MOV  	A,LED_disp
	RLC  	A
	MOV  	LED_disp,A
; 		LED_count=LED_count+1;
			; SOURCE LINE # 131
	INC  	LED_count+01H
	MOV  	A,LED_count+01H
	JNZ  	?C0059
	INC  	LED_count
?C0059:
; 		} 
			; SOURCE LINE # 132
; 	}
			; SOURCE LINE # 133
?C0030:
	RET  	
; END OF _display

; 	
; int deci_7(int keyword)

	RSEG  ?PR?_deci_7?KEYSCAN_LED
_deci_7:
	USING	0
			; SOURCE LINE # 135
;---- Variable 'res?448' assigned to Register 'R4/R5' ----
;---- Variable 'keyword?447' assigned to Register 'R6/R7' ----
; 	{
			; SOURCE LINE # 136
; 	 int res;
; 	 switch(keyword)//共阴接法,高电平亮
			; SOURCE LINE # 138
	MOV  	A,R6
	JNZ  	?C0049
	MOV  	A,R7
	CJNE 	A,#010H,?C0060
?C0060:
	JNC  	?C0049
	MOV  	DPTR,#?C0061
	MOV  	R0,A
	ADD  	A,R0
	ADD  	A,R0
	JMP  	@A+DPTR
?C0061:
	LJMP 	?C0045
	LJMP 	?C0045
	LJMP 	?C0045
	LJMP 	?C0045
	LJMP 	?C0045
	LJMP 	?C0045
	LJMP 	?C0045
	LJMP 	?C0045
	LJMP 	?C0045
	LJMP 	?C0045
	LJMP 	?C0045
	LJMP 	?C0045
	LJMP 	?C0045
	LJMP 	?C0045
	LJMP 	?C0045
	LJMP 	?C0047
; 	 	{
			; SOURCE LINE # 139
; 		 case 0:res=0x3F;break;
			; SOURCE LINE # 140
?C0032:
	RET  	
; 		 case 1:res=0x06;break;
			; SOURCE LINE # 141
; 		 case 2:res=0x5B;break;
			; SOURCE LINE # 142
; 		 case 3:res=0x4F;break;
			; SOURCE LINE # 143
; 		 case 4:res=0x66;break;
			; SOURCE LINE # 144
; 		 case 5:res=0x6D;break;
			; SOURCE LINE # 145
; 		 case 6:res=0x7D;break;
			; SOURCE LINE # 146
; 		 case 7:res=0x07;break;
			; SOURCE LINE # 147
; 		 case 8:res=0x7F;break;
			; SOURCE LINE # 148
; 		 case 9:res=0x6F;break;
			; SOURCE LINE # 149
; 		 case 10:res=0x77;break;
			; SOURCE LINE # 150
; 		 case 11:res=0x7C;break;
			; SOURCE LINE # 151
; 		 case 12:res=0x39;break;
			; SOURCE LINE # 152
; 		 case 13:res=0x5E;break;
			; SOURCE LINE # 153
?C0045:
	RET  	
; 		 case 14:res=0x79;break;
			; SOURCE LINE # 154
; 		 case 15:res=0x71;break;
			; SOURCE LINE # 155
?C0047:
; 		 default:break;
			; SOURCE LINE # 156
; 		}
			; SOURCE LINE # 157
; 	/*
; 	switch(keyword)//共阳接法,低电平亮
; 	 	{
; 		 case 0:res=0xC0;break;
; 		 case 1:res=0xF9;break;
; 		 case 2:res=0xA4;break;
; 		 case 3:res=0xB0;break;
; 		 case 4:res=0x99;break;
; 		 case 5:res=0x92;break;
; 		 case 6:res=0x82;break;
; 		 case 7:res=0xF8;break;
; 		 case 8:res=0x80;break;
; 		 case 9:res=0x90;break;
; 		 case 10:res=0x88;break;
; 		 case 11:res=0x83;break;
; 		 case 12:res=0xC6;break;
; 		 case 13:res=0xA1;break;
; 		 case 14:res=0x86;break;
; 		 case 15:res=0x8E;break;
; 		 default:break;
; 		}			   
; 	*/				   
; 	}
			; SOURCE LINE # 180
?C0049:
	RET  	
; END OF _deci_7

; 
; void delay(int i)

	RSEG  ?PR?_delay?KEYSCAN_LED
_delay:
	USING	0
			; SOURCE LINE # 182
;---- Variable 'i?549' assigned to Register 'R6/R7' ----
; 	{
			; SOURCE LINE # 183
; 	 int j=0,k=0;
			; SOURCE LINE # 184
;---- Variable 'j?550' assigned to Register 'R2/R3' ----
	CLR  	A
	MOV  	R3,A
	MOV  	R2,A
;---- Variable 'k?551' assigned to Register 'R4/R5' ----
	MOV  	R4,A
; 	 k=i*DELAY_VALUE;
			; SOURCE LINE # 185
	MOV  	R5,#03H
	LCALL	?C?IMUL
	MOV  	R4,AR6
	MOV  	R5,AR7
?C0050:
; 	 while(j<k)
			; SOURCE LINE # 186
	CLR  	C
	MOV  	A,R3
	SUBB 	A,R5
	MOV  	A,R4
	XRL  	A,#080H
	MOV  	R0,A
	MOV  	A,R2
	XRL  	A,#080H
	SUBB 	A,R0
	JNC  	?C0052
; 	 	j++;
			; SOURCE LINE # 187
	INC  	R3
	CJNE 	R3,#00H,?C0062
	INC  	R2
?C0062:
	SJMP 	?C0050
; 	}			; SOURCE LINE # 188
?C0052:
	RET  	
; END OF _delay

	END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -