单片机控制数码管显示时间代码 - STC89C52 & ATmega16
单片机控制数码管显示时间代码
本文提供两种单片机控制数码管显示时间的代码,分别基于STC89C52和ATmega16,并附带详细注释,帮助您快速掌握单片机控制数码管显示时间的技巧。
STC89C52单片机控制数码管显示时间代码:
#include <reg52.h>
sbit DIO = P1^0; //定义P1.0口为数据线
sbit CLK = P1^1; //定义P1.1口为时钟线
unsigned char code num[] = { //共阴数码管0~9的编码
0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F
};
void delay(unsigned int t) //延时函数
{
unsigned int i, j;
for(i=0; i<t; i++)
for(j=0; j<120; j++);
}
void sendByte(unsigned char dat) //发送一个字节到数码管
{
unsigned char i;
for(i=0; i<8; i++)
{
DIO = dat & 0x01;
CLK = 1;
CLK = 0;
dat >>= 1;
}
}
void main()
{
unsigned char hour, minute, second;
while(1)
{
for(hour=0; hour<24; hour++)
{
for(minute=0; minute<60; minute++)
{
for(second=0; second<60; second++)
{
sendByte(num[hour/10]); //发送十位时
sendByte(0x01); //选择第一个数码管
delay(5);
sendByte(num[hour%10]); //发送个位时
sendByte(0x02); //选择第二个数码管
delay(5);
sendByte(num[minute/10]); //发送十位分
sendByte(0x04); //选择第三个数码管
delay(5);
sendByte(num[minute%10]); //发送个位分
sendByte(0x08); //选择第四个数码管
delay(5);
sendByte(num[second/10]); //发送十位秒
sendByte(0x10); //选择第五个数码管
delay(5);
sendByte(num[second%10]); //发送个位秒
sendByte(0x20); //选择第六个数码管
delay(5);
}
}
}
}
}
ATmega16单片机控制数码管显示时间代码:
#include <avr/io.h>
#include <util/delay.h>
#define DIO PB0 //数据线
#define CLK PB1 //时钟线
unsigned char num[] = { //共阴数码管0~9的编码
0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F
};
void sendByte(unsigned char dat) //发送一个字节到数码管
{
unsigned char i;
for(i=0; i<8; i++)
{
if(dat & 0x01)
PORTB |= (1<<DIO);
else
PORTB &= ~(1<<DIO);
PORTB |= (1<<CLK);
PORTB &= ~(1<<CLK);
dat >>= 1;
}
}
void main()
{
unsigned char hour, minute, second;
DDRB = 0x03; //PB0和PB1输出
while(1)
{
for(hour=0; hour<24; hour++)
{
for(minute=0; minute<60; minute++)
{
for(second=0; second<60; second++)
{
sendByte(num[hour/10]); //发送十位时
PORTB |= (1<<2); //选择第一个数码管
_delay_ms(5);
sendByte(num[hour%10]); //发送个位时
PORTB &= ~(1<<2); //选择第二个数码管
_delay_ms(5);
sendByte(num[minute/10]); //发送十位分
PORTB |= (1<<3); //选择第三个数码管
_delay_ms(5);
sendByte(num[minute%10]); //发送个位分
PORTB &= ~(1<<3); //选择第四个数码管
_delay_ms(5);
sendByte(num[second/10]); //发送十位秒
PORTB |= (1<<4); //选择第五个数码管
_delay_ms(5);
sendByte(num[second%10]); //发送个位秒
PORTB &= ~(1<<4); //选择第六个数码管
_delay_ms(5);
}
}
}
}
}
原文地址: https://www.cveoy.top/t/topic/l3aM 著作权归作者所有。请勿转载和采集!