文章图片
原理图上图(应用时限流电阻可以放在X轴或Y轴),下图为74HC138译码器的逻辑图,图示可得,可将E1,E2接地,控制E3开启芯片。
文章图片
#include //调用头文件,可以去PICC18软件下去查找PIC18FXX2.H
__CONFIG(1,XT) ;
//晶振为外部4M
__CONFIG(2,WDTDIS) ;
//看门狗关闭
__CONFIG(4,LVPDIS) ;
//禁止低电压编程
#define HC138_1_2_ARB0//定义74HC138_1_2的A脚
#define HC138_1_2_BRB1//定义74HC138_1_2的B脚
#define HC138_1_2_CRB2//定义74HC138_1_2的C脚
#define HC138_1_ERB3//定义HC138_1的E3脚
#define HC138_2_ERB4//定义HC138_2的E3脚,这里有片选的意思,信号线共用,控制脚不同
/*--文字:辉--*/
const unsigned char han[]=
{/*--宋体12;
此字体下对应的点阵为:宽x高=16x16--*/
0x24,0x38,0xE0,0x3F,0xE8,0x24,0x26,0x12,0xD2,0x3E,0xD2,0x12,0x12,0x16,0x02,0x00,
0x40,0x30,0x0F,0x00,0x3F,0x10,0x08,0x09,0x09,0x09,0xFF,0x09,0x09,0x09,0x08,0x00,};
【基于PIC的led点阵(验证版)(转载)】
unsigned char m;
/**点阵扫描,先PORTC输出代码,74HC138的ABC译码对应选择,该驱动芯片E3位置1,输出显示
直到m=8时,打开另一个138芯片,因为一个138只能译码8位,而这里有16位,同样PORTC继续
送代码;16位扫描完之后,下八位,PORTD同样处理************************************/
void disp16_16(void)
{
if(++m>31) m=0;
//先扫描PORTC时的16+PORTD时的16,共计m=32
PORTD=0;
PORTC=0;
PORTB=0;
if(m<16) PORTC=(han[m]);
//前16位,对PORTC进行扫描,同时,m>7后,进行138芯片切换
elsePORTD=(han[m]);
//后16位,就是对PORTD进行扫描了。
PORTB|=(m&0x07);
if((m&0x08)>0) HC138_2_E=1;
//m>7时就要打开另外一个138芯片
else HC138_1_E=1;
//否则继续使用本芯片
}
void main(void)
{
unsigned char k;
ADCON1=0X06;
//所有IO均为数字口,模拟量输入禁止
TRISB=0B11100000;
//RB0-4设置为输出
PORTB=0B00000000;
//失能74HC138_1_2
TRISD=0B00000000;
//RD设置为输出
PORTD=0B00000000;
//灭掉LED点阵屏的00-07行
TRISC=0B00000000;
//RC设置为输出
PORTC=0B00000000;
//灭掉LED点阵屏的08-15行
while(1)
{
for(k=0;
k<70;
k++);
disp16_16();
}
}
原文http://hi.baidu.com/wangh0802/item/3bf7c6445a4fb4e6bcf451e9