MOV DPTR,#CONPORT MOVX @DPTR,A NOP
NOP
NOP NOP NOP
BEGIN:MOV R0,#00H LOOP:MOV B,#10 MOV A,R0 DIV AB
MOV DPTR,#TAB
MOVC A,@A+DPTR
XCH A,B
MOVC A,@A+DPTR MOV DPTR,#APORT
MOVX @DPTR,A MOV A,B
MOV DPTR,#BPORT MOVX @DPTR,A
INC R0
LCALL DELAY_1S CJNE R0,#100,LOOP LJMP BEGIN
DELAY_1S:MOV R7,#42H DL1: MOV R6,#0DAH DL0: MOV R5,#0CFH
DJNZ R5,$ DJNZ R6,DL0
DJNZ R7,DL1 RET
TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,092H,082H,0F8H,080H,090H ;TAB是0-9对应的段码值表 END C51程序:
#include
#define APORT XBYTE[0XF8FF] #define BPORT XBYTE[0XF9FF] #define CONPORT XBYTE[0xFBFF]
unsingned char code seg[10]={0xC0,0xF9,0xA4, 0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; void delay_1s(); void main() {
unsinged char i; CONPORT=0x80; while(1) {
for(i=0;i<100;i++) {
APORT=seg[i/10]; BPORT=seg[i]; delay_1s(); } } }
void delay_1s() {
unsinged char a,b,c; for(c=142;c>0;c--)
} 11-8
for(b=168;b>0;b--)
for(a=250;a>0;a--);
如图11-46所示,在P1.0-P1.7引脚连接8个按键,分别定义为1号、2号….8
号,在P3口连接一个共阳极数码管,编写程序,使8个按键中任意一个按下时,数码管上显示对应的键序号。
图11-46 习题11-8题的电路
汇编语言程序:
ORG 0000H LJMP MAIN ORG 0100H
MAIN: MOV SP,#0AFH
MOV P1,#0FFH
NOP NOP NOP
LOOP:MOV A,P1
CJNE A,#0FFH,LOOP1 SJMP LOOP
LOOP1:LCALL DELAY_15ms
MOV A,P1
CJNE A,#0FFH,LOOP2 SJMP LOOP
LOOP2:
JNB ACC.0,KEY1 JNB ACC.1,KEY2 JNB ACC.2,KEY3
JNB ACC.3,KEY4 JNB ACC.4,KEY5
JNB ACC.5,KEY6 JNB ACC.6,KEY7 JNB ACC.7,KEY8 LJMP LOOP
KEY1: MOV P3,#0F9H
AJMP LOOP
KEY2: MOV P3,#0A4H
AJMP LOOP
KEY3: MOV P3,#0B0H
AJMP LOOP
KEY4: MOV P3,#99H
AJMP LOOP
KEY5: MOV P3,#92H
AJMP LOOP
KEY6: MOV P3,#82H
AJMP LOOP
KEY7: MOV P3,#0F8H
AJMP LOOP
KEY8: MOV P3,#80H
AJMP LOOP
DELAY_15ms:MOV R6,#177 DL0:
C51程序:
#include
void KEY8(); void main() { P1=0xFF; while(1) {
temp=P1; if(temp!=0xFF) {
delay_15ms(); temp=P1; if(temp!=0xFF) {
switch(temp) {
case 0xFE:KEY1();break; case 0xFD:KEY2();break;
MOV R5,#0 DJNZ R5,$ DJNZ R6,DL0 RET END