原理图上图(应用时限流电阻可以放在X轴或Y轴),下图为74HC138译码器的逻辑图,图示可得,可将E1,E2接地,控制E3开启芯片。
#include
__CONFIG(1,XT) ; //晶振为外部4M
__CONFIG(2,WDTDIS) ; //看门狗关闭
__CONFIG(4,LVPDIS) ; //禁止低电压编程
#define HC138_1_2_A RB0 //定义74HC138_1_2的A脚
#define HC138_1_2_B RB1 //定义74HC138_1_2的B脚
#define HC138_1_2_C RB2 //定义74HC138_1_2的C脚
#define HC138_1_E RB3 //定义HC138_1的E3脚
#define HC138_2_E RB4 //定义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, };
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芯片切换
else PORTD=(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