轉載請注明出處:http://blog.csdn.net/ruoyunliufeng/article/details/37967455
一.硬件
這里的LED選擇直插的霧面LED,亮度可以還不失美觀。
注意每行要加上限流電阻。74HC138(三八譯碼器)作為列選,每行都連著74HC595(移位寄存器)實現串行輸入,并行輸出。
???????
二.軟件
led.h
#ifndef __Led_H
#define __Led_H#include "STC12C5A.h"#define uint unsigned int
#define uchar unsigned char
#define light 127sbit _SER = P0^0; // 74hc595 串行數據輸入端
sbit _RCLK = P0^1; // 74hc595 數據輸出時鐘線
sbit _SRCLK = P0^2; // 74hc595 數據輸入時鐘線
sbit ACT_Key = P0^3; // 模式開關
sbit key1 = P0^6; // pwm調節+
sbit Key_2 = P3^3; // 時鐘調節按鍵extern void delayled(int );
extern void LineInput(uint dat);
//extern void DisplayTime(void);
//extern void TimeSetting(void);
extern void ruoyun(void);#endif
led.c
#include "Led.h"uint code table1[80]={
0x0C,0x01,0x10,0x11,0xFE,0x11,0x44,0x3F,
0x44,0x11,0x44,0x3D,0x7E,0x11,0x00,0x11,/*"若",0*/0x00,0x00,0x0C,0x01,0x34,0x11,0xC4,0x11,
0x04,0x11,0x14,0x11,0x0E,0x01,0x00,0x01,/*"云",0*/0x04,0x10,0xFC,0x1F,0x00,0x1F,0xFC,0x00,
0x00,0x1F,0xFC,0x1F,0x04,0x10,0x00,0x00,/*"M",0*/0xE0,0x03,0x18,0x0C,0x04,0x10,0x04,0x10,
0x04,0x10,0x08,0x10,0x10,0x1C,0x00,0x00,/*"C",0*/0x00,0x10,0xF8,0x1F,0x04,0x10,0x04,0x00,
0x04,0x00,0x04,0x10,0xF8,0x1F,0x00,0x10,/*"U",0*/};uchar code ColScan[16] = {0x20,0x24,0x22,0x26,0x21,0x25,0x23,0x27,0x10,0x14,0x12,0x16,0x11,0x15,0x13,0x17}; // 74hc138 進行列掃描void delayled(int z) // 延時函數
{int x,y;for(x=0;x<z;x++)for(y=0;y<110;y++);
}void WriteByte(char dat) //寫一個字節的數據
{char i; for(i=0;i<8;i++) //循環8次把編碼傳給鎖存器{dat=dat>>1; //右移一位。取出該字節的最低位_SER=CY; //將該字節的最低位傳給R_SRCLK=0; //將數據取出,上升沿_SRCLK=1;}
}
void LineInput(uint dat) // 單列數據顯示
{uchar n;_RCLK = 0;for(n=0;n<16;n++){_SRCLK = 0;_SER = (dat>>n)&0x01; //將數據的值串入輸入SER中,然后并行輸出_SRCLK = 1;}_RCLK = 1;
}void ruoyun()
{int num,k,j;//,move,speed;for(k=0;k<25;k++) //控制動畫移動{ for(j=0;j<150;j++) //延時{for(num=0;num<16;num++) //控制每一幀{WriteByte(table1[2*(num+k)]); //送出一個字節WriteByte(table1[2*(num+k)+1]);P2=ColScan[num]; //行選_RCLK=1; //輸出鎖存器數據下降沿_RCLK=0;delayled(2);}} }
我想最核心的東西,應該就是怎么通過三個循環實現左移的吧(盡管這樣做用來三個循環。如今看來并非非常好),以下具體講講這段代碼。
代碼思路:我們都知道要想實現點陣顯示僅僅要向595串行輸入16個字模數據就OK了。那么怎樣叫它向左面移動呢?事實上非常easy。以下我繪圖說明:
最里面的那層for循環實現了點陣的顯示,就是從左到右刷一遍。
中間那層for循環是一箭雙雕,有兩個作用。第一個就是為了點陣可以穩定顯示,就是高速的多刷幾遍(要不刷一遍誰看得清)。
第二個作用就是為了向左移動提供延時(要不瞬間不就左移到頭了嘛)。
事實上規范點的寫法應該是這個for提供穩定點陣顯示。然后外面在加一個延時控制向左移動的速率。后來我看寫的太復雜就給省略了。
最外面的那層循環控制的是左移的列數(就是向左移動多少):
for(k=0;k<25;k++) //控制動畫移動
K的值代表想做移動的列數。為什么是25。由于一共是5個字每一個字占8行??????????????
初始狀態: ?? ???????????????? *若 云*MCU
終止狀態:????????????? 若云*MCU*
也就是像左面移動三個字,3*8=24,所以K<25。
最后另一個LineInput()函數,干嘛用的呢?留個懸念,興許博客解說。