1.LED流水灯
思路:写一个时延函数对LED灯的闪烁时间进行控制,通过P2口控制每盏灯循环亮起
#include <STC89C5xRC.H>
#include <INTRINS.H>
void Delay_ms(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while(xms){
i = 2;
j = 239;
do
{
while (--j);
}
while (--i);
xms--;
}
}
void main()
{
while(1){
P2=0xFE;
Delay_ms(100);// 1111 1110
P2=0xFD;
Delay_ms(100);// 1111 1101
P2=0xFB;
Delay_ms(500);// 1111 1011
P2=0xF7;
Delay_ms(500);// 1111 0111
P2=0xEF;
Delay_ms(500);// 1110 1111
P2=0xDF;
Delay_ms(500);// 1101 1111
P2=0xBF;
Delay_ms(100);// 1011 1111
P2=0x7E;
Delay_ms(100);// 0111 1111
}
}
2.独立按键控制LED二进制递增
思路:通过自带生成时延函数对独立按键进行软件消抖,使用一个额外的变量递增模拟二进制递增,最后按位取反得到最终的结果
#include <at89c51RC2.h>
#include <INTRINS.H>
void Delay_ms(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while(xms){
i = 2;
j = 239;
do
{
while (--j);
}
while (--i);
xms--;
}
}
void main(){
//通过按键控制实现一个二进制的递增
unsigned char LEDNum=0;
while(1){
//消抖
if(P3_1==0){
Delay_ms(20);
while(P3_1==0);
Delay_ms(20);
//通过额外的变量递增来实现多个灯的点亮
LEDNum++;
P2=~LEDNum;
}
}
}
3.独立按键控制LED左右移动
思路:巧妙利用位运算符的左右移动取反,实现当独立按键按下时灯光依次向左右移动,比如0000 0001 左移一位 0000 0010 取反使第2个LED灯闪亮
#include <REGX52.H>
//要对main方法之后的方法进行声明
void Delay_ms(unsigned int xms);
unsigned char LEDNum=0;
void main(){
P2=~0x01;
while(1){
if(P3_1==0){
Delay_ms(20);
while(P3_1==0);
Delay_ms(20);
LEDNum++;
// 超出位数进行重置
if(LEDNum>=8){
LEDNum=0;
}
//通过位运算符左移实现每个led闪亮
P2=~(0x01<<LEDNum);
}
if(P3_0==0){
Delay_ms(20);
while(P3_0==0);
Delay_ms(20);
if(LEDNum==0){
LEDNum=7;
}
else{
LEDNum--;
}
//通过位运算符左移实现每个led闪亮
P2=~(0x01<<LEDNum);
}
}
}
void Delay_ms(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while(xms){
i = 2;
j = 239;
do
{
while (--j);
}
while (--i);
xms--;
}
}
4.模块化动态数码管显示
思路:首先使用switch语句对数码管进行位选,选出8个位置其中一个,然后自定义一个各种数字的段选数组,最后别忘记清零
模块化思想,对代码进行模块化,将主函数和其他函数拆分成.c和.h文件,分块进行管理
#include <REGX52.H>
#include "Delay.h"
#include "Nixie.h"
void main(){
while(1){
Nixie(3,2);
Nixie(4,0);
Nixie(5,2);
Nixie(6,3);
}
void Delay_ms(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while(xms){
i = 2;
j = 239;
do
{
while (--j);
}
while (--i);
xms--;
}
}
#include <REGX52.H>
#include "Delay.h"
//0011 1110
unsigned char NixieTable[]={
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F
};
//位选
void Nixie(unsigned char Location,Number){
switch(Location){
case 1: P2_4=1;P2_3=1;P2_2=1;break;
case 2: P2_4=1;P2_3=1;P2_2=0;break;
case 3: P2_4=1;P2_3=0;P2_2=1;break;
case 4: P2_4=1;P2_3=0;P2_2=0;break;
case 5: P2_4=0;P2_3=1;P2_2=1;break;
case 6: P2_4=0;P2_3=1;P2_2=0;break;
case 7: P2_4=0;P2_3=0;P2_2=1;break;
case 8: P2_4=0;P2_3=0;P2_2=0;break;
}
//段选
P0=NixieTable[Number];
Delay_ms(1);
//清零
P0=0x00;
}
#ifndef __DELAY_H__
#define __DELAY_H__
void Delay_ms(unsigned int xms);
#endif
#ifndef __NIXIE_H__
#define __NIXIE_H__
void Nixie(unsigned char Location,Number);
#endif