高仿真数码管电子钟
基本要求:
采用 6只7段 BCD 码数码管器件 7SEG;
采用 PCF8583 时钟芯片:
能显示时间。
发挥部分:
采用键盘,实现 12h/24h 切换功能:
有时间调整功能。
PCF8583是 IIC通信,当引脚A0接GND,则I2C地址为0XA0。
设置时间的步骤:
(1)向 0x00 寄存器(控制地址) 写入 0x80 数据(停止运行始终、正常计数、32768、允许读出全部内容、闹钟全部关闭,详看芯片介绍中的寄存器介绍);
(2)
向0x02 寄存器写入BCD格式的秒,低位存放秒数的个位数值,范围为0~9;高位存放秒数的十位数值,范围为0~5 ;
向0x03 寄存器写入BCD格式的分;
向0x04 寄存器写入BCD格式的时;
向0x05 寄存器写入BCD格式的日、年;
向0x06 寄存器写入BCD格式的 星期/月;
(3)向 0x00 寄存器(控制地址) 写入 0x00 数据,开始走时
读取 0x02、0x03、0x04、0x05、0x06中的数值做转换即可。
PCF8583是飞利浦(Philips)公司生产的CMOS型实时时钟芯片,它带有240B的RAM,且具有I2C串行总线接口。只需要通过单片机并行I/O口的两条引脚模拟I2C总线的数据线SDA、时钟线SCL,就可以完成对PCF8583的参数设置、读取日期和时间数据等操作。PCF8583具有接口简单,占用单片机资源少等优点,因而被广泛应用在各类智能仪器仪表和电子工程项目中。
下载:dt3.8tupian.net/2/28880a15b9990.pg3
这段代码是一个嵌入式系统中的主程序(main函数),用于控制一个数字时钟的功能。
首先,代码定义了一些变量和寄存器的配置。然后进入一个无限循环,不断执行下面的操作:
每隔4毫秒执行一次中断服务函数。
通过计数器t_j实现每50次循环(即200毫秒)执行一次读取时间的操作。
在读取时间后,根据是否是24小时制来设置显示数组disp中的小时值。
通过按键的检测修改时间:按下P5IN寄存器的BIT1增加小时,按下BIT2减少小时,按下BIT3增加分钟,按下BIT4减少分钟,按下BIT5增加秒,按下BIT6减少秒,按下BIT7切换24小时制。
每次修改时间后,调用write_time函数将修改后的时间写入到相应的存储器中。
循环继续,重复以上步骤。
整个代码的功能是实现一个数字时钟,通过按键控制时钟的设置和调整,并将时间在数码管上进行显示。
cvoid main( void )
{
int t_j = 0;
char rchar;
WDTCTL = WDTPW + WDTHOLD; /* 关闭看门狗 */
write_time();
P1DIR = 0xFF;
P1OUT = 0x00; /* 数码管段选 */
P3DIR = 0xFF;
P3OUT = 0x00; /* 数码管位选 */
P5DIR &= 0X01;
P5REN |= 0XFE;
P5OUT |= 0XFE; /* 7个按键 */
P2DIR |= BIT1;
P2OUT |= BIT1; /* 小灯 */
CCTL0 = CCIE; /* CCR0 interrupt enabled */
CCR0 = 327 / 4; /* 4ms */
TACTL = TASSEL_1 + MC_1; /* ACLK, upmode */
__bis_SR_register( GIE );
while ( 1 )
{
delay_ms( 2 );
t_j++;
if ( t_j > 50 )
{
t_j = 0;
/* 读取时间 */
rchar = ReadByteEE( SECOND );
hour = (rchar >> 4) * 10 + (rchar & 0x0F);
rchar = ReadByteEE( MINUTE );
second = (rchar >> 4) * 10 + (rchar & 0x0F);
rchar = ReadByteEE( HOUR );
minute = (rchar >> 4) * 10 + (rchar & 0x0F);
/* 将时间装入数组 */
if ( flag24 == 1 )
{
disp[0] = hour % 100 / 10;
disp[1] = hour % 10;
}else{
if ( hour > 12 )
{
disp[0] = (hour - 12) % 100 / 10;
disp[1] = (hour - 12) % 10;
}else {
disp[0] = hour % 100 / 10;
disp[1] = hour % 10;
}
}
disp[2] = minute % 100 / 10;
disp[3] = minute % 10;
disp[4] = second % 100 / 10;
disp[5] = second % 10;
}
if ( (P5IN & BIT1) == 0 ) /* 增加小时 */
{
if ( flag24 == 1 )
{
hour++;
if ( hour > 23 )
hour = 0;
} else{
hour++;
if ( hour > 11 )
hour = 0;
}
write_time();
while ( (P5IN & BIT1) == 0 )
;
}else if ( (P5IN & BIT2) == 0 ) /* 减少小时 */
{
if ( flag24 == 1 ) {
if (hour > 0) {
hour--;
} else {
hour = 23;
}
}else {
if (hour > 0) {
hour--;
} else {
hour = 11;
}
}
write_time();
while ( (P5IN & BIT2) == 0 )
;
}else if ( (P5IN & BIT3) == 0 ) /* 增加分钟 */
{
minute++;
if ( minute > 59 )
minute = 0;
write_time();
while ( (P5IN & BIT3) == 0 )
;
}else if ( (P5IN & BIT4) == 0 ) /* 减少分钟 */
{
if ( minute > 0 )
{
minute--;
}else {
minute = 59;
}
write_time();
while ( (P5IN & BIT4) == 0 )
;
}else if ( (P5IN & BIT5) == 0 ) /* 增加秒 */
{
second++;
if ( second > 59 )
second = 0;
write_time();
while ( (P5IN & BIT5) == 0 )
;
}else if ( (P5IN & BIT6) == 0 ) /* 减少秒 */
{
if ( second > 0 )
{
second--;
}else {
second = 59;
}
write_time();
while ( (P5IN & BIT6) == 0 )
;
}else if ( (P5IN & BIT7) == 0 ) /* 切换24小时制 */
{
if ( flag24 == 1 )
{
flag24 = 0;
P2OUT &= ~BIT1;
} else{
flag24 = 1;
P2OUT |= BIT1;
}
while ( (P5IN & BIT7) == 0 )
;
}
}
}
csharphttps://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2
本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!