程序(跑马灯) :
#include <stdio.h>
#include <reg52.h>
sbit P10 = P1^0;
sbit P11 = P1^1;
sbit P12 = P1^2;
sbit P13 = P1^3;
sbit P14 = P1^4;
sbit P15 = P1^5;
sbit P16 = P1^6;
sbit P17 = P1^7;
void main( void )
{
unsigned int n;
while( 1 )
{
P10=0; P11=1; P12=1; P13=1;
for(n=40000; n>0; n--);
P10=1; P11=0; P12=1; P13=1;
for(n=40000; n>0; n--);
P10=1; P11=1; P12=0; P13=1;
for(n=40000; n>0; n--);
P10=1; P11=1; P12=1; P13=0;
for(n=40000; n>0; n--);
}
}
总结 :
1. main函数没有返回值, 也没有参数. 否则keil不仿真. 不知道为什么
2. build的时候需要先clear target. 然后再builder target.而且不能build all target. 否则直接进入RUN方式,并且还不能仿真。 奇哉怪也, 不知道为什么。 以后就这么干吧!
3. MS延迟都使用类似这样的代码来达到
unsigned int n;
for(n=40000; n>0; n--);
至于究竟延迟了多长时间, 先不理会! 精确延迟也暂时不考虑
作业:
例程中的跑马灯在同一时刻只显示1个灯,现在改为同时亮着2个灯的跑马灯。
#include <stdio.h>
#include <reg52.h>
sbit P10 = P1^0;
sbit P11 = P1^1;
sbit P12 = P1^2;
sbit P13 = P1^3;
sbit P14 = P1^4;
sbit P15 = P1^5;
sbit P16 = P1^6;
sbit P17 = P1^7;
void main( void )
{
unsigned int n;
while( 1 )
{
P10=0; P11=0; P12=1; P13=1;
for(n=40000; n>0; n--);
P10=1; P11=0; P12=0; P13=1;
for(n=40000; n>0; n--);
P10=1; P11=1; P12=0; P13=0;
for(n=40000; n>0; n--);
P10=0; P11=1; P12=1; P13=0;
for(n=40000; n>0; n--);
}
}
由于延时太短了, 都看不大清楚. 以上的延迟我改为了
for(n=40000; n>0; n--);
for(n=40000; n>0; n--);
for(n=40000; n>0; n--);
for(n=40000; n>0; n--);
for(n=40000; n>0; n--);
呵呵就能看能明白点了。(将一个延迟放大5倍)
通常延迟加长, 估计都是利用嵌套循环的吧! 不会像我为了省事COPY & PASTER. 如:
unsigned char i;
unsigned int n;
// 将延迟放大10倍
for(i=10; i>0; i--)
for(n=40000; n>0; n--)
;
那么, 作业就修改为 :
#include <stdio.h>
#include <reg52.h>
sbit P10 = P1^0;
sbit P11 = P1^1;
sbit P12 = P1^2;
sbit P13 = P1^3;
sbit P14 = P1^4;
sbit P15 = P1^5;
sbit P16 = P1^6;
sbit P17 = P1^7;
void main( void )
{
unsigned char i; // 尽量的用小数据类型, 如果够用的话.
unsigned int n;
while( 1 )
{
P10=0; P11=0; P12=1; P13=1;
for(i=5; i>0; i--)
for(n=40000; n>0; n--);
P10=1; P11=0; P12=0; P13=1;
for(i=5; i>0; i--)
for(n=40000; n>0; n--);
P10=1; P11=1; P12=0; P13=0;
for(i=5; i>0; i--)
for(n=40000; n>0; n--);
P10=0; P11=1; P12=1; P13=0;
for(i=5; i>0; i--)
for(n=40000; n>0; n--);
}
}