LED、继电器、蜂鸣器、数码管等基础外设
蓝桥杯单片机赛题指定用板上LED、继电器、蜂鸣器、数码管均受M74HC573M1R锁存器控制,信号端与P0端口相连,锁存器控制端为LE,与YxC引脚相连,而YxC引脚又与或非门器件74H02相连,直接受Yx引脚的控制,Yx引脚的电平受三八译码器74HC138的控制,从而使这些器件受P25、P26、P27三个引脚的控制。
开发板原理图↓↓
因此控制这些器件就需要搭配使用P0端口和P25、P26、P27三个引脚。
utils.c
#include "utils.h"
//编码表可以从STC-ISP-范例程序-STC开发板(实验箱4)演示程序-HC595驱动8个数码管-C中获取
u8 code t_display[]={ //标准字库
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black - H J K L N o P U t G Q r M y
0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46}; //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
u8 code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //位码
//以下控制函数基本相同,可以直接复制修改
u8 bdata con;
sbit b = con^6;
sbit r = con^4;
void buzzer(u8 i)
{
b = i;
P0 = con;
P2 = 0xa0;_nop_(); P2 = 0;
}
void relay(u8 i)
{
r = i;
P0 = con;
P2 = 0xa0;_nop_(); P2 = 0;
}
void LED(u8 i)
{
P0 = ~i;
P2 = 0x80;_nop_();P2 = 0;
}
void SMG_W(u8 i)
{
P0 = i;
P2 = 0xc0;_nop_();P2 = 0;
}
void SMG_D(u8 i)
{
P0 = ~i;
P2 = 0xe0;_nop_();P2 = 0;
}
utils.h
#ifndef __UTILS_H
#define __UTILS_H
#include <STC15F2K60S2.H>
#include "intrins.h"
#include "absacc.h"
typedef unsigned char u8;
typedef unsigned int u16;
void buzzer(u8 i);
void relay(u8 i);
void LED(u8 i);
void SMG_W(u8 i);
void SMG_D(u8 i);
#endif
main.c
#include "utils.h"
extern u8 code t_display[];
extern u8 code T_COM[];
void main()
{
LED(0);
buzzer(0);
relay(0);
SMG_D(t_display[0]);
SMG_W(T_COM[0]);
}