51单片机做只用一个点阵的一个电子沙漏显示沙漏效果的代码
时间: 2024-01-24 12:04:26 浏览: 151
基于51单片机的点阵显示
好的,以下是一个基于51单片机和一个点阵的电子沙漏显示沙漏效果的示例代码:
```c
#include <reg51.h>
// 定义数码管和时钟控制引脚
sbit Dig1 = P2^0;
sbit Dig2 = P2^1;
sbit Dig3 = P2^2;
sbit CLK = P2^3;
sbit DIO = P2^4;
void delay(unsigned int t)
{
unsigned int i;
while(t--)
{
for(i = 0; i < 120; i++);
}
}
void writeData(unsigned char dat)
{
unsigned char i;
CLK = 0;
for(i = 0; i < 8; i++)
{
DIO = dat & 0x01;
dat >>= 1;
CLK = 1;
CLK = 0;
}
}
void writeCmd(unsigned char cmd)
{
unsigned char i;
CLK = 0;
for(i = 0; i < 8; i++)
{
DIO = cmd & 0x01;
cmd >>= 1;
CLK = 1;
CLK = 0;
}
}
void init()
{
writeCmd(0x88); // 打开显示,设置亮度
writeCmd(0x40); // 设置地址模式为固定地址模式
writeCmd(0xC0); // 设置起始地址为0
}
void display(unsigned char num)
{
unsigned char i;
writeCmd(0x44); // 设置自动地址加1模式
for(i = 0; i < 8; i++)
{
if(num & 0x01)
{
writeData(0xFF);
}
else
{
writeData(0x00);
}
num >>= 1;
}
}
void main()
{
unsigned char cnt = 32; // 初始时间为32秒
unsigned char i, j;
init(); // 初始化点阵显示
while(1)
{
for(i = 0; i < 8; i++) // 逐行显示沙漏
{
for(j = 0; j <= i; j++)
{
display(1 << j); // 显示第i行的前j列
Dig1 = 1; Dig2 = 0; Dig3 = 0; delay(1); // 显示1ms
}
for(j = i; j >= 0; j--)
{
display(1 << j); // 显示第i行的前j列
Dig1 = 1; Dig2 = 0; Dig3 = 0; delay(1); // 显示1ms
}
}
cnt--; // 时间递减
if(cnt == 0) // 时间到了,重新开始
{
cnt = 32;
}
}
}
```
以上代码实现了一个32秒的电子沙漏,使用一个点阵显示沙漏效果,并且支持调整亮度。具体实现方法是:首先初始化点阵显示,然后在死循环中不断地逐行显示沙漏,每次显示1ms,直到时间递减为0,重新开始计时。每行的长度逐渐增加,从1列到8列,然后再逐渐减少,从8列到1列,形成一个沙漏效果。
阅读全文