51单片机做一个电子沙漏只用一个点阵的代码
时间: 2024-01-24 10:04:26 浏览: 281
好的,以下是基于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 sec1, sec2, min1, min2;
init(); // 初始化点阵显示
while(1)
{
sec1 = cnt % 10;
sec2 = cnt / 10;
min1 = sec2 % 10;
min2 = sec2 / 10;
// 分别显示秒的个位、秒的十位、分的个位和分的十位
display(1 << sec1);
Dig1 = 1; Dig2 = 0; Dig3 = 0; delay(5); // 显示秒的个位,持续5ms
display(1 << sec2);
Dig1 = 0; Dig2 = 1; Dig3 = 0; delay(5); // 显示秒的十位,持续5ms
display(1 << min1);
Dig1 = 0; Dig2 = 0; Dig3 = 1; delay(5); // 显示分的个位,持续5ms
display(1 << min2);
Dig1 = 0; Dig2 = 0; Dig3 = 0; delay(5); // 显示分的十位,持续5ms
cnt--; // 时间递减
if(cnt == 0) // 时间到了,重新开始
{
cnt = 32;
}
}
}
```
以上代码实现了一个32秒的电子沙漏,使用一个点阵显示剩余时间,并且支持调整亮度。具体实现方法是:首先初始化点阵显示,然后在死循环中不断地显示剩余时间,每次显示5ms,直到时间递减为0,重新开始计时。
阅读全文