C51之共阳极点阵LED之“I Love You”细致版

在这篇文章里我会讲述其他的基础知识,以便理解,因为每个板子他学习模块的顺序不同,把定时器有拉出来讲一讲

1.变量

       变量分为局部变量和全局变量 ,在函数外面就在上面定义声明的就是全局变量,下面的所有函数都可以使用,全局变量一般定义在开头位置,在函数内部定义声明的是局部变量,只能在这个函数内部使用。但是全局变量会增加内存的消耗,局部变量只有在该变量存在的函数内运行时才会占用内存单元,函数结束后释放内存。到了后期复杂程序,最好使用局部变量,少用全局,改数据改代码也会好修改一些。同时如果你把全局和局部的变量名设置的一样,局部会优先,所以不要因为懒写成一个名字.

 2.static

        这个是静态的意思,它怎么来使用呢,首先在函数内部定义的局部变量是有一个隐藏的auto,这是指动态变量或者叫自动变量,如果加上一个static就是静态局部变量,注意的是全局变量都是静态变量,特点是只赋值了一次初值,在之后程序运行的时候,这个值就保留了了上一次的值接着运行。


void display(uchar i)
{  static uchar wei;         
    P0 = 0XFF;//清除断码
    WE = 1;//打开位选锁存器
    P0 = weixuan[wei];
    WE = 0;//锁存位选数据
    switch(wei)
    {
        case 0: DU = 1; P0 = duanxuan[i/100%10]; DU = 0; break;
        case 1: DU = 1; P0 = duanxuan[i/10%10]; DU = 0; break;    
        case 2: DU = 1; P0 = duanxuan[i%10]; DU = 0; break;        
    }
    wei++;
    if(wei == 3)
        wei = 0;
}

    这是一个数码管的函数,这个函数我是放在了中断函数里每五毫秒扫描一次,每次会使用上一次的wei的值。完整函数在上一篇各中断类型里的最后一个。

3.先描述一下定时器的问题,我只讲部分有用的,详细请参考数据手册或者其他资料。

      先提一个词叫晶振,它是给电路提供频率的,时钟周期就等于1/晶振,C51系列的标准构架下它的一个机械周期是12个时钟周期,而定时器就是每经过一个机械周期自动加一,溢出后为0。

下面是定时器存储寄存器

TH0定时器0高八位
TL0定时器0低八位
TH1定时器1高八位
TL1定时器1第八位


一共16位两个字节最大到65535

下面看一下  定时器控制寄存器TCON

TF1   定时器1的溢出标志,为1则需软件清零或者进入定时器中断清零

TR1  启动定时器1
TF0,TR0同上

下面是定时器模式寄存器TMOD(不可位寻址),什么叫不可位寻址比如上面TCON里的TR1=1;是可以这样写的,但是TMOD里的C/T不能写C/T=1,要写成TMOD=0x05;的形式。

76543210
符号GATEC/TM1M0GATEC/TM1M0
对应的T1T1T1T1T0T0T0T0

T1,T0   表示定时器1,0

C/T         置1是计数器,置0是定时器

M1 M0    决定工作模式
0     0          0
0     1          1                                      16位定时器

1     0          2

1     1          3

4.中断和定时器看我之前文章的代码

5.先用取模软件做一个心形图案,因为我使用的是74hc595就没用中断,如果你使用的是74hc138要使用中断。

#include<reg52.h>
#include<intrins.h>
sbit DI = P3^4;//串口输入
sbit s_clk = P3^5;//移位寄存器
sbit r_clk = P3^6;//输出寄存器
unsigned char code  leddian[8]={0xE7,0xC3,0x81,0x00,0x00,0x00,0x99,0xFF};
unsigned char i;

void send_byte(unsigned char dat)
{	  
  r_clk = 0;
  s_clk = 0;
  for(i=0;i<8;i++)
	{
	  if(dat & 0x01)
		  DI = 1;
	  else
		  DI = 0;
	  s_clk = 1;
	  dat>>=1;
	  s_clk = 0;		  
    }
}

void main ()
{  
   unsigned j,row;
   while(1)
   {
    row = 0x80;
   	for(j=0;j<8;j++)
	{
	 send_byte(leddian[j]);
	 send_byte(row);		  
	  r_clk = 1;
	  r_clk = 0;
	  row=_cror_(row,1);	  	  	  	  
    }
   }
}

6.下面是让图形竖向动起来,要了解74hc595,自己去查数据手册

#include<reg52.h>
#include<intrins.h>

sbit DI = P3^4;//串口输入
sbit s_clk = P3^5;//移位寄存器
sbit r_clk = P3^6;//输出寄存器

unsigned char code  leddian[]={
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xC3,0xE7,0xE7,0xE7,0xE7,0xC3,0xFF,0x99,
0x00,0x00,0x00,0x81,0xC3,0xE7,0xFF,0x99,
0x99,0x99,0x99,0x99,0x81,0xC3,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,

};

unsigned char i;

void send_byte(unsigned char dat)
{	  
  r_clk = 0;
  s_clk = 0;
  for(i=0;i<8;i++)
	{
	  if(dat & 0x01)
		  DI = 1;
	  else
		  DI = 0;
	  s_clk = 1;
	  dat>>=1;
	  s_clk = 0;		  
    }
}

void main ()
{  unsigned  char row = 0x80;
   unsigned int cnt=0;
   unsigned char k=0;
   unsigned char index = 0;
   TMOD =0x01;
   TH0 = 0xfc;
   TL0 = 0x67;
   TR0 = 1;
    row = 0x80;//行
   while(1)
   {  
      if(TF0==1)
	  {
	   TH0 = 0xfc;
       TL0 = 0x67;
	   cnt++;
	  }
	  switch(k)
	  {
	  	case 0:send_byte(leddian[index+7]);send_byte(row); row=_cror_(row,1);r_clk = 1; r_clk = 0;k++;break;
	    case 1:send_byte(leddian[index+6]);send_byte(row); row=_cror_(row,1);r_clk = 1; r_clk = 0;k++;break;
	  	case 2:send_byte(leddian[index+5]);send_byte(row); row=_cror_(row,1);r_clk = 1; r_clk = 0;k++;break;
	  	case 3:send_byte(leddian[index+4]);send_byte(row); row=_cror_(row,1);r_clk = 1; r_clk = 0;k++;break;
	  	case 4:send_byte(leddian[index+3]);send_byte(row); row=_cror_(row,1);r_clk = 1; r_clk = 0;k++;break;
	  	case 5:send_byte(leddian[index+2]);send_byte(row); row=_cror_(row,1);r_clk = 1; r_clk = 0;k++;break;
	  	case 6:send_byte(leddian[index+1]);send_byte(row); row=_cror_(row,1);r_clk = 1; r_clk = 0;k++;break;
	  	case 7:send_byte(leddian[index+0]);send_byte(row); row=_cror_(row,1);r_clk = 1; r_clk = 0;k=0; break;
	  	default :break;
	  }
	  if(cnt>=800)
	  {
	     cnt = 0;
		 index ++;	  	  	  	  	  
      }
	  if(index>=32)
	    index = 0;
     }
}

下面让它横向动起来和竖向不太一样

#include<reg52.h>
#include<intrins.h>

sbit DI = P3^4;//串口输入
sbit s_clk = P3^5;//移位寄存器
sbit r_clk = P3^6;//输出寄存器

unsigned char code  leddian[30][8]={
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},//1
{0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE},//2
{0xFF,0xFC,0xFE,0xFE,0xFE,0xFE,0xFE,0xFC},//3
{0xFF,0xF8,0xFC,0xFC,0xFC,0xFC,0xFC,0xF8},//4
{0xFF,0xF0,0xF9,0xF9,0xF9,0xF9,0xF9,0xF0},//5
{0xFF,0xE1,0xF3,0xF3,0xF3,0xF3,0xF3,0xE1},//6
{0xFF,0xC3,0xE7,0xE7,0xE7,0xE7,0xE7,0xC3},//7
{0xFF,0x87,0xCE,0xCE,0xCE,0xCF,0xCF,0x87},//8
{0xFF,0x0E,0x9C,0x9C,0x9C,0x9E,0x9F,0x0F},//9
{0xFF,0x1C,0x38,0x38,0x38,0x3C,0x3E,0x1F},//10
{0xFF,0x39,0x70,0x70,0x70,0x78,0x7C,0x3E},//11
{0xFF,0x73,0xE0,0xE0,0xE0,0xF0,0xF8,0x7C},//12
{0xFF,0xE6,0xC0,0xC0,0xC0,0xE0,0xF0,0xF9},//13
{0xFF,0xCC,0x80,0x80,0x80,0xC0,0xE1,0xF3},//14
{0xFF,0x99,0x00,0x00,0x00,0x81,0xC3,0xE7},//15
{0xFF,0x33,0x01,0x01,0x01,0x03,0x87,0xCF},//16
{0xFF,0x67,0x03,0x03,0x03,0x07,0x0F,0x9F},//17
{0xFF,0xCE,0x06,0x06,0x06,0x0E,0x1E,0x3F},//18
{0xFF,0x9C,0x0C,0x0C,0x0C,0x1C,0x3C,0x7E},//19
{0xFF,0x39,0x19,0x19,0x19,0x39,0x78,0xFC},//20
{0xFF,0x73,0x33,0x33,0x33,0x73,0xF0,0xF8},//21
{0xFF,0xE6,0x66,0x66,0x66,0xE6,0xE0,0xF0},//22
{0xFF,0xCC,0xCC,0xCC,0xCC,0xCC,0xC0,0xE1},//23
{0xFF,0x99,0x99,0x99,0x99,0x99,0x81,0xC3},//24
{0xFF,0x33,0x33,0x33,0x33,0x33,0x03,0x87},//25
{0xFF,0x67,0x67,0x67,0x67,0x67,0x07,0x0F},//26
{0xFF,0xCF,0xCF,0xCF,0xCF,0xCF,0x0F,0x1F},//27
{0xFF,0x9F,0x9F,0x9F,0x9F,0x9F,0x1F,0x3F},//28
{0xFF,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x7F},//29
{0xFF,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0xFF},//

};

unsigned char i;

void send_byte(unsigned char dat)
{	  
  r_clk = 0;
  s_clk = 0;
  for(i=0;i<8;i++)
	{
	  if(dat & 0x01)
		  DI = 1;
	  else
		  DI = 0;
	  s_clk = 1;
	  dat>>=1;
	  s_clk = 0;		  
    }
}

void main ()
{  unsigned  char row = 0x80;
   unsigned int cnt=0;
   unsigned char k=0;
   unsigned char index = 0;
   TMOD =0x01;
   TH0 = 0xfc;
   TL0 = 0x67;
   TR0 = 1;
    row = 0x80;//行
   while(1)
   {  
      if(TF0==1)
	  {
	   TH0 = 0xfc;
       TL0 = 0x67;
	   cnt++;
	  }
	  switch(k)
	  {
	  	case 0:send_byte(leddian[index][7]);send_byte(row); row=_cror_(row,1);r_clk = 1; r_clk = 0;k++;break;
	    case 1:send_byte(leddian[index][6]);send_byte(row); row=_cror_(row,1);r_clk = 1; r_clk = 0;k++;break;
	  	case 2:send_byte(leddian[index][5]);send_byte(row); row=_cror_(row,1);r_clk = 1; r_clk = 0;k++;break;
	  	case 3:send_byte(leddian[index][4]);send_byte(row); row=_cror_(row,1);r_clk = 1; r_clk = 0;k++;break;
	  	case 4:send_byte(leddian[index][3]);send_byte(row); row=_cror_(row,1);r_clk = 1; r_clk = 0;k++;break;
	  	case 5:send_byte(leddian[index][2]);send_byte(row); row=_cror_(row,1);r_clk = 1; r_clk = 0;k++;break;
	  	case 6:send_byte(leddian[index][1]);send_byte(row); row=_cror_(row,1);r_clk = 1; r_clk = 0;k++;break;
	  	case 7:send_byte(leddian[index][0]);send_byte(row); row=_cror_(row,1);r_clk = 1; r_clk = 0;k=0; break;
	  	default :break;
	  }
	  if(cnt>=800)
	  {
	     cnt = 0;
		 index ++;	  	  	  	  	  
      }
	  if(index>=30)
	    index = 0;
     }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值