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

📄 main-last.c

📁 这是单片机驱动液晶显示器12864和键盘的源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
//    dis_add_two_num(0x8f,sed);

*/


//    wrc(0x90);
//    wrc(you_on);
    
    
    //显示当前页数
  wrc(0x98);
  wrd(0x30+page);
}



// BT基础定时器中断服务程序
// 每4ms中断一次,16ms一个循环,显示刷新频率为1000/16=62.5Hz
//interrupt [BASICTIMER_VECTOR] void BT_ISP( void )

#pragma vector=BASICTIMER_VECTOR
__interrupt void BT_ISP (void)
{
    
    //BTCTL =BT_ADLY_1000;
    //显示时钟
    if(sed<59)
    {
        sed++;
    }
    else if(min<59)
    {
        sed=0;
        min++;
    }
    else if(hour<23)
    {
        min=0;
        hour++;
    }
    else
    {
    hour=0;
    }
    
    page1();
    /*
    add(2,1);
    dis_num(hour);
    add(2,3);
    dis_num(min);
    add(2,5);
    dis_num(sed);
    */
    
    
    /*
    //每xx次中断钟发射1次

    if(dat==250)
    {
        super_on();
        //dis_ch(0x88,0xb7,0xa2);   //显示 发
        //dis_ch(0x89,0xc9,0xe4);   //显示 射
        led_on();
        dat=0;
    }
    else
    {
        super_off();
        //dis_ch(0x88,0xcd,0xa3);   //显示停
        //dis_ch(0x89,0xd6,0xb9);   //显示止
        led_off();
        dat++;
    }
    */
}



void ini_sys(void)
{
//  WDTCTL=WDTPW+WDTHOLD;  //STOP W D T
  WDTCTL = WDTPW +WDTHOLD;                  // Stop WDT
    FLL_CTL0 |= XCAP14PF;                     // Configure load caps
//  FLL_CTL0 |= XCAP14PF;  //SET  FLL
}
void ini_lcd(void)
{
//  WDTCTL=WDTPW+WDTHOLD; //STOP WDT
  
  uchar com;
  P4SEL &=(~(BIT1+BIT2+BIT3+BIT4));
  P3DIR |=0XFF;//方向设置为输出
  P4DIR |=0XFF;//方向设置为输出
  delay(100);
  
  P4OUT &=~(psb);

  P4OUT |=psb;//PSB 设置为1,通信方式设为8位
//  wrc(com);
  delay(100);
//  com &=~(rs+rw);//设置RS   R/W为低
//  wrc(com);
//  delay(100);
  com =0x30;//功能设置-8位 基本指令集
  wrc(com);
  delay(200);
  delay(200);
  wrc(com);
  delay(100);
  
  
  com=0x0c;
  
  //com =BIT3+BIT2;//显示打开  光标关  翻白显示关
  //com =BIT3+BIT2+BIT1+BIT0;//显示打开  光标关  翻白显示关
  wrc(com);
  delay(200);
  com =BIT0;//清除屏幕显示  地址计数器归零
  wrc(com);
  ldelay(200);
  com =0x06;
  wrc(com);
  delay(100);
}

void check_busy(void)
{
  P4SEL &=(~(BIT1+BIT2+BIT3+BIT4));
  P4DIR =0XFF;//输出
  P3DIR =0X00;//输入
//  P3OUT =0X00;
  
  P4OUT &=~rs;//rs=0
  P4OUT |=rw;//RW=1;
  P4OUT |=en;//en=1
  do
  {
    ;
  }
  while (P3IN>0x7f);
  
  
  /*
  do
  {
  P4OUT =BIT2;
  uchar xx=P3IN;
  P4OUT &=~BIT2;
  }
  while(xx&&BIT7=1);
  */
}
void wrd(uchar dat)
{
  /*
  RS=0;
  RW=1;
  P0=0XFF;
  E=1;
  */
  check_busy();
  P4SEL &=(~(BIT1+BIT2+BIT3+BIT4));
  P4DIR =0XFF;
  P3DIR =0XFF;
  P4OUT |=rs;//rs=1
  P4OUT &=~rw;//rw=0
  P3OUT =dat;//dat  数据传过去
  P4OUT |=en;//en=1;
  P4OUT &=~en;//en=0  下降沿写数据或指令
//  P3OUT =0XFF;
}
void wrc(uchar cmd)
{
  check_busy();
  P4SEL &=(~(BIT1+BIT2+BIT3+BIT4));
  P4DIR =0XFF;//方向为输出
  P3DIR =0XFF;
  P4OUT &=~rs;//rs=0
  P4OUT &=~rw;//rw=0
  P3OUT =cmd;//命令传过去
  P4OUT |=en;//en=1
  P4OUT &=~en;//en=0;en下降沿写数据或指令
//  P3OUT =0XFF;
  }
void delay (uchar n)
{

  while (n--);
}
void ldelay(uchar n)
{
  uchar a=100;
  while(a--)
  {
    while(n--);
  }
}

void led()  //led亮一下
{
  P5DIR |=BIT1;
  P5OUT &=(~BIT1);
  delay(100);
  P5OUT |=BIT1;
}
void led_on()
{
  P5DIR |=BIT1;
  P5OUT &=(~BIT1);
}
void led_off()
{
  P5DIR |=BIT1;
  P5OUT |=BIT1;
}

void dis_add_ch(uchar add,uchar h,uchar l)//显示汉字函数
{
    wrc(add);
    delay(100);
    wrd(h);
    wrd(l);
}
void dis_add_en(uchar add,uchar dat1,uchar dat2)  //显示字符
{
    wrc(add);
    delay(100);
    wrd(dat1);
    wrd(dat2);
}
void dis_add_num(uchar add,uint dat)  //显示数字
{
    uchar a=0;
    wrc(add);
    delay(100);
    dat =dat%10000;
    a =dat/1000;
    wrd(0x30+a);
    dat =dat%1000;
    a =dat/100;
    wrd(0x30+a);
    dat =dat%100;
    a=dat/10;
    wrd(0x30+a);
    dat =dat%10;
    wrd(0x30+dat);
    delay(100);
}

void dis_ch(uchar h,uchar l)//只显示汉字函数
{
    wrd(h);
    wrd(l);
}
void dis_en(uchar dat1,uchar dat2)  //只显示字符
{
    wrd(dat1);
    wrd(dat2);
}
void dis_num(uint dat)  //只显示数字
{
    uchar a=0;
//    dat =dat%10000;
//    a =dat/1000;
//    wrd(0x30+a);
//    dat =dat%1000;
//    a =dat/100;
//    wrd(0x30+a);
    dat =dat%100;
    a=dat/10;
    wrd(0x30+a);
    dat =dat%10;
    wrd(0x30+dat);
    delay(100);
}
void dis_two_num(uchar dat)     //只显示两位数字
{
    uchar a=0;
    dat =dat%100;
    a=dat/10;
    wrd(0x30+a);
    dat =dat%10;
    wrd(0x30+dat);
    delay(100);
}
void dis_add_two_num(uchar add,uchar dat)   //只显示两位数字
{
    uchar a=0;
    wrc(add);
    dat =dat%100;
    a=dat/10;
    wrd(0x30+a);
    dat =dat%10;
    wrd(0x30+dat);
    delay(100);
}
void add(uchar h,uchar l)       //定位地址
{
  l--;
  switch(h)
  {
    case 1:
    {
      wrc(0x80+l);
      break;
    }
    case 2:
    {
      wrc(0x90+l);
      break;
    }
    case 3:
    {
      wrc(0x88+l);
      break;
    }
    case 4:
    {
      wrc(0x98+l);
      break;
    }
  }
}

unsigned char key_data()      //判断键值
{
  int a=0,b=0,c=0,d=0,i=0;

/*
unsigned char sccode,recode;
PC=0X0F;
if((PC&0X0F)!=0X0F)
{
  delay(100);
  if((PC&0X0F)!=0X0F)
  {
    sccode=0xEF;
    while((sccode&0x01)!=0)
    {
      PC=sccode;
      if((PC&0X0F)!=0X0F)
        {
          recode=(PC&0X0F)|0XFF;
          return((~sccode)+(~recode));
        }
        else
        {
          sccode=(sccode<<1)|0x10;
        }
      }
    }
  }
  return(0);
*/


  a=0xF7;
  for(i=0;i<4;i++)      //读行
  {

    P6DIR |=0X0F;   //低四位输出
    P6DIR &=0X0F;   //高四位输入
    P6OUT =a;
    b=P6IN&0XF0;
    b=b>>4;
    if(b!=0x00)   //表示有键按下
    {
//      delay(200);   //软件延时   确认有键按下
      if(b!=0x00)
      {  
        c=b;
        if(c==1)
        {
          d=4-i;
        }
        else if(c==2)
        {
          d=8-i;
        }
        else if(c==4)
        {
          d=12-i;
        }
        else if(c==8)
        {
          d=16-i;
        }
      break;
      }
    }
    else
    {
      a=a>>1;
      if(a==0)
      {
        break;
      }
    }

  }
  d=d-1;
  return(d);
}

unsigned char ask_key()        //判断是否有键按下
{
    P6DIR |=0X0F;   //低四位输出
    P6DIR &=0X0F;   //高四位输入
    P6OUT &=0xf0;
    return(P6IN&0XF0);
}

uchar read_ac(void)   //读出地址计数器ac的值
{
  P4SEL &=(~(BIT1+BIT2+BIT3+BIT4));
  P4DIR =0XFF;//输出
  P3DIR =0X00;//输入
 
  P4OUT &=~rs;//rs=0
  P4OUT |=rw;//RW=1;
  P4OUT |=en;//en=1
  return(P3IN&0x7f);
}

void key_deal(uchar keydata)                //键值处理
{
    uchar acdata;   //当前游标地址变量
  acdata=read_ac();//读当前游标地址
  
  switch(keydata)   //keydata 为键值
  {
    case 0:   //第0个键按下
    {
//      xiu=0;    //不能修改 要set一下才能修改
//      wrd(0x30);
      break;
    }
    case 1:   //第1个键按下
    {
//      xiu=0;    //不能修改 要set一下才能修改
//      wrd(0x31);
      break;
    }
    case 2:   //第2个键按下
    {
//      xiu=0;    //不能修改 要set一下才能修改
//      wrd(0x32);
      break;
    }
    case 3:   //第3个键按下
    {
//      xiu=0;    //不能修改 要set一下才能修改
//      wrd(0x33);
      break;
    }
    case 4:   //第4个键按下
    {
//      xiu=0;    //不能修改 要set一下才能修改
//      wrd(0x34);
      break;
    }
    case 5:   //第5个键按下
    {
//      xiu=0;    //不能修改 要set一下才能修改
//      wrd(0x35);
      break;
    }
    case 6:   //第6个键按下
    {
//      xiu=0;    //不能修改 要set一下才能修改
//      wrd(0x36);
      break;
    }
    case 7:   //第7个键按下
    {
//      xiu=0;    //不能修改 要set一下才能修改
//      wrd(0x37);
      break;
    }
    case 8:   //第8个键按下
    {
//      xiu=0;    //不能修改 要set一下才能修改
//      wrd(0x38);
      break;
    }
    case 9:   //第9个键按下
    {
//      xiu=0;    //不能修改 要set一下才能修改
//      wrd(0x39);
      break;
    }
    case 10:   //第10个键按下 #define down  10
    {
//      xiu=0;    //不能修改 要set一下才能修改
    
      switch(page)
        {
          case 1://第一页
          {
              if(acdata<=7)   //在第一行
              {
                add(2,(acdata+1));
        //        wrc(acdata+0x90);
              }
              else if(acdata<=15)    //在第三行
              {
                add(4,(acdata-7));
        //        wrc(acdata+0x10);
              }
              else if(acdata<=23)    //在第二行
              {
                add(3,(acdata-15));
        //        wrc(acdata-0x08);
              }
              else if(acdata<=31)   //在第四行
              {
                add(1,(acdata-23));
        //        wrc(acdata-23+0x80);
              }
              break;
          }
          case 2://第二页
          {
            acdata=read_ac();
            if(acdata==16)
            {
              wrc(you_on);
              if(hour==0)
              {
                hour=24;
              }
              else
              {
                hour--;
              }

⌨️ 快捷键说明

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