| 
 
| 从第三课我们学习74HC138以后,我们了解到74HC138同时一次只能让一个输出口为低电平,也就是在一个时刻内,我们只能让一个数码管显示,始终选通数码管并且可以根据我们的P0总线的信号来改变这个数码管的值,我们可以理解为数码管的静态显示。 数码管静态显示是对应动态显示而言的,静态显示对于一两个数码管还行,多个数码管,静态显示实现的意义就没有了。这节课我们先用一个数码管的静态显示来实现一个简单的秒表,为下节课的动态显示打下基础。
 先来介绍一个51单片机的关键字code。我们前边课程定义变量的时候,一般用到unsigned char或者unsigned int这两个关键字,这样定义的变量都是放在我们的单片机的RAM中,我们在程序中可以随意去改变这个变量的值。但是还有一种常数,我们在程序中要使用,但是却不进行对这个值的改变,这种值我们可以加一个code关键字修饰一下,修饰完毕后,这个值就会存储到我们的程序空间flash中,这样可以大大节省我们单片机的RAM的使用量,毕竟我们的RAM空间比较小,而程序空间是很大的。比如我们现在要使用的数码管真值表,我们来看一下我们下边的这个程序。
 #include<reg52.h>               //包含寄存器的库文件
 sbit  LED = P0^0;
 sbit  ADDR0 = P1^0;
 sbit  ADDR1 = P1^1;
 sbit  ADDR2 = P1^2;
 sbit  ADDR3 = P1^3;
 sbit  ENLED = P1^4;
 unsigned char code LedChar[] = {
 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8e
 };                  //用数组来存储数码管真值表,下一课详细介绍数组
 void main()
 {
 unsigned char counter = 0;
 unsigned char j = 0;
 ENLED = 0; ADDR0 = 0; ADDR1 = 0;
 ADDR2 = 0; ADDR3 = 1; P0 = 0XFF;  //74HC138和P0初始化部分
 TMOD = 0x01;                    //设置定时器0为模式1
 TH0  = 0xB8;
 TL0  = 0x00;                   //定时值初值
 TR0  = 1;                      //打开定时器0
 while(1)
 {
 if(1 == TF0)                 //判断定时器0是否溢出
 {
 TF0 = 0;
 TH0 = 0xB8;              //溢出后,重新赋值
 TL0 = 0x00;
 counter++;
 if(50 == counter)      //判断定时器0溢出是否达到50次
 {
 counter = 0;        //counter清0,重新计数
 P0 = LedChar[j++]; //把数组里的对应值送给P0
 if(16 == j)         //当显示到F后,归0重新开始
 {
 j = 0;
 }
 }
 }
 }
 }
 | 
 |