C51的lcd流水灯与8X8点阵
最近入手了一块普中的51开发板,就从最简单的点灯开始学习吧(加油)
原理图如下(此图出自普中C51) 这里我们是通过操作P2端口来控制led
1.点亮第一个led灯
#include"reg51.h"
sbit led = P2^0; //定义led引脚
int main()
{
led = 0; //将电平拉低点亮led灯
}
2.实现led闪烁隔一秒亮
#include "reg51.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit led = P2^0;
//延时tms
void delay (u16 t)
{
u8 i,j;
for( i = 0 ;i < t ;i ++)
{
for( j = 0 ;j < 110 ; j++);
}
}
void main()
{
while(1)
{
led=0;
delay(1000); //1s
led=1;
delay(1000);
}
}
3.led流水灯(方式一静态处理)
#include "reg51.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit led1 = P2^0;
sbit led2 = P2^1;
sbit led3 = P2^2;
sbit led4 = P2^3;
sbit led5 = P2^4;
void delay (u16 t)
{
u8 i,j;
for( i = 0 ;i < t ;i ++)
{
for( j = 0 ;j < 110 ; j++);
}
}
void main()
{
while(1)
{
led1=0;
delay(1000);
led1=1;
delay(1000);
led2=0;
delay(1000);
led2=1;
delay(1000);
led3=0;
delay(1000);
led3=1;
delay(1000);
led4=0;
delay(1000);
led4=1;
delay(1000);
}
}
4.利用C库函数实现led流水灯
#include "reg51.h"
#include"intrins.h" //移位所需的头文件
typedef unsigned int u16;
typedef unsigned char u8;
sbit led P2; //用来给P2端口赋值直接操作P2口
void delay (u16 t)
{
u8 i,j;
for( i = 0 ;i < t ;i ++)
{
for( j = 0 ;j < 110 ; j++);
}
}
void main()
{
u16 i;
led=0xfe ; //1111 1110 1111 1101 ...
delay(2000);
while(1)
{
for(i=0;i<7;i++)
{
led=_crol_(led,1); //左移一位
delay(2000);
}
for(i=0;i<7;i++)
{
led=_cror_(led,1); //右移 0111 1111
delay(2000);
}
}
}
上面学会流水灯的实现,我们在来学习8X8led点阵灯的实现吧
5.8X8led点阵实现
#include "reg51.h"
#include "intrins.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit SRCLK=P3^6;
sbit RCLK=P3^5;
sbit SER=P3^6;
void Hc595SendByte(u8 dat)
{
u8 i;
SRCLK=0;
RCLK=0;
for(i=0;i<8;i++)
{
SER=dat>>7; //右移到最高位
dat<<=1;//左移一位
SRCLK=1;
_nop_(); //延时
_nop_();
SRCLK=0; //低电平到高电平 上升沿
}
RCLK=1;
_nop_();
_nop_();
RCLK=0;
}
u8 ledduan[]={0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00}; //led点阵段
u8 ledwei[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//led点阵位
void delay(u16 i)
{
while(i--);
}
void main()
{
//Hc595SendByte(0x80);
//P0=0x7f; //0111 1111
//while(1);//µãÁÁµÚÒ»¸öled
u8 i;
while(1)
{
for(i=0;i<8;i++)
{
P0=0x7f;
P0=ledwei[i];
Hc595SendByte(ledduan[i]);
delay(100);
Hc595SendByte(0x00);//消影
}
}
}
以上就完成对led灯的基本操作,冲冲冲。