流水燈C語言源程序
文件說明:流水燈C程序
程序說明:MCU采用AT89S51,外接11.0592M晶振,P2口輸出
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
void delay(uint); //聲明延時函數
void main(void)
{
uint i;
uchar temp;
while(1)
{
temp=0x01;
for(i=0;i<8;i++) //8個流水燈逐個閃動
{
P2=~temp;
delay(100); //調用延時函數
temp<<=1;
}
temp=0x80;
for(i=0;i<8;i++) //8個流水燈反向逐個閃動
{
P2=~temp;
delay(100); //調用延時函數
temp>>=1;
}
temp=0xFE;
for(i=0;i<8;i++) //8個流水燈依次全部點亮
{
P2=temp;
delay(100); //調用延時函數
temp<<=1;
}
temp=0x7F;
for(i=0;i<8;i++) //8個流水燈依次反向全部點亮
{
P2=temp;
delay(100); //調用延時函數
temp>>=1;
}
}
}
void delay(uint t) //定義延時函數
{
register uint bt;
for(;t;t--)
for(bt=0;bt<255;bt++);
}
二、匯編程序:(同樣P2為輸出端口)
u 左移依次循環:
ORG 0000H
SJMP MAIN
ORG 0030H 主程序開始的地址
MAIN: MOV R2,#08H 設置循環次數
MOV A,#0FEH 賦初值
NEXT: MOV P2,A 把初值送到P2口
LCALL DELAY 延時
RL A 左移一位
DJNZ R2,NEXT 判斷循環次數是否到,沒有跳轉到NEXT繼續執行
SJMP MAIN 重復循環
DELAY: MOV R3,#0FFH 延時程序
DEL2: MOV R4,#0FFH
DEL1: NOP
DJNZ R4,DEL1
DJNZ R3,DEL2
RET
END 結束
u 二邊散開後縮進(查表指令)
ORG 0000H
SJMP MAIN
ORG 0030H
MAIN: MOV SP,#60H
MOV DPTR,#TAB 把表首地址送到DPTR
MOV R2,#06 設置循環次數
LOOP: CLR A 清零A
MOVC A,@A+DPTR 查表指令
MOV P1,A 把A中的值送到P1口
LCALL DELAY 延時
INC DPTR 改變數據指針
DJNZ R2,LOOP 判斷循環是否到,沒有跳轉LOOP
SJMP MAIN 重復循環
DELAY: MOV R0.#10 延時
DEL2: MOV R1,#200
DEL1: MOV R3,#255
DJNZ R3,$
DJNZ R1,DEL1
DJNZ R0,DEL2
RET
TAB: DB 0E7H,0DBH,0BDH,7EH,0BDH,0DBH 查表
END