您的位置:首页 > 其它

MC9S12XS128驱动LEDP10显示屏

2014-08-19 16:28 225 查看
#include    
 
#include "derivative.h"    
 

#define B PORTA_PA0    
  //数据串行输入时钟
#define C PORTA_PA2    
//数据输出时钟
#define D PORTA_PA4  
 //74LS138使能时钟
#define A PORTA_PA1  
 //行选
#define CP PORTA_PA5  
 //行选
#define SC PORTA_PA6  
 //行选
#define RI PORTA_PA3  
 //串行数据
#define CT PORTA_PA7 
#define DIR DDRA    
    //数据方向

#define BUS_CLOCK   32000000
  //总线频率
unsigned char ziku[4][32]={
   

0xFB,0xBF,0xFB,0xBF,0xC0,0x03,0xFB,0xBF,0xFB,0xBF,0x80,0x01,0xFB,0xBF,0xF7,0xDF,

0xEE,0xEF,0xDE,0xF7,0x3E,0xF9,0xEE,0xAF,0xEE,0xD7,0xDE,0xD7,0xFA,0xFF,0xFD,0xFF,

0xFE,0xFF,0x80,0x03,0xFE,0xFF,0xC0,0x07,0xFF,0xFF,0xE0,0x0F,0xEF,0xEF,0xE0,0x0F,

0xFB,0xBF,0x00,0x01,0xFF,0xFF,0xE0,0x0F,0xEF,0xEF,0xEF,0xEF,0xE0,0x0F,0xFF,0xFF,

0xFD,0xFF,0xDD,0xBF,0xDD,0xCF,0xDD,0xEF,0x80,0x01,0xDB,0xFF,0xFB,0xFF,0xF8,0x1F,

0xF3,0xDF,0xF5,0xDF,0xF5,0xDF,0xEE,0xBF,0xDF,0x7F,0xBE,0x9F,0x79,0xE3,0xE7,0xF7,

0xFF,0xF7,0x81,0xF7,0xBD,0xF7,0xB5,0xF7,0xB5,0x01,0xB5,0xE7,0xB5,0xE7,0xB5,0xD7,

0xB5,0xD7,0xB5,0xB7,0xF7,0xB7,0xEB,0x77,0xED,0xF7,0xDC,0xF7,0xBD,0xD7,0x7F,0xEF

};
void init();
void shuru(unsigned char data);
void shuchu();
void delay(unsigned char p);
void hangxuan(unsigned char P);
void timer_init();
void shuru1();
void INIT_PLL(void);
unsigned char hang=0,zi=0,shu=0;
void main(void) 
{
     
     
init();
     
INIT_PLL();
     
timer_init();
     
while(1) 
     
{
     
  
     
 
for(hang=0;hang<16;hang++) 
     
  {
     
   
for(zi=0;zi<4;zi++) 
     
    {
     
     
  shuru(ziku[zi][2*hang]);
     
     
  shuru(ziku[zi][2*hang+1]);
     
    }
     
    shuru1();
     
    hangxuan(hang);
     
    shuchu();
     
     
  }
   
  
     
     
     
     
  
      }
     
     
    
}

void shuru(unsigned char data) 
{
    unsigned char j=0;
   
for(j=0;j<8;j++) 
    {
     
  RI=((data<<j)&0x80)==0x80? 1 :0;
     
  CP=0;
     
  asm NOP;
     
  CP=1;
     
  asm NOP;
     
  
    }
}
void shuru1()

{
   unsigned char j=0;
   for(j=0;j
   {
     
if(j<64)
     
 {
     
   RI=1;
     
   CP=0;
     
   asm NOP;
     
   CP=1;
     
   asm NOP;
     
 } 
     
 else
     
 
     
 {
     
     
RI=((ziku[(j-64)/16][2*hang+((j)>7?
1:0)]<<(j%8))&0x80)==0x80?  1:0;
     
     
CP=0;
     
      asm
NOP;
     
     
CP=1;
     
      asm
NOP;
     
 }
     
  
   }
   
}
void shuchu() 
{
    SC=0;
    asm NOP;
    SC=1;
    asm NOP;
}

void hangxuan(unsigned char P)

{
     
A=P&0x01;
     
B=(P>>1)&0x01;
     
C=(P>>2)&0X01;
     
D=(P>>3)&0X01;
     
CT=1;
}
void init()
{
    DisableInterrupts;
    SC=0;
    CP=0;
    A=0;
    B=0;
    C=0;
    D=0;
    RI=0;
    CT=1;
    DIR=0XFF;
    EnableInterrupts;
}

void INIT_PLL(void) 
{
    CLKSEL &= 0x7f;
      //set
OSCCLK as sysclk
    PLLCTL &= 0x8F;
      //Disable
PLL circuit
    CRGINT &=
0xDF;
    
    #if(BUS_CLOCK ==
40000000) 
      SYNR
= 0x44;
    #elif(BUS_CLOCK ==
32000000)
      SYNR
= 0x43;  
  
    #elif(BUS_CLOCK ==
24000000)
      SYNR
= 0x42;
   
#endif 

    REFDV = 0x81;
     
  //PLLCLK=2×OSCCLK×(SYNDIV+1)/(REFDIV+1)=64MHz
,fbus=32M
    PLLCTL =PLLCTL|0x70;
 //Enable PLL circuit
    asm NOP;
    asm NOP;
   
while(!(CRGFLG&0x08)); //PLLCLK is Locked already
    CLKSEL |= 0x80;
     
 //set PLLCLK as sysclk
}
void timer_init()

{
     
//CLKSEL &= 0x7f;    
  //set OSCCLK as sysclk
     
TSCR1_PRNT=0;//使能预分频
     
TSCR2=0x87;//使能溢出中断   128分频
     
TCNTH=((unsigned int)(-20000))/256; //500ms
     
TCNTL=((unsigned int)(-20000))%6; 
     
TFLG2_TOF=1;   //清除溢出中断标志位
     
TSCR1_TEN=1;  //使能定时器
}

  

#pragma CODE_SEG __NEAR_SEG NON_BANKED

interrupt void timer() 

{
   
 TFLG2_TOF=1;   //清除溢出中断标志位
   
 TCNTH=((unsigned int)(-20000))/256; //500ms
   
 TCNTL=((unsigned
int)(-20000))%6; 
   
 shu++;
   
 if(shu==128) 
   
 {
     
   shu=0;
   
 }
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: