c语言定义字符数组数码管,数组&数码管

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之间变化

}

}

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值