⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 oleddisp.c

📁 5个430系列微控制器源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#include"msp430x13x.h"

#include"logo.h"
#include"numdot.h"

#define uchar unsigned char
//=======================================================================//
//
//=======================================================================//
#define MAXDISPLAYSIZE    128 
#define STEP 1              // shift left step  
#define REFRESH 336         // EQU=maxdisplaysize*(chinese number+8)/(step*8)+1
#define MAXLEN 208          // EQU=16*chinese number
/*=======================================================================*/

uchar lattice[2][128];    
uchar message[8][16]={{0xa1,0xa1,0xd3,0xb2,0xbc,0xfe,0xb2,0xbf},{0xd5,0xc5,0xc5,0xf4,0xc9,0xe8,0xbc,0xc6}};     
                          
uchar imagebuf;          
//uchar keybuf;          
unsigned int ADvalue=0;    
unsigned int temp[3]={0x0fff,0x0fff,0x0fff}; 
uchar pagenum=1;
uchar rxbuf,k,bytes,flag=0,led;
uchar databuf[3];

// uchar p5keyj();
// void keymanage();
// uchar keycode();

void poweroff();
void wakeup();
void shutdown();

void init_display();
void ADC12init(void);

void read_status();
void delay(unsigned int );
void read_signal();
void write_signal();
void turnon_oled();
void turnoff_oled();
void boot_display();
void display(uchar ,uchar );
void clear_area(uchar ,uchar );

void battery_empty();
void battery(uchar );
void signal(uchar );
void address(uchar ,uchar );
void login_status(uchar );
void battery_detect();


void press_key_login();
void press_key_vote();
void insert_card_login();
void agree();
void disagree();
void abstain();
void set_address();
void vote_end();

void read_message(uchar );
void message_pages(uchar ,uchar );

void address_access();
void write_address();

void display_one(uchar );
void read_library(uchar ,uchar ,uchar );

void protocol(uchar ,uchar ,uchar );

/*=======================================================================*/ 

/*=======================================================================*/

void main(void) {
  uchar i,j;
  _DINT();
  WDTCTL=WDTPW+WDTHOLD;
  IE1&=~OFIE;                      //禁止振荡器失效中断
  BCSCTL1&=~(XT2OFF+XTS);          //选择XT2振荡器,ACLK为XT1

  BCSCTL1|=DIVA0;                  // ACLK分频数为8,用于蜂鸣器发音
  BCSCTL2|=SELM1;                  //用XT2CLK作为MCLK的时钟源
  BCSCTL2&=~SELS;
  do {
    IFG1&=~OFIFG;
    delay(255);                    //等待晶振转换完成
  }
  while((IFG1&OFIFG)!=0);
  IFG1&=~OFIFG;

//=====================================================
//_EINT();                         //初始化各端口
  P3DIR=0XFF;
//P1DIR=0XFF;
//P1OUT=0X00;
  P1DIR=0XF8;                      //引脚为输入
  P1IES|=BIT0;                     // 下降沿有效
  P1IE=0X01;                       //允许P1.0中断


  _EINT();
  P2DIR=0XFF;
  P5DIR=0X07;

  P3OUT|=BIT2;                     //CE=1
  P3OUT|=BIT1;                     //OE=1;

  P6DIR=0XFE;
  P3SEL=0X00;
  P6SEL=0X01;

  P6OUT|=BIT1;
  P3OUT|=BIT0;
//====================================================

  TACTL=TASSEL0+TACLR;             // TA定时
  CCTL0=CCIE;
  CCR0=20000;

//TACTL|=MC0;
  TACTL&=~MC0;

  TBCTL=TBSSEL0+TBCLR;
  TBCCTL0=CCIE;
  TBCCR0=2;
  TBCTL|=MC0;
  _EINT();

//=====================================================
  init_display();                   // 初始化oled
  for(i=0;i<8;i++){
    for(j=0;j<132;j++) {            // clear all display RAM
      imagebuf=0x00;
      display(i,j);
    }
  }
  turnon_oled();
//=====================================================

  ADC12init();
  _EINT();
  ADC12CTL0|=ADC12SC;

//=====================================================
//boot_display();
//poweroff();
  signal(1);
//address(2,65);
//battery_empty();
//battery(5);

//login_status(0);


//P5DIR=0X47;
//P5SEL=0X40;
//======================================================

  while(1)
{//battery_detect();
  if(led) turnon_oled();
  else turnoff_oled();
//if(flag==1) protocol(databuf[0],databuf[1],databuf[2]);
}
//=======================================================
/*
while(1)
{battery_detect();
if(p5keyj()!=0)
{delay(500);
while(p5keyj()!=0)
   {keybuf=keycode();
   keymanage();
   while(p5keyj()!=0);
   }
   }
   }
 */
//======================================================
}

/*=======================================================================*/
#pragma optimize= z                //set compile optimizes for size
void delay(unsigned int v) {       //延时程序
  while(v!=0)v--;
}
/*=======================================================================*/
/*=======================================================================*/ 
//读状态函数
void read_status() {
  uchar wait,state;
  P4DIR=0X00; 
  P3OUT&=~BIT5;                    //DC=0;
 
  state=1; 
  wait=1; 
  do {
    state=P4IN; 
    read_signal();
    wait=state & 0x80; 
  }while(wait !=0); 
  P4DIR=0XFF;
}
/*=======================================================================*/ 
void read_signal() {                //读信号
  P3OUT&=~BIT7;                     //RD=0;
  P3OUT|=BIT7;                      //RD=1;
}
void write_signal() {               //写入信号
  P3OUT&=~BIT6;                     //WR=0;
  P3OUT|=BIT6;                      //WR=1;
}
/*=======================================================================*/  
void init_display(void){            //OLED初始化
  P3OUT&=~(BIT3+BIT4+BIT5);         //CS=0; RES=0;DC=0; 
  P3OUT|=BIT4;                      //RES=1; 
  P4DIR=0XFF;
  read_status(); 
  P4OUT=0xa0; //10100000: set segment remap:column address 0 is mapped to SEG0(POR)
  write_signal();
  read_status(); 
  P4OUT=0xc8; //11000000: set com output scan direction:Scan from COM0 to COM(N-1) (POR)
  write_signal();
  read_status(); 
  P4OUT=0xda; // 11011010: set COM pins hardware configuration  
  write_signal();
  read_status(); 
  P4OUT=0x12; // 00010010: alternative COM pin 
  write_signal();
} 
/*=======================================================================*/
//显示函数

#pragma optimize= z 
void display(uchar start_page,uchar start_column) {
  uchar haddress,laddress;
  haddress=start_column>>4;
  laddress=start_column&0x0f;
  P3OUT&=~BIT5;                      // DC=0;
  read_status();
  P4OUT=176+start_page;              //set page address
  write_signal();

  read_status();
  P4OUT=0x00+laddress;               //set low address
  write_signal();

  read_status();
  P4OUT=0x10+haddress;               //set higher address
  write_signal();

  read_status();
  P3OUT|=BIT5;                       //DC=1;
  P4OUT=imagebuf;
  write_signal();
}
/*=======================================================================*/

/*=======================================================================*/
void turnon_oled() {                  //开启OLED显示
//TACTL&=~MC0;
  P3OUT&=~BIT5;                       // DC=0;
  read_status();
  P4OUT=0XAF;                         //10101111: set display on
  write_signal();
  P6OUT|=BIT1;
}

void turnoff_oled() {                 //关闭OLED显示
  TACTL|=MC0;
  P3OUT&=~BIT5;                       // DC=0;
  read_status();
  P4OUT=0XAE;                         //10101110: set display off
  write_signal();
}
/*=======================================================================*/
#pragma optimize= z 
void boot_display() {                 //开机显示       调用数组logo[][]
  uchar j;
  unsigned int n;
  uchar front,rear;
  front=0;                            //显示范围头标记
  rear=0;                             //显示范围尾标记
  for(n=1;n<REFRESH;n++) {
    if(front<MAXDISPLAYSIZE&&rear<MAXDISPLAYSIZE) 
      rear=rear+STEP;
    else if(front<MAXDISPLAYSIZE&&rear>=MAXDISPLAYSIZE&&rear<MAXLEN) 
      {front=front+STEP;rear=rear+STEP;}
    else if(rear==MAXLEN&&front<MAXLEN) 
      front=front+STEP;
    else  
      front=front;rear=rear;
    for(j=0;j<MAXDISPLAYSIZE;j++) {
      if(rear<MAXDISPLAYSIZE&&MAXDISPLAYSIZE-j>rear) {
        imagebuf=0x00;display(3,j);display(4,j);
      }
      else if(rear<MAXDISPLAYSIZE&&MAXDISPLAYSIZE-j<=rear) {
        imagebuf=logo[0][front+j+rear-128];display(3,j);
         imagebuf=logo[1][front+j+rear-128];display(4,j); 
      }
      else if(rear==MAXLEN&&rear-front<=j) {
        imagebuf=0x00;display(3,j);display(4,j);
      }
      else {
        imagebuf=logo[0][front+j];display(3,j);        
        imagebuf=logo[1][front+j];display(4,j);        
      } 
    }
  }
}
/*=======================================================================*/

void battery(uchar energy) {    //电量指示    调用数组sign[]
  if(energy!=0) {
    imagebuf=0xba;
    switch(energy) {
      case 1:display(0,124);imagebuf=0x82;display(0,116);display(0,118);display(0,120);display(0,122);break;                //battery
      case 2:display(0,122);display(0,124);imagebuf=0x82;display(0,116);display(0,118);display(0,120);break;
      case 3:display(0,120);display(0,122);display(0,124);imagebuf=0x82;display(0,116);display(0,118);break;
      case 4:display(0,118);display(0,120);display(0,122);display(0,124);imagebuf=0x82;display(0,116);break;
      case 5:display(0,116);display(0,118);display(0,120);display(0,122);display(0,124);    break;
      default:break;
    }
  }
  else battery_empty();
}

void battery_empty() {
  uchar j;
  for(j=0;j<16;j++){
    imagebuf=sign[16+j];
    display(0,112+j);
  }
}

//===================================================
void signal(uchar value) {     //能量指示    调用数组sign[]  范围0-----7
  uchar j;
  if(value!=0) {
    for(j=0;j<16;j++) {
      if(value==1&&j==5)
        imagebuf=0x06;
      else if(j>6)
        imagebuf=0x00;
      else
        imagebuf=sign[j];  //signal 
      display(0,j);
    }
    if(value>2) {
      for(j=7;j<value*2+2;j=j+2) {
        imagebuf=sign[j];display(0,j);
      }
      for(j=value*2+3;j<16;j=j+2) {
        imagebuf=0x00;display(0,j);
      }
    }
  }
  else {
    imagebuf=0x00;
    for(j=0;j<16;j++)
      display(0,j);
  }
}
//====================================================
void address(uchar channels,uchar number) { //通道地址标识
  uchar hundreds,tens,ones,j;
  hundreds=number/100;
  tens=(number-hundreds*100)/10;
  ones=number-hundreds*100-tens*10;
  imagebuf=0x08;
  for(j=41;j<46;j++)
    display(0,j);                             //显示 ” -   “
  if(channels==0xff||number==0x00) {
    imagebuf=0x00;
    for(j=34;j<40;j++) {
      display(0,j);display(0,12+j);display(0,18+j);display(0,24+j);
    }
  }
  else
    for(j=32;j<38;j++) {
      imagebuf=sign[channels*6+j];
      display(0,2+j);
      imagebuf=sign[hundreds*6+j];
      display(0,14+j);
      imagebuf=sign[tens*6+j];
      display(0,20+j);
      imagebuf=sign[ones*6+j];
      display(0,26+j);
    }
  }
}
//==============================================================

void login_status(uchar login) {                    //报到标识
  uchar j;
  for(j=0;j<6;j++) {
    imagebuf=0x00;display(0,76+j);display(0,94+j);
  }
  if(login==1) {
    for(j=0;j<12;j++) {
      imagebuf=sign[104+j];display(0,82+j);
    }
  }
  else {
//display_please();
//display_checkin();
    for(j=0;j<12;j++) {
      imagebuf=sign[92+j];display(0,82+j);
    }
  }
}
//===============================================================
void clear_area(uchar start_page,uchar end_page) {         //清除显示内容  按页清除
  uchar i,j;
  for(i=start_page;i<end_page+1;i++)
  for(j=0;j<128;j++) {
    imagebuf=0x00;
    display(i,j);
  }
}
//===============================================================
//====================================================
void ADC12init(void) {
  ADC12CTL0&=~ENC;
  ADC12CTL0=ADC12ON+SHT0_12;

  ADC12CTL1=CONSEQ_0+SHP+ADC12DIV_7+ADC12SSEL_0;

  ADC12MCTL0=0X00;
  ADC12IE=BIT0;
  ADC12CTL0|=ENC;
}

#pragma vector=ADC_VECTOR
__interrupt void ADC(void) {
  switch (ADC12IV) {
    case 0x02:break;
    case 0x04:break;
    case 0x06:
     ADvalue=ADC12MEM0;
     ADC12CTL0|=ADC12SC;
    default:break;
  }
}

//==========================================================================//
//       电池工作电压3.6V~4.2V,分压后进行探测 内部参考电平选择3.3V        
//==========================================================================//
/*
void battery_detect()
{temp[2]=temp[1];temp[1]=temp[0];temp[0]=ADvalue;
if(ADvalue>=0X0EE2) battery(5);
else if (ADvalue<0X0EE2&&ADvalue>=0X0E82) battery(4);
else if (ADvalue<0X0E82&&ADvalue>=0X0E23) battery(3);
else if (ADvalue<0X0E23&&ADvalue>=0X0DF4) battery(2);
else if (ADvalue<0X0DF4&&ADvalue>=0X0DC4) battery(1);
else if (ADvalue<0X0DC4&&ADvalue>=0X0D78) 
         {battery(0);P3OUT|=BIT0;}       
else 
{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -