단편기 실험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;
        }
    }
}

좋은 웹페이지 즐겨찾기