参考程序:
1、 ASM程序:
ORG 0000H
AJMP <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />MAIN
ORG 0030H
MAIN: MOV SP,#6FH
MOV R2,#4
MOV R0,#30H
MOV A,#1DH
LOP1: MOV @R0,A
INC R0
DJNZ R2,LOP1
LOOP: ACALL DISP
ACALL KEY
MOV A,#0FFH
XRL A,R3
JZ LOOP
ACALL SX
MOV 33H,R3
SJMP LOOP
SX: MOV R0,#31H
MOV R1,#30H
MOV R2,#3
LOP2: MOV A,@R0
MOV @R1,A
INC R0
INC R1
DJNZ R2,LOP2
RET
KEY: MOV P1,#0F0H
MOV A,P1
XRL A,#0F0H
JZ NONE
ACALL DE10
MOV P1,#0F0H
MOV A,P1
XRL A,#0F0H
JZ NONE
MOV A,P1
MOV P1,#0FH
ORL A,P1
MOV R4,A
MOV P1,#0F0H
LK1: MOV A,P1
XRL A,#0F0H
JNZ LK1
ACALL DE10
MOV R5,#10H
MOV R3,#0
MOV DPTR,#TABK
LK2: CLR A
MOVC A,@A+DPTR
XRL A,R4
JZ FHK
INC R3
INC DPTR
DJNZ R5,LK2
NONE: MOV R3,#0FFH
FHK: RET
TABK: DB 077H,0E7H,0EBH,0EDH
DB 0D7H,0DBH,0DDH,0B7H
DB 0BBH,0BDH,07BH,07DH
DB 07EH,0BEH,0DEH,0EEH
DE10: MOV R5,#20
JMP LPD1
DELAY: MOV R5,#2
LPD1: MOV R6,#2
LPD2: MOV R7,#250
DJNZ R7,$
DJNZ R6,LPD2
DJNZ R5,LPD1
RET
DISP: MOV R2,#4
MOV R0,#30H
MOV R3,#08H
MOV DPTR,#TABD
LDP: MOV A,@R0
MOVC A,@A+DPTR
MOV P0,A
MOV P2,R3
MOV A,R3
RL A
MOV R3,A
INC R0
ACALL DELAY
DJNZ R2,LDP
RET
TABD: DB 5FH,44H,3DH,6DH
DB 66H,6BH,7BH,45H
DB 7FH,6FH,77H,7AH
DB 1BH,7CH,3BH,33H
DB 0DFH,0C4H,0BDH,0EDH
DB 0E6H,0EBH,0FBH,0C5H
DB 0FFH,0EFH,76H,1AH
DB 37H,00H,20H,6EH
END
2、 C程序:
#include <AT89X51.h>
#define uchar unsigned char
uchar data dispbit,dispbuf[4];
void delay (unsigned int count);
void display(void);
uchar key (void);
void main(void)
{
uchar k,n;
for (k=0;k<4;k++)
{
dispbuf[k]=0x1D;
}
do
{
display();
n=key();
if(n!=0xFF)
{
for(k=0;k<3;k++)
{
dispbuf[k]=dispbuf[k+1];
}
dispbuf[3]=n;
}
}while(1);
}
void display(void)
{
const uchar design[32]={0x5F,0x44,0x3D,0x6D,0x66,0x6B,0x7B,0x45,
0x7F,0x6F,0x77,0x7A,0x1B,0x7C,0x3B,0x33,
0xDF,0xC4,0xBD,0xED,0xE6,0xEB,0xFB,0xC5,
0xFF,0xEF,0x76,0x1A,0x37,0x00,0x20,0x6E};
uchar i;
dispbit=0x08;
for(i=0;i<4;i++)
{
P0=design[dispbuf];
P2=dispbit;
dispbit=dispbit+dispbit;
delay (2);
}
}
void delay (unsigned int count)
{
unsigned int i,j;
for (i=0;i<count;i++)
for (j=0;j<120;j++);
}
uchar key(void)
{
uchar m,key1,keyin;
const uchar keycode[16]={0x77,0xE7,0xEB,0xED,
0xD7,0xDB,0xDD,0xB7,
0xBB,0xBD,0x7B,0x7D,
0x7E,0xBE,0xDE,0xEE};
keyin=0xFF;
P1=0xF0;
key1=P1;
if(key1!=0xF0)
{
delay(10);
P1=0xF0;
key1=P1;
if(key1!=0xF0)
{
key1=P1;
P1=0x0F;
key1=key1|P1;
do
{
m=P1;
}
while(m!=0x0F);
delay(10);
keyin=0x00;
while(keycode[keyin]!=key1)
{
keyin++;
}
}
}
return(keyin);
}
四、 任务改进:
1、 每次按键操作时,蜂鸣器响一声,作为指示;
2、 在发光二极管显示屏上显示出每次按下的按键的二进制键值;
3、 改变键值在数码管显示屏上的显示方式,得到不同的显示效果;
4、 会分别用汇编语言和C语言编写程序。
文章评论(0条评论)
登录后参与讨论