目录
本专栏所有引脚及端口 代码及注解 选择的是 BST-V51 单片机
需结合具体的单片机原理图进行分析
接下来的本专栏都选择该单片机及其原理图分析来进行操作
2.0 延时函数制作单灯闪烁
#include <STC89C5xRC.H>
#include <DELAYMS.H>
void main(){
P10 = 0;
//P1 = 0xfe; //1111 1110
while(1){
delay_ms(500);
P10 = ~P10;
}
}
对延时函数进行封装
DELAYMS.H
#ifndef _DELAYMS_H_
#define _DELAYMS_H_
#include <INTRINS.H>
// xms 代表需要延时的毫秒数
void delay_ms(unsigned int xms) //@11.0592MHz
{
unsigned char i, j;
while(xms--){
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
//每执行一次 1ms
}
}
#endif
2.1 独立按键控制 LED 亮灭
按键 K1-K4 对应 P34-P37 号引脚
另一端接地 为 0
#include <STC89C5xRC.H>
int main(){
//P10 = 0;
while(1){
if(P34 == 0){
P10 = 0;
}else{
P10 = 1;
}
}
}
2.2 独立按键控制 LED 状态
消除按键抖动
delay_ms(20);
while(P34 == 0);
delay_ms(20);
int main(){
while(1){
delay_ms(100);
if(P34 == 0){
delay_ms(20); //延时 20,开关按下消抖
while(P34 == 0); //检测 P34=0 时,继续循环上面的语句,否则跳出这个语句执行下一个语句
delay_ms(20);//延时 20ms,开关松开消抖
//按下亮 再按下熄灭
P11 = ~P11;
P15 = ~P15;
}
}
}
2.3 独立按键控制 LED 二进制转换
int main(){
unsigned char num = 0; //占 8 位
while(1){
if(P34 == 0){
delay_ms(20);
while(P34 == 0); //消除抖动
delay_ms(20); //防抖
num++;
P1 = ~num;
}
if(P1 == 0x00){
P1 = 0xff;
} //如果 led 全亮 num=1111 1111 ;P1=0000 0000
//num+1=0000 0000
}
}
2.4 独立按键控制 LED 移位
按位左移<< 往左移位 低位补 0;
按位右移<< 往右移位 高位补 0;
按位与& 同为 1 时为 1 其余为 0;
按位或| 有 1 即为 1 全为 0 时才为 0;
按位异或^ 不同时为 1 相同时为 0;
按位取反~
int main(){
unsigned int num = 0x01; //num=0000 0001
int i;
while(1){
//按位左移<< 往左移位 低位补 0;
if(P34 == 0){
delay_ms(20);
while(P34 == 0); //消除防抖
delay_ms(20);
P1 = ~num; //取反即得低电平的 led
num = num << 1;
if(P1 >= 0xff){ //P1 = 1111 1111
num = 0x01;
}
}
//按位右移<< 往右移位 高位补 0;
if(P35 == 0){
delay_ms(20);
while(P35 == 0); //消除防抖
delay_ms(20);
P1 = ~num;
num = num >> 1;
if(P1 == 0xff ||P1 == 0x00){
num = 0x80;
}
}
//顺序左移流水灯
if(P36 == 0){
delay_ms(20);
while(P36 == 0); //消除防抖
delay_ms(20);
P1 = ~num;
for(i = 0;i < 8;i++){
P1 = ~num;
delay_ms(90);
num = num << 1;
if(P1 >= 0xff){
num = 0x01;
}
}
}
}
}
转载于: https://zhuanlan.zhihu.com/p/508384193
我目前是一名计算机专业的学生,我会不断地在各大平台分享我的所学,让知识得到共享,希望大家多多关注,一起从学习计算机基础直到计算机的深入式学习,让我们共同进步吧。