日常连载6
LED点阵原理:
通常会由两部分的控制端进行控制点阵点亮特定的区域,比如右图中的每一行的LED阴极都连接在一起,引出8个端口,接在74HC595控制,用十六进制的0xXX进行控制每一行阴极的电平状态。然后每一列的阳极也都引出一个端口,用P0口控制每一个端口的状态,然后来控制列的电平高低,两者进行控制组合以控制整个区域的亮灭状态。 通常都是以逐行或列扫描的方式进行控制,一个控制部分进行逐行或列扫描的次序,一个控制部分进行对应的每一列中每一行的相应点的亮灭状态。 在进行扫描使用取模软件获取代码时一定注意取模的方向和参数等的设置。
箭头朝上滚动代码示例: - /*————备注:———————*
- 74HC595控制行(二极管的阳极)
- P0控制列(二极管的阴极)
- *—————————————————*/
-
-
- //====头文件定义===*
- #include<reg52.h>
- #include<intrins.h>
- //=================*
-
-
- //====宏定义=======*
- #define uchar unsigned char
- #define uint unsigned int
- //=================*
-
-
- //====引脚说明=====*
- sbit SRCLK=P3^6;//移位时钟寄存器
- sbit LOAD=P3^5;//锁存器
- sbit SER=P3^4;//数据端
- //=================*
-
-
- //====编码=========*
- uchar code jiantou[14][8]={
- {0x00,0x10,0x30,0x7E,0x7E,0x30,0x10,0x00},//动画帧1
- {0x00,0x20,0x60,0xFC,0xFC,0x60,0x20,0x00},//动画帧2
- {0x00,0x40,0xC0,0xF8,0xF8,0xC0,0x40,0x00},//动画帧3
- {0x00,0x80,0x80,0xF0,0xF0,0x80,0x80,0x00},//动画帧4
- {0x00,0x00,0x00,0xE0,0xE0,0x00,0x00,0x00},//动画帧5
- {0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00},//动画帧6
- {0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x00},//动画帧7
- {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},//动画帧8
- {0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00},//动画帧9
- {0x00,0x00,0x01,0x03,0x03,0x01,0x00,0x00},//动画帧10
- {0x00,0x01,0x03,0x07,0x07,0x03,0x01,0x00},//动画帧11
- {0x00,0x02,0x06,0x0F,0x0F,0x06,0x02,0x00},//动画帧12
- {0x00,0x04,0x0C,0x1F,0x1F,0x0C,0x04,0x00},//动画帧13
- {0x00,0x08,0x18,0x3F,0x3F,0x18,0x08,0x00},//动画帧14
- };
-
- uchar code ledwei[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
- //=================*
-
-
- //====全局变量=====*
- uchar count=0,index=0;
- //=================*
-
-
- //====定时器0设定==*
- void SetT0()
- {
- TMOD=0x01;
- TH0=(65536-5000)/256;//定时5毫秒
- TL0=(65536-5000)%256;
- EA=1;
- ET0=1;
- TR0=1;
- }
- //=================*
-
-
- //====HC595控制行==*
- void Hc595SendByte(uchar dat)
- {
- uchar a;
- SRCLK=0;
- LOAD=0;
- for(a=0;a<8;a++)
- {
- SER=dat>>7;
- dat<<=1;
- SRCLK=1;
- _nop_();
- SRCLK=0;
- }
- LOAD=1;
- _nop_();
- LOAD=0;
- }
- //=================*
-
-
- //====延时函数=====*
- void delay(uint i)
- {
- while(i--);
- }
- //=================*
-
-
- //====LED点阵显示==*
- void LED16(uchar index)
- {
- uchar i;
- P0=0x7f;
- for(i=0;i<8;i++)
- {
- P0=ledwei[i]; //位选
- Hc595SendByte(jiantou[index][i]);//发送段选数据
- delay(100); //延时一段时间使LED更亮一些
- Hc595SendByte(0x00); //消隐
- }
- }
- //=================*
-
- //====主函数=======*
- void main()
- {
- SetT0();
- while(1)
- {
- while(!(count==20))
- {
- LED16(index);
- }
- }
- }
- //=================*
-
-
- //====定时器0中断==*
- void Timer0()interrupt 1
- {
- TH0=(65536-5000)/256;
- TL0=(65536-5000)%256;
- count++;
- if(count==20)
- {
- count=0;
- index++;
- if(index==14) index=0;
- }
- }
- //=================*
复制代码
完整的Word格式文档51黑下载地址:
06-LED点阵.docx
(323.31 KB, 下载次数: 11)
|