概述
学习任何单片机(开发板)第一步都是了解输入输出。一般是从输出开始,比如对单个位进行操作(点亮流水灯),对多个位进行操作(数码管,点阵等)。至于输入,最基础的便是键盘(按键)
IO的结构
- 初学的时候尽量不要使用P0口作为输入
- 如果使用到了P0口做输入,加上上拉电阻
51单片机内部IO口结构分析与学习
位定义
- 一般的来说,位定义就是对单个位进行定义
- 语法
sbit LED=P0^0//注意P要大写,标识符尽量使用大写
- 示例代码(用于普中51开发板)
宏定义
-
定义:宏定义可以使用一个标识符(通常是大写)来替代一个端口(如P2)或者一个常量
-
作用:增加程序易读性
-
语法
#define LED P2//LED就代表了8个IO口
位操作
- 定义:位操作就是对位进行的操作
- 作用:控制IO口的电平变化
- 说明:单片机的位操作很多都是逻辑运算相关
- 代码示例
int i ; for(i=0;i<8;i++){ LED = ~(0x01<<i) ;//移位运算符和取反运算符 delay(10000); } for(i=0;i<8;i++){ LED = ~(0x80>>i) ;//右移,共阳取反 delay(10000); } ```
_crol_函数和 _cror_函数
-
函数头文件
# include<intrins.h>
-
函数语法
P2=_crol\_(P2,1): 将P2口左移一位 P2=_cror\_(P2,1): 将P2口右移一位
-
普中开发板单片机P2口接的是led
蜂鸣器
1.普中派发版 蜂鸣器接在P1.5
2. 可以通过延时的控制来改变蜂鸣器的音调
数码管静态显示
- 程序中的lsa,lsb,lsc仅仅是用来显示位选,在静态显示里面并没有什么用处
- 可以直接使用IO口进行字形码的输出
动态数码管显示(没有使用595)
- 动态显示就是让所有的数码管同时点亮
- 程序使用的是一种扫描的思路,即先点第一个,再点第二个,由于扫描的速度很快,以至于根本察觉不到在闪烁。
- 注意消隐的使用
独立按键
- 接一个4.7k的上拉电阻,按键接到地
- P1 P2 P3 都是准双向IO口,可以输出高电平,P0必须接上拉电阻才能输出高电平,P2 P3 P4 接上拉电阻是为了增大IO口的驱动能力。
矩阵按键(扫描)
- 输出二进制码(列交换)
0x07//行
0x0b
0x0d
0x0e
- 示范程序(松开检测程序可以不写)
void KeyDown(void)
{
GPIO_KEY = 0x0f;
if(GPIO_KEY!=0x0f){
delay(1000);
if(GPIO_KEY!=0x0f){
switch(GPIO_KEY){
case 0x07:col=0;break;
case 0x0b:col=1;break;
case 0x0d:col=2;break;
case 0x0e:col=3;break;
}
GPIO_KEY=0xf0;
switch(GPIO_KEY){
case 0x70:row=0;break;
case 0xb0:row=1;break;
case 0xd0:row=2;break;
case 0xe0:row=3;break;
}
}
}
}