C语言按键蜂鸣器响灯亮,AT89C52单核A2单片机按下独立按键蜂鸣器响流水灯左移松开按键蜂鸣器不响流水灯右移...

ADRLED        EQU        8700H                ;LED工作地址

ORG         0000H

LJMP         MAIN

ORG        1BH

JMP        T1INT                ;定时器1中断入口地址

ORG         0100H

MAIN:        MOV         SP,#60H

MOV        R0,#0AH                ;R0为0.1秒的次数

ANL        TMOD,#0FH        ;定时器1置为方式1

ORL        TMOD,#10H

MOV        TL1,#0B0H        ;置定时器1的中断时间为0.1S

MOV        TH1,#3CH

ORL        IE,#88H                ;允许定时器1中断

MOV        R2,#0                ;置R2初值,R2对应显示字符的字形码相对地址

MOV        R5,#16                ;置显示的字符数初值

SETB        P3.4                ;使蜂鸣器的负端为高不鸣叫

CLR        P3.5                ;使数码管的共阴极为低电平

NEXT:        MOV        DPTR,#TAB        ;置字形码表首地址

MOV        A,R2

MOVC        A,@A+DPTR        ;取出相应的字形码

MOV         DPTR,#ADRLED        ;数码管段码地址

MOVX         @DPTR,A                ;送数码管段码(字形码)

SETB        TR1                ;启动定时器1

LOOP:        CJNE        R0,#00H,LOOP        ;不够1秒,转LOOP

INC        R2

MOV        R0,#0AH                ;重置R0为10

DJNZ        R5,NEXT                ;16个字符没有显示1遍,转NEXT显示下一字符

CLR        P3.4                ;使蜂鸣器的负端为低其鸣叫

MOV        A,#0FFH                ;报警之后数码管显示全亮

MOV         DPTR,#ADRLED        ;数码管段码地址

MOVX         @DPTR,A                ;送数码管段码(字形码)

CLR        TR1                ;定时器停止计数

SJMP        $                ;死循环

T1INT:        CLR        TR1                ;定时器1中断,首先停止计数

DEC        R0                ;次数减1

MOV        TL1,#0B0H        ;重置定时器1时间常数

MOV        TH1,#3CH

SETB        TR1                ;恢复定时器1计数

RETI

TAB:        DB        3FH,06H,5BH,4FH,66H,6DH,7DH,07H                ;字形码表

DB        7FH,6FH,77H,7CH,58H,5EH,79H,71H

END

你可能感兴趣的:(C语言按键蜂鸣器响灯亮)