51单片机 - 基本的输入输出
1、引言
- 之前学习51单片机的时间很短,感觉很不扎实,就想在闲的时候回顾一下51单片机。说到单片机,最简单的就是输出引脚电平,还有获取引脚当前状态了(read和write)。
2、引脚输出
- 一说到单片机的引脚输出,大家可能都会想到点灯,然后就有了这样的代码。
P0 = 0x00;
while(1) {
delay(100);
P0 = ~P0;
}
- 简单来说就是把P0一组引脚变为低电平,然后一段延时之后反转电平。
- 会控制一组引脚之后,就会想要控制单独的引脚实现流水灯(流水灯超酷的好吧),然后就会写出下面这段代码。
P0 = ~(0x01);
while(1) {
P0 = _crol_(P0, 1);
delay(1);
}
- 嗯?为什么不用sbit?这东西我用的不熟,而且和各种c语法不兼容,所以就不用了。
3、引脚输入
4、思考
- 引脚的操作相同的话,就可以把行为抽象出来,写一组通用的引脚输入和输出的函数,把位操作封装起来(说实话每次写位操作都很难受)。
- 先写输出的函数,输出的函数就是让某个引脚输出某个电平就行,其它的功能暂时不需要。
uint8_t GPIO_WritePin(uint8_t GPIO_PORT, uint8_t GPIO_PIN, uint8_t GPIO_PIN_STATE)
{
if (GPIO_PIN_STATE == GPIO_PIN_SET)
{
if (GPIO_PORT == GPIO_PORT_0)
{
P0 |= GPIO_PIN;
}
else if (GPIO_PORT == GPIO_PORT_1)
{
P1 |= GPIO_PIN;
}
else if (GPIO_PORT == GPIO_PORT_2)
{
P2 |= GPIO_PIN;
}
else if (GPIO_PORT == GPIO_PORT_3)
{
P3 |= GPIO_PIN;
}
}
else if (GPIO_PIN_STATE == GPIO_PIN_RESET)
{
if (GPIO_PORT == GPIO_PORT_0)
{
P0 &= ~GPIO_PIN;
}
else if (GPIO_PORT == GPIO_PORT_1)
{
P1 &= ~GPIO_PIN;
}
else if (GPIO_PORT == GPIO_PORT_2)
{
P2 &= ~GPIO_PIN;
}
else if (GPIO_PORT == GPIO_PORT_3)
{
P3 &= ~GPIO_PIN;
}
return NO_ERROR;
}
- 读取引脚的函数和上面写的差不多,就是多了个引脚的判断
uint8_t GPIO_ReadPin(uint8_t GPIO_PORT, uint8_t GPIO_PIN)
{
if (GPIO_PORT == GPIO_PORT_0)
{
if(P0 & GPIO_PIN == 0)
{
return GPIO_PIN_RESET;
}
else
{
return GPIO_PIN_SET;
}
}
else if (GPIO_PORT == GPIO_PORT_1)
{
if(P1 & GPIO_PIN == 0)
{
return GPIO_PIN_RESET;
}
else
{
return GPIO_PIN_SET;
}
}
else if (GPIO_PORT == GPIO_PORT_2)
{
if(P2 & GPIO_PIN == 0)
{
return GPIO_PIN_RESET;
}
else
{
return GPIO_PIN_SET;
}
}
else if (GPIO_PORT == GPIO_PORT_3)
{
if(P3 & GPIO_PIN == 0)
{
return GPIO_PIN_RESET;
}
else
{
return GPIO_PIN_SET;
}
}
}
5、结语
51本身的操作不难,主要是外设的使用比较困难,比如按键,138译码芯片,锁存什么的操作比较繁琐。
|