基于PIC的led点阵(验证版)(转载)

基于PIC的led点阵(验证版)(转载)_第1张图片

  原理图上图(应用时限流电阻可以放在X轴或Y轴),下图为74HC138译码器的逻辑图,图示可得,可将E1,E2接地,控制E3开启芯片。

基于PIC的led点阵(验证版)(转载)_第2张图片

#include        //调用头文件,可以去PICC18软件下去查找PIC18FXX2.H
__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

你可能感兴趣的:(pic18单片机)