一、示例题目:
在CT107D单片机综合训练平台上,通过I/O模式编写代码,实现以下功能:
- 系统上电后,初始状态为关闭蜂鸣器、继电器、全部指示灯和数码管,然后进入循环,实现灯光闪烁和数码管计数。
- 数码管显示:最右边两位显示L8指示灯的闪烁次数,最左边一位显示L1和L2指示灯同时翻转的次数。
- 循环功能:L8指示灯循环闪烁,每次闪烁时数码管最右边两位加1,范围为00到99,超过99后恢复为00;同时,每次L8闪烁时,L1和L2指示灯状态翻转,数码管最左边一位加1,范围为0到9,超过9后恢复为0。
- 确保在灯光闪烁和数码管计数过程中,精确控制138译码器和573锁存器,使两者协同工作,避免设备冲突、显示异常或刷新中断等问题。
主要思路就是在闪烁延时中加入数码管显示
二、示例代码
#include "stc15.h"void hc573(unsigned char channel, unsigned char dat)
{P2 = (P2 & 0x1f) | 0x00;P0 = dat;switch(channel){case 4:P2 = (P2 & 0x1f) | 0x80;break;case 5:P2 = (P2 & 0x1f) | 0xa0;break;case 6:P2 = (P2 & 0x1f) | 0xc0;break;case 7:P2 = (P2 & 0x1f) | 0xe0;break;}
}void delay_smg(unsigned int t)
{while(t--);
}#define TSMG 500
unsigned char num1 = 0;
unsigned char num2 = 0;code unsigned char Seg_Table[] =
{0xc0, //00xf9, //10xa4, //20xb0, //30x99, //40x92, //50x82, //60xf8, //70x80, //80x90, //90x88, //A0x83, //b0xc6, //C0xa1, //d0x86, //E0x8e //F
};void smg_all(unsigned char dat)
{hc573(6, 0xff);hc573(7, dat);
}void smg_bit(unsigned char pos, unsigned char dat)
{hc573(6, 0x01 << pos);hc573(7, dat);delay_smg(TSMG);hc573(6, 0x01 << pos);hc573(7, 0xff);
}void smg_display()
{smg_bit(0, Seg_Table[num1]);smg_bit(6, Seg_Table[num2 / 10]);smg_bit(7, Seg_Table[num2 % 10]);
}void delay_led(unsigned int t)
{while(t--){smg_display();}
}unsigned char stat_led = 0xff;void led_display()
{stat_led = stat_led & 0x7f;hc573(4,stat_led); //L8亮delay_led(200);stat_led = stat_led | ~0x7f;hc573(4,stat_led); //L8灭delay_led(200);num2++;if(num2 >= 100){num2 = 0;}if((stat_led & 0x03) == 0x03){stat_led = stat_led & ~0x03; //L1 L2亮}else{stat_led = stat_led | 0x03; //L1 L2灭}hc573(4,stat_led);num1++;if(num1 >= 10){num1 = 0;}
}void init_sys()
{hc573(5,0x00);hc573(4,0xff);smg_all(0xff);
}void main()
{init_sys();while(1){led_display();smg_display();}
}
-
hc573
函数:- 该函数用于控制 573 锁存器,根据传入的通道号和数据,设置相应的输出信号。
- 通过设置 P2 和 P0 寄存器的值,控制数据输出到指定的通道。
-
delay_smg
函数:- 这个函数用于实现延时,通过循环等待的方式进行时间延迟。
-
smg_all
、smg_bit
和smg_display
函数:smg_all
函数用于控制数码管显示全部位。smg_bit
函数用于控制数码管显示指定位和数据。smg_display
函数用于整体数码管显示控制。
-
delay_led
函数:- 这个函数用于实现 LED 灯的延时显示,同时调用
smg_display
函数控制数码管显示。
- 这个函数用于实现 LED 灯的延时显示,同时调用
-
led_display
函数:- 该函数实现了 LED 灯的闪烁和计数逻辑,根据计数值控制 LED 灯的状态和数码管显示。
- 在每次循环中,更新 LED 灯状态和计数值,并控制数码管显示。
-
init_sys
函数:- 初始化系统,设置初始的 573 锁存器和数码管显示状态。
-
main
函数:- 主函数中首先调用
init_sys
进行系统初始化。 - 进入一个无限循环,循环调用
led_display
和smg_display
函数,实现 LED 灯的闪烁和数码管的计数显示。
- 主函数中首先调用