1.回顾
大家还记得我们用数组来存取流水灯的状态值吗,那么数码管也是一样的,我们可以知道数码管能显示出在单片机编程中最常见的数字和字母为0~9,A,b,C,d,E,F这16种状态,那么这一讲我们实现单个数码管从0到F间隔一秒来循环显示。
2.单片机内存
首先要知道我们写的程序是占用内存的,这些内存就是单片机内部的FLASH。STC89C52RC芯片中用来存放程序代码的FLASH内存为8K字节(8192字节)。
而初始化的数组的内存都是存放在单片机的RAM中的,我们平时定义的变量也都是占用RAM的,因为定义的变量数值是要改变的,所以这些变量只能存放在RAM中。
但STC89C52RC芯片中RAM的内存很小,只有512个字节,且这些内存相当珍贵。而让数码管显示的16种状态值我们不用改变它的值,它们只起到赋值作用而已,所以为了不占用珍贵的RAM资源,我们把这16种状态的值(也就是16个字节)存放在FLASH中,因为FLASH的内存比较大。
可能对计算机基础知识相对薄弱的同学来说,对上面的知识点比较模糊,这里笔者建议阅读一下《手把手教你学51单片机》文档2.1节,10.4节。
3.code的用法
拿我们以前讲的数组存放流水灯状态值的初始化来说
unsigned char LEDSET[8]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
如果把这8个字节的内存放到FLASH中,只需加多code即可
unsigned char code LEDSET[8]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
详细了解请看文档的5.3.3节,6.1.1节,6.1.4节,12.3.1节。
4.真值表
共阳数码管的0~9,A,b,C,d,E,F 这16种状态值如下
0:0xC0 1:0xF9 2:0xA4 3:0xB0 4:0x99 5:0x92 6:0x82 7:0xF8 8:0x80 9:0x90 A:0x88 b:0x83 C:0xC6 d:0xA1 E:0x86 F:0x8E
数组初始化:
unsigned char code LedChar[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//数码管状态值初始化
5.代码
像这种加入code关键字来存放在FLASH中的代码我们写在最开始的函数外部。
实现数码管从0到F间隔一秒循环显示的代码如下
#include <reg52.h> sbit ADDR2 = P1^2; sbit ADDR1 = P1^1; sbit ADDR0 = P1^0; sbit ENLED = P1^4; sbit ADDR3 = P1^3; unsigned char code LedChar[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//数码管状态值初始化 void delay_ms(unsigned int x) { unsigned int i,j; if(x==1000) { for(i=0;i<19601;i++)//延时1s { for(j=5;j>0;j--); } } else while(x--)for(j=115;j>0;j--); } void main() { unsigned char i=0; ADDR3 = 1;//使能三八译码器 ENLED = 0;// ADDR2 = 0;//************************** ADDR1 = 0;//让三八译码器的IO0输出低电平 ADDR0 = 0;//************************** while(1) { P0=LedChar[i]; delay_ms(1000);//延时1s i++; if(i>=16)i=0; //让i在0~15之间变化 } }
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程