学单片机需要往前走,所以我们必须提前熟悉单片机嵌入式的代码书写风格。
还记得我们要点亮小灯需要的条件吗
首先:
sbit LED2 = P0^0; sbit ADDR2 = P1^2; sbit ADDR1 = P1^1; sbit ADDR0 = P1^0; sbit ENLED = P1^4; sbit ADDR3 = P1^3;
然后:
ADDR3 = 1;//使能三八译码器 ENLED = 0;// ADDR2 = 1;//************************** ADDR1 = 1;//让三八译码器的IO6输出低电平 ADDR0 = 0;//**************************
上面这些条件满足了就叫LED的初始化,也就是说,要想使用硬件上的模块,我们必须配置好它的IO端口输出情况或者设置好函数的参数使其能工作。
注意:初始化不是放在while(1)循环中反复执行,而是在主函数开头把相应的IO端口该输出低电平的输出低电平,该输出高电平的输出高电平,配置好这些器件,它只需在主函数开头执行一次即可,后面就是进入死循环去真正的实现相应的功能了。像有些器件的初始化需要IO端口满足一些时序要求,就是高低电平保持多长时间这些,后面我们遇到这种器件再讲。
我们已经知道小灯要能正常工作,就要满足P1的5个IO端口的条件
所以LED小灯的初始化就封装为
void LED_Init() { P1|=0x0E;//让P1.1,P1.2,P1.3强制输出1 P1&=0xEE;//让P1.0和P1.4强制输出0 }
这两行代码大家自己分析原理。
不过要记住数码管工作的时候,小灯是暂时发挥不了作用的,因为三八译码器的IO6端口的输出已经切换了。
数码管显示任务的代码我们参考了宋老师的简化书写方式,在此之前大家先看到之前的“SEG_task()”。
void SEG_task()//数码管显示函数 { static unsigned char i=0; P0=0xFF;//端口状态全部熄灭数码管里的LED达到刷新作用 switch(i) { case 0: ADDR2 = 0;ADDR1 = 0;ADDR0 = 0;P0=LedBuff[0];i++;break; case 1: ADDR2 = 0;ADDR1 = 0;ADDR0 = 1;P0=LedBuff[1];i++;break; case 2: ADDR2 = 0;ADDR1 = 1;ADDR0 = 0;P0=LedBuff[2];i++;break; case 3: ADDR2 = 0;ADDR1 = 1;ADDR0 = 1;P0=LedBuff[3];i++;break; case 4: ADDR2 = 1;ADDR1 = 0;ADDR0 = 0;P0=LedBuff[4];i++;break; case 5: ADDR2 = 1;ADDR1 = 0;ADDR0 = 1;P0=LedBuff[5];i=0;break; } }
我们把这部分代码简化如下
void SEG_Scan() { static unsigned char i = 0; P0 = 0xFF; //端口状态全部熄灭数码管里的LED达到刷新作用 P1 = (P1 & 0xF8) | i; //i等于0时,就是“ADDR2=0; ADDR1=0; ADDR0=0;”,i等于1时,就是“ADDR2=0; ADDR1=0; ADDR0=1;”,以此类推 P0 = LedBuff[i]; //6个缓冲区的值轮流赋给P0 i++; if(i>=6)i=0; //让i在0~5之间循环变化 }
大家自己对照分析这两部分代码,作用都是一样的,后者却简化了大量的书写,而且执行的时间比前者少,所以代码执行效率高。
看到“reg52.h”文件里发现有P3的8个IO端口的定义
sbit RD = P3^7; sbit WR = P3^6; sbit T1 = P3^5; sbit T0 = P3^4; sbit INT1 = P3^3; sbit INT0 = P3^2; sbit TXD = P3^1; sbit RXD = P3^0;
那我们也可以懂得把之前的“sbit LED2 = P0^0;”等放在“function.h”中。
以及在“function.c”封装有的函数和初始化的数组都需要在“function.h”中声明一下。
比如在“function.c”中定义好了“LED_Init()”,在“function.h”就要“void LED_Init();”声明一下。
本文固定URL:https://www.dotcpp.com/course/358
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程