历史上的今天
今天是:2025年08月17日(星期日)
2021年08月17日 | 51单片机-数组&数码管
2021-08-17 来源:eefocus
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 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之间变化 } }
上一篇:51单片机-数码管原理
下一篇:51单片机-数码管&LED
史海拾趣
|
各位大侠,小弟现在在用USB,碰到一个纠结的问题。 我是将usb虚拟成串口来用的,现象是:电脑上插上一个这样的usb设备正常,能识别出com口,但是有时如果插上2个或3个或者以上同样设备的时候就出现识别不了com口的情况,请问这是什么原因? ...… 查看全部问答> |
|
各位前辈,晚生目前写代码遇到一个问题,很头疼,不知如何解决,还请明示: 我用一个ram作转发操作,目前的思路是, 用一个含有7个reg的memory依次记录每条数据写入ram的地址头,然后再通过这些地址头去寻址读取数据,但是读取完成之后我想反馈给 ...… 查看全部问答> |
|
瞬间建立FPGA电源设计 WEBENCH FPGA 电源架构设计工具包含了来自Altera、Xilinx、Actel 和 Lattice最新FPGA器件的详细电源要求,高效能的FPGA电源供应器一般比较复杂,设计人员在设计独特的多重电压级时需满足精准的电压、电流、 纹波、噪 ...… 查看全部问答> |
|
大家好: 我在操作 Multisim 的示波器时发觉画面闪得很快,不知道有没有什么方法可以让画面显示平稳一点,或是慢动作播放,谢谢。… 查看全部问答> |
|
谁能告诉我,C2000的LAUNCHPAD板子如何下载程序?如何在线调试? 谁能告诉我,C2000的LAUNCHPAD板子如何下载程序?如何在线调试?上次从论坛得了一C2000的开发板,最近论坛在宣传培训C2000板子。于是哥填了根内存条(原来是1G的),装好之后,按照大神们的资料学习。看了半天,试了半天,但不知道如何实现程序下载 ...… 查看全部问答> |
|
【TI 无线主题征集】+Zigbee无线通知设备(CC2530) 最近做了一个使用Zigbee做生产线通知仓库送料设备。功能很简单,就是发送器按键按下,接收器接收到发送器数据后,报警并回应,发送器在接收到回应后,指示灯点亮表示数据发送成功。在这个过程中,遇到最大的问题就是传输距离的问题,因为在厂房内部 ...… 查看全部问答> |




