刚学C语言,写了一个追逐式流水灯;自我感觉太繁琐,请高手指点一下,有没有更简单的。
HI-TECH C Compiler for PIC10/12/16 MCUs (Lite Mode) V9.80编译通过
#include<pic.h>
#define uchar unsigned char
#define uint unsigned int
//函数申明
void delay1(uint x);
//=======================================//=============
void main() //主程序
{
uchar x,y,z; //定义变量
x=7;
TRISC=0X00; //C口定义为输出
PORTC=0Xfe; //点亮RCO口LED,为共阳
while(1)
{
PORTC&=0Xfe;
delay1(200);
if(x==0)
{
PORTC=0Xfe;
x=7;
}
if(x==1)
{
for(z=x;z>0;z--)
{
PORTC=PORTC<<1; //显示左移一位
PORTC&=0X03;
PORTC|=0X01;
delay1(200);
}
x--;
}
if(x==2)
{
for(z=x;z>0;z--)
{
PORTC=PORTC<<1; //显示左移一位
PORTC&=0X07;
PORTC|=0X01;
delay1(200);
}
x--;
}
if(x==3)
{
for(z=x;z>0;z--)
{
PORTC=PORTC<<1; //显示左移一位
PORTC&=0X0f;
PORTC|=0X01;
delay1(200);
}
x--;
}
if(x==4)
{
for(z=x;z>0;z--)
{
PORTC=PORTC<<1;
PORTC|=0X01;
PORTC&=0X1f;
delay1(200);
}
x--;
}
if(x==5)
{
for(z=x;z>0;z--)
{
PORTC=PORTC<<1; //显示左移一位
PORTC&=0X3f;
PORTC|=0X01;
delay1(200);
}
x--;
}
if(x==6)
{
for(z=x;z>0;z--)
{
PORTC=PORTC<<1; //显示左移一位
PORTC&=0X7f;
PORTC|=0X01;
delay1(200);
}
x--;
}
if(x==7)
{
for(z=x;z>0;z--)
{
PORTC=PORTC<<1; //显示左移一位
PORTC|=0X01;
delay1(200);
}
x--;
}
}
}
//=======================================//=============
//延时程序
void delay1(uint x) //延时时间为(X)ms
{
uint a,b;
for(a=x;a>0;a--)
for(b=75;b>0;b--); //延时数较准确固定多26us
}
//======================================================================
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
-----------------------------------------------------------------------
用2个定时器,可以以不同的速率在不同方向上“投影”2盏灯跑动,周期性地修改定时器时长,还能得到变速的效果。
ps:其实这样的编程要求可以作为初学pic时的作业,在常见的开发板上让学生自己写。比如用AD的电位器调节某个led的速度之类附加要求加进去,学生从网络搜例程就无效了,必须自己写。
#include <htc.h>
#define uint8 unsigned char
#define uint16 unsigned int
__CONFIG(WDTDIS & LVPDIS & HS & PWRTDIS & BORDIS);//设置配置位
//WDTDIS:disable watchdog timer
//LVPDIS:low voltage programming disabled
//HS:high speed crystal/resonator
//PWRTDIS:disable power up timer
//BORDIS:disable brown out reset
/*******************************************************************************
* 函 数 名: DelayMS(uint16 delay)
* 函数功能: 毫秒延时 for20MHZ
* 入口参数: delay
* 返 回: 无
*******************************************************************************/
void DelayMS(uint16 delay)
{
uint16 i;
for(;delay>0;delay--)
for(i=0;i<453;i++);
}
/*******************************************************************************
* 函 数 名: main()
* 函数功能: 跑马灯
*******************************************************************************/
void main()
{
uint8 i;
TRISE &= 0xEF; //配置PORTD为普通IO口
TRISD = 0x00; //设置PORTD为输出
while(1)
{
for(i=0;i<8;i++) //依次从下往上单个点亮
{
PORTD = ~(0x01 << i);
DelayMS(100);
}
for(i=0;i<8;i++) //依次从上往下单个点亮
{
PORTD = ~(0x80 >> i);
DelayMS(100);
}
for(i=0;i<8;i++) //依次从下往上逐个点亮
{
PORTD &= ~(0x01 << i);
DelayMS(100);
}
for(i=0;i<8;i++) //依次从上往下逐个点亮
{
PORTD |= 0x80 >> i;
DelayMS(100);
}
for(i=0;i<4;i++) //两边往里
{
PORTD &= ~((0x01<<i) |(0x80>>i));
DelayMS(200);
}
for(i=0;i<4;i++) //两边往外
{
PORTD |= (0x10<<i) |(0x08>>i);
DelayMS(200);
}
}
}
一周热门 更多>