📄 keyscan_led.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 + -