단편기 실험8
18592 단어 개인 학습 기록
실험8.1 P1구를 출력구로 삼아 순환 색등을 실현한다.(최소 5가지 형태)
이 제목은 매우 개방적인 제목이라고 할 수 있다. 각자 자신의 상상력을 발휘하여 더욱 많은 색등 모델을 창조한다.
C 언어 프로그램:
#include
#define uchar unsigned char
uchar a=0;
uchar mode5[8]={0x80,0x01,0x40,0x02,0x20,0x04,0x10,0x08};
uchar mode6[8]={0x81,0x42,0x24,0x18,0x24,0x42,0x81};
timer0()interrupt 1{
a++;
TH0=0x3c;
TL0=0xb0;
}
main(){
uchar mode=0;
uchar cnt=0;
uchar h=0;
uchar l=0;
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
EA=1;
ET0=1;
TR0=1;
P1=0x01;
while(1){
if(a==20){
if(mode<=4){
a=0;
}else if(mode<=6){
a=10;
}else{
a=0;
}
switch(mode){
case 0:{
P1<<=1;
P1+=1;
cnt++;
break;
}
case 1:{
P1<<=1;
cnt++;
break;
}
case 2:{
P1>>=1;
P1=P1|0x80;
cnt++;
break;
}
case 3:{
P1>>=1;
cnt++;
break;
}
case 4:{
P1=~P1;
cnt++;
break;
}
case 5:{
P1=mode5[cnt++];
break;
}
case 6:{
P1=mode6[cnt++];
break;
}
case 7:{
h>>=1;
h=h|0x80;
l<<=1;
l++;
P1=h|l;
cnt++;
break;
}
}
if(mode==0&&cnt==7){
cnt=0;
mode++;
}
if((mode==1||mode==2||mode==3||mode==5||mode==6)&&cnt==8){
cnt=0;
mode++;
}
if((mode==4||mode==7)&&cnt==4){
cnt=0;
mode++;
if(mode==8){
h=0;
l=0;
mode=0;
}
}
}
}
}
어셈블러의 모델은 C 언어와 다르다. 내가 쓴 모델이 아니기 때문이다. 그러나 이 프로그램이 돌아가는 구조는 내가 쓴 것이고 비교적 번거롭다.
ORG 0000H
AJMP START1
ORG 000BH
AJMP IP0
ORG 0030H
START1:
MOV A,#01H
MOV P1,A
MOV R7,#00H
MOV TMOD,#01H
MOV TH0,#3CH
MOV TL0,#0B0H
SETB ET0
SETB EA
MOV R6,#14H
SETB TR0
F:MOV P1,A
CJNE A,#80H,X
JMP Y
E:MOV P1,A
CJNE A,#01H,X
JMP Y
D:
JMP Y
H:MOV A,01H
MOV P1,A
JMP Y
L:MOV P1,A
CJNE A,#0FFH,X
JMP Y
I:MOV P1,A
CJNE A,#00H,X
MOV A,#80H
MOV P1,A
JMP Y
M:MOV P1,A
CJNE A,#0FFH,X
JMP Y
N:MOV P1,A
CJNE A,#00H,X
JMP Y
Y:INC R7
CJNE R7,#8,X
MOV R7,#0
MOV A,#01H
X:SJMP $
IP0:
DJNZ R6,RET0
MOV R6,#14H
PUSH ACC
MOV A,R7
ADD A,R7
MOV DPTR,#MODETAB
JMP @A+DPTR
RET0:
MOV TH0,#3CH
MOV TL0,#0B0H
SETB TR0
RETI
MODETAB:
AJMP MODE1
AJMP MODE2
AJMP MODE3
AJMP MODE4
AJMP MODE5
AJMP MODE6
AJMP MODE7
AJMP MODE8
MODE1:
POP ACC
RL A
POP DPL
POP DPH
MOV DPTR,#F
PUSH DPL
PUSH DPH
RETI
MODE2:
POP ACC
RR A
POP DPL
POP DPH
MOV DPTR,#E
PUSH DPL
PUSH DPH
RETI
MODE3:
POP ACC
MOV A,#0FFH
MOV P1,A
SJMP DELAY1
J:POP DPL
POP DPH
MOV DPTR,#D
PUSH DPL
PUSH DPH
RETI
MODE4:
POP ACC
MOV A,#00H
MOV P1,A
SJMP DELAY2
K:POP DPL
POP DPH
MOV DPTR,#H
PUSH DPL
PUSH DPH
RETI
MODE5:
POP ACC
RL A
INC A
POP DPL
POP DPH
MOV DPTR,#L
PUSH DPL
PUSH DPH
RETI
MODE6:
POP ACC
RL A
DEC A
POP DPL
POP DPH
MOV DPTR,#I
PUSH DPL
PUSH DPH
RETI
MODE7:
POP ACC
RR A
ORL A,#80H
POP DPL
POP DPH
MOV DPTR,#M
PUSH DPL
PUSH DPH
RETI
MODE8:
POP ACC
RR A
ANL A,#7FH
POP DPL
POP DPH
MOV DPTR,#N
PUSH DPL
PUSH DPH
RETI
DELAY1:
MOV R0,#10H
L3:MOV R1,#500
L1:MOV R3,#500
L2:DJNZ R3,L2
DJNZ R1,L1
DJNZ R0,L3
AJMP J
DELAY2:
MOV R0,#10H
L6:MOV R1,#500
L4:MOV R3,#500
L5:DJNZ R3,L5
DJNZ R1,L4
DJNZ R0,L6
AJMP K
END
실험 8.2 간이 디지털 시계를 설계한다.디지털 시계의 스위치로 스위치를 선택하고 스위치를 닫으면 디지털 시계가 작동합니다.led8 –led13은 6자리 2진수로 디지털 시계의 초값을 나타낸다.led14 –led15는 2자리 2진수로 숫자시계의 분값을 나타낸다. 만약에 4분에 이르면 분값은 0에서 시작한다.이렇게 순환한다.
어셈블러:
ORG 0000H
AJMP START
ORG 000BH
AJMP IP0
ORG 0030H
START:
MOV P1,#00H
MOV TMOD,#01H
MOV TH0,#3CH
MOV TL0,#0B0H
SETB ET0
SETB EA
MOV R7,#14H
MOV R0,#0
MOV R1,#0
SETB TR0
SJMP $
IP0:
DJNZ R7,RET0
MOV R7,#14H
INC R0
CJNE R0,#3CH,F
MOV R0,#00H
INC R1
CJNE R1,#04H,F
MOV R1,#00H
F:
MOV A,R1
RR A
RR A
ADD A,R0
MOV P1,A
RET0:
MOV TH0,#3CH
MOV TL0,#0B0H
RETI
END
C 언어 프로그램:
#include
uchar a=0;
uchar miao=0;
uchar fen=0;
timer0()interrupt 1{
a++;
TH0=0x3c;
TL0=0xb0;
}
main(){
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
EA=1;
ET0=1;
TR0=1;
P1=0x00;
while(1){
if(a==20){
miao=P1&0x3f;
fen=P1&0xc0;
miao++;
if(miao>=60){
miao=0;
fen+=0x40;
}
P1=miao|fen;
}
}
}