【单片机】滑稽AT89C52表情实现
零、原因
在群里看到了这样一个表情:
这是用51做的,刚好开发板上有8个小灯,想实现一下。
一、代码
新建工程,写入如下代码:
#include<reg52.h>
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
void delay400ms(void) //误差 0us
{
unsigned char a,b,c;
for(c=19;c>0;c--)
for(b=20;b>0;b--)
for(a=130;a>0;a--);
}
void main()
{
unsigned char cnt = 0,n,i;
ADDR0 = 0;
ADDR1 = 1;
ADDR2 = 1;
ADDR3 = 1;
ENLED = 0;
while(1)
{
switch(cnt)
{
case 0:
{/*第一部分,灯从左至右依次点亮*/
n = 0xFF;
while(1)
{
P0 = n;
delay400ms();
if(n == 0x00)break;
n = n>>1;
}
cnt++;
}
case 1:
{/*第二部分,灯从右至左依次熄灭*/
n = 0xFF;
while(1)
{
P0 = ~n;
delay400ms();
if(n == 0x00)break;
n = n<<1;
}
cnt++;
}
case 2:
{/*第三部分,灯从左至右依次点亮且熄灭上一个*/
n = 0x80;
while(1)
{
P0 = ~n;
delay400ms();
if(n == 0x01)break;
n = n>>1;
}
cnt++;
}
case 3:
{/*第四部分,灯从右至左依次点亮且熄灭上一个*/
n = 0x01;
while(1)
{
P0 = ~n;
delay400ms();
if(n == 0x80)break;
n = n<<1;
}
cnt++;
}
case 4:
{/*第五部分,灯同时点亮后又同时熄灭10次*/
n = 0x00;
for(i = 0; i<20 ;i++)
{
P0 = ~n;
delay400ms();
n = ~n;
}
cnt++;
}
case 5:
{/*第六部分,前后四个灯为一组两组灯交替点亮8次*/
n = 0xF0;
for(i = 0; i<16 ;i++)
{
P0 = n;
delay400ms();
n = ~n;
}
cnt++;
}
case 6:
{/*第七部分,第3,7,1,4,6个灯依次点亮且熄灭上一个灯3次*/
for(i = 0; i<3 ;i++)
{
n = 0x20;
P0 = ~n;
delay400ms();
P0 = 0xFF;
delay400ms();
n = 0x02;
P0 = ~n;
delay400ms();
P0 = 0xFF;
delay400ms();
n = 0x80;
P0 = ~n;
delay400ms();
P0 = 0xFF;
delay400ms();
n = 0x10;
P0 = ~n;
delay400ms();
P0 = 0xFF;
delay400ms();
n = 0x04;
P0 = ~n;
delay400ms();
P0 = 0xFF;
delay400ms();
}
cnt++;
}
/*大家还可以再加更多组合,记得cnt++*/
default : cnt = 0;break;
/*组合结束,重新开始*/
}
}
}
保存,下载到单片机里:
成功实现效果~
二、总结
兴趣很重要,单片机很好玩,哈哈