專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

LCD12232串行顯示C51程序

作者:佚名   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時間:2012年04月18日   【字體:
原本想把這個案子介紹給一個朋友的,也許太忙了,連回個信息的時間都沒有;
沒辦法,就這樣試著寫下去;
這個程序包含三個方面的知識:
1。4*4按鍵的部份--完成(0~9)數(shù)字鍵,功能鍵,字母鍵的輸入;按鍵抬起后才能作用;
2。LCD12232的顯示部份;串行顯示,只用兩根線,顯示中英文字母及數(shù)字;
3。TTL系列芯片與CMOS系列芯片的知識,及做庫;這部份還沒完成;
我想第三步完成了,MM還符合一名合格的大學(xué)畢業(yè)生的;
哈!直接上代碼了,下載地址:http://www.torrancerestoration.com/f/12232ch.rar
#include <reg52.h>
 #define uint unsigned int
 #define uchar unsigned char
 sbit SID = P0^5 ;
 sbit SCK = P0^6 ;
 sbit BUZ = P0^7;
 
 sbit A0 = P3^0;
 sbit A1 = P3^1;
 sbit A2 = P3^2;
 sbit A3 = P3^3;
 sbit A4 = P3^4;
 sbit A5 = P3^5;
 sbit B0 = P0^0;
 sbit B7 = P1^7;
 sbit B6 = P1^6;
 sbit B5 = P1^5;
 sbit B4 = P1^4;
 sbit B3 = P1^3;
 sbit B2 = P1^2;
 uchar Key_Select,Key_Mode;
 uchar code Disp_1[]={"浙江師范大學(xué)行"};
 uchar code Disp_2[]={"知學(xué)院電子信息"};
 uchar code Disp_3[]={"工程08級毛夢超"};
 uchar code Disp_4[]={"的畢業(yè)設(shè)計(jì)--集"}; 
 uchar code Disp_5[]={"成電路測試系統(tǒng)!"};
 uchar code Disp_6[]={"指導(dǎo)老師:丁宇"}; 
 uchar code Disp_7[]={"請插入芯片后按"};
 uchar code Disp_8[]={"確認(rèn)鍵進(jìn)行測試!"};
 uchar code Disp_9[]={"請選擇芯片類型:"};
 uchar code Disp_10[]={"1-CMOS; 2-TTL;"};
 uchar code Disp_11[]={"請輸入CMOS系列"};
 uchar code Disp_12[]={"請輸入TTL 系列"};
 uchar code Disp_13[]={"IC型號:"};
//-----------------Delay_*2us-------------------
 void Delay_us(uchar x2us)
 {
  while(--x2us);
 }
 
 void Delay_ms(uint xms)
 {
   uint i,j;
   for(i=xms;i>0;i--)
   for(j=122;j>0;j--)
   {}
 }
//-------------4KHz------------------- 
 void Buz(void)
 {
  uint i;
  for(i=200;i>0;i--)
  {
   BUZ=1;
   Delay_us(120);
   BUZ=0;
  }
  BUZ=0;
 }
//-------------LCD Part-------------------- 
//LCD顯示部份之寫地址
//-----------------------------------------
 void Lcd_Wr_Command(uchar com_data)
 {
  uchar i;
  uchar i_data;
  i_data=0xf8;
  SCK=0;
  for(i=0;i<8;i++)
  {
    SID=(bit)(i_data&0x80);
   SCK=0;
   SCK=1;
   i_data=i_data<<1;
  }
  i_data=com_data;
  i_data&=0xf0;
  for(i=0;i<8;i++)
  {
   SID=(bit)(i_data&0x80);
   SCK=0;
   SCK=1;
   i_data=i_data<<1;
  }
   i_data=com_data;
   i_data<<=4;
   for(i=0;i<8;i++)
   {
    SID=(bit)(i_data&0x80);
   SCK=0;
   SCK=1;
   i_data=i_data<<1;
   }
   Delay_ms(1);
 }
//-------------LCD Part-------------------- 
//LCD顯示部份之寫數(shù)據(jù)
//-----------------------------------------
 void Lcd_Wr_Data(uchar com_data)
 {
  uchar i;
  uchar i_data;
  i_data=0xfa;
  
  for(i=0;i<8;i++)
  {
    SID=(bit)(i_data&0x80);
   SCK=0;
   SCK=1;
   i_data=i_data<<1;
  }
  i_data=com_data;
  i_data&=0xf0;
  for(i=0;i<8;i++)
  {
   SID=(bit)(i_data&0x80);
   SCK=0;
   SCK=1;
   i_data=i_data<<1;
  }
   i_data=com_data;
   i_data<<=4;
   for(i=0;i<8;i++)
   {
    SID=(bit)(i_data&0x80);
   SCK=0;
   SCK=1;
   i_data=i_data<<1;
   }
   Delay_ms(1);
 }
//-------------LCD Part-------------------- 
//LCD顯示部份之初始化
//-----------------------------------------
 void Lcd_init()
 {
  Delay_ms(100);
  Lcd_Wr_Command(0x30);
  Delay_ms(5);
  Lcd_Wr_Command(0x02);
  Delay_ms(5);
  Lcd_Wr_Command(0x06);
  Delay_ms(5);
  Lcd_Wr_Command(0x0c);
  Delay_ms(5);
  Lcd_Wr_Command(0x01);
  Delay_ms(5);
  //Lcd_Wr_Command(0x80);
 }
 void Posit(uchar x,uchar y,uchar *String)
 {
  uchar Posit,Addr;
  if(y==1)
  Addr=0x80;
  if(y==2)
  Addr=0x90;
  Posit=Addr+x;
  Lcd_Wr_Command(Posit);
  while(*String!='\0')
  {
   Lcd_Wr_Data(*String++);
   Delay_ms(250);
  } 
 
 }
//-------------------------------------------------
//4*4鍵盤掃描部份;按鍵釋放后才返回鍵值
//------------------Key_Scan-----------------------
 uchar s_scan(void)
 {
  
  P2=0xf0;
  if((P2&0xf0)!=0xf0)
  {
   P2=0xf0;
   Delay_ms(30);
   if((P2&0xf0)!=0xf0)
   { 
     P2=0xfe ;  //第一列開始,逐行掃描
    if((P2&0xf0)!=0xf0)
    {
     P2&=0xf0;
     if(P2==0xe0)
     {Buz();while(!(P2==0xf0));return(16);}    //取消鍵
     if(P2==0xd0)
     {Buz();while(!(P2==0xf0));return(15);}    //確認(rèn)鍵`
     if(P2==0xb0)
     {Buz();while(!(P2==0xf0));return(14);}    //選擇鍵
     if(P2==0x70)
     {Buz();while(!(P2==0xf0));return(13);}    //測試鍵
    }
      P2=0xfd; //第二列開始,逐行掃描
    if((P2&0xf0)!=0xf0)
    {
     P2&=0xf0;
     if(P2==0xe0)
     {Buz();while(!(P2==0xf0));return(12);}    //“LS”字母輸入鍵
     if(P2==0xd0)
     {Buz();while(!(P2==0xf0));return(11);}    //“CD”字母輸入鍵
     if(P2==0xb0)
     {Buz();while(!(P2==0xf0));return(10);}    //“0”鍵
     if(P2==0x70)
     {Buz();while(!(P2==0xf0));return(9);}    //“9”鍵
    }
     P2=0xfb;    //第三列開始,逐行掃描
    if((P2&0xf0)!=0xf0)
    {
     P2&=0xf0;
     if(P2==0xe0)
     {Buz();while(!(P2==0xf0));return(8);}   //“8”鍵
     if(P2==0xd0)
     {Buz();while(!(P2==0xf0));return(7);}   //“7”鍵
     if(P2==0xb0)
     {Buz();while(!(P2==0xf0));return(6);}   //“6”鍵
     if(P2==0x70)
     {Buz();while(!(P2==0xf0));return(5);}   //“5”鍵
    }  
      P2=0xf7; //第四列開始,逐行掃描
    if((P2&0xf0)!=0xf0)
    {
     P2&=0xf0;
     if(P2==0xe0)
     {Buz();while(!(P2==0xf0));return(4);}  //“4”鍵
     if(P2==0xd0)
     {Buz();while(!(P2==0xf0));return(3);}  //“3”鍵
     if(P2==0xb0)
     {Buz();while(!(P2==0xf0));return(2);}  //“2”鍵
     if(P2==0x70)
     {Buz();while(!(P2==0xf0));return(1);}  //“1”鍵
    }
   }
  }
  return 0;
 }
//------------------main part-----------------
//主函數(shù)部份
//-----------------------------------------
 void main()
 {
  uchar key_code;
  Lcd_init();
//-------------------------------
//浙江師范大學(xué)行知學(xué)院電子信息
//------------------------------- 
  Posit(0,1,Disp_1);
  Posit(0,2,Disp_2);
  Delay_ms(1000);
  Lcd_Wr_Command(0x01);
  Delay_ms(5);
  Lcd_Wr_Command(0x02);
  Delay_ms(5);
//-------------------------------
//工程08級毛夢超的畢業(yè)設(shè)計(jì)-集
//-------------------------------
  Posit(0,1,Disp_3);
  Posit(0,2,Disp_4);
  Delay_ms(1000);
//-------------------------------
  Lcd_Wr_Command(0x01);
  Delay_ms(5);
  Lcd_Wr_Command(0x02);
  Delay_ms(5);
//-------------------------------
//成電路測試系統(tǒng)!指導(dǎo)老師:丁宇
//-------------------------------
  Posit(0,1,Disp_5);
  Posit(0,2,Disp_6);
  Delay_ms(5000);
//-------------------------------
  Lcd_Wr_Command(0x01);
  Delay_ms(5);
  Lcd_Wr_Command(0x02);
  Delay_ms(5);
//-------------------------------
//請插入芯片后按確認(rèn)進(jìn)行測試!
//-------------------------------
  Posit(0,1,Disp_7);
  Posit(0,2,Disp_8);
  Delay_ms(100);
  while(1)
  {
   key_code=s_scan();
//------------------------------------------------------
//鍵值處理程序,包含數(shù)字輸入鍵和字母輸入鍵以及功能鍵操作
//------------------------------------------------------
   switch(key_code)
   {
    case 1:
      {
       Lcd_Wr_Data('1');
       Delay_ms(300);
      }break;
    case 2:
      {
       Lcd_Wr_Data('2');
       Delay_ms(300);
      }break;
    case 3:
      {
       Lcd_Wr_Data('3');
         Delay_ms(300);
      }break;
    case 4:
      {
       Lcd_Wr_Data('4');
       Delay_ms(300);
      }break;
    case 5:
      {
       Lcd_Wr_Data('5');
       Delay_ms(300);
      }break;
    case 6:
      {
       Lcd_Wr_Data('6');
       Delay_ms(300);
      }break;
    case 7:
      {
       Lcd_Wr_Data('7');
       Delay_ms(300);
      }break;
    case 8:
      {
       Lcd_Wr_Data('8');
       Delay_ms(300);
      }break;
    case 9:
      {
       Lcd_Wr_Data('9');
       Delay_ms(300);
      }break;
    case 10:
      {
       Lcd_Wr_Data('0');
       Delay_ms(300);
      }break;
    case 11:
      {
       Posit(5,2,"CD");
       Delay_ms(300);
      }break;
    case 12:
      { 
       Posit(5,2,"LS");
       Delay_ms(300);
      }break;
    case 13:
      {
       P3=0x00;
       if(Key_Select==1)  //CMOS芯片型號CD4053
       {
       
       }
       if(Key_Select==2)  //TTL 芯片型號74LS00
       {
          P3=0x00;
        P1=0x00;
        B4=0x00;
 
        B6=0;B7=0;
        B3=0;B4=0;
         if((A0&0x01)&&(A3&0x01)&&(B0&0x01)&&(B5&0x01))
          {
         Buz();
         Buz();Delay_ms(500);
         Lcd_Wr_Command(0x01);
         Posit(0,1,"測試結(jié)果:");
         Posit(4,2,"OK!");
         Buz();Delay_ms(100);
         Buz();Delay_ms(300);
         Buz();Delay_ms(500);
         Buz();Delay_ms(800);
         Buz();Delay_ms(1000);
         Buz();Delay_ms(800);
         Buz();Delay_ms(500);
         Buz();Delay_ms(300);
         Buz();Delay_ms(100);
        }
        else
        {
         Buz();
         Lcd_Wr_Command(0x01);
         Posit(0,1,"測試結(jié)果:");
         Posit(4,2,"FAIL!");
         while(Key_Select)
         {
          Buz();
         }
        }
       }
       Delay_ms(300);
      } break;
    case 14: //選擇鍵
      {
       Key_Select++;
       if(Key_Select==1)
       {
        Lcd_Wr_Command(0x0f);
        Lcd_Wr_Command(0x90); 
       }
       if(Key_Select==2)
       {
        Lcd_Wr_Command(0x0f);
        Lcd_Wr_Command(0x94); 
       }
       if(Key_Select==3)
       {
        Lcd_Wr_Command(0x0c);
        Key_Select=0; 
       }
       Delay_ms(300);
      }break;
    case 15: //確認(rèn)鍵
      {
       Key_Mode++;
       if(Key_Mode==3)
       {
        Key_Mode=0;
        Key_Select=0;
        Lcd_Wr_Command(0x0c);
        Lcd_Wr_Command(0x01);
        Lcd_Wr_Command(0x02);
        Posit(0,1,Disp_7);
        Posit(0,2,Disp_8); 
       }
       if(Key_Mode==1)
       {
        Lcd_Wr_Command(0x01);
        Posit(0,1,Disp_9);
        Posit(0,2,Disp_10);
       }
       if(Key_Mode==2)
       {
         if(Key_Select==1)
         {
          Lcd_Wr_Command(0x01);
        Lcd_Wr_Command(0x02);
          Posit(0,1,Disp_11);
        Posit(0,2,Disp_13);
        //Lcd_Wr_Command(0x95); 
         }
         if(Key_Select==2)
          {
          Lcd_Wr_Command(0x01);
        Lcd_Wr_Command(0x02);
          Posit(0,1,Disp_12);
        Posit(0,2,Disp_13);
        //Lcd_Wr_Command(0x95); 
         }
       }
       Delay_ms(300);
      }break;
    case 16: //取消鍵
      {
       if(Key_Select==1)
       {
        Lcd_Wr_Command(0x0c);
        Lcd_Wr_Command(0x01);
        Lcd_Wr_Command(0x02);
        Lcd_Wr_Command(0x0f);
        Posit(0,1,Disp_11);
        Posit(0,2,Disp_13);
        //Lcd_Wr_Command(0x95);
       }
       if(Key_Select==2)
       {
        Lcd_Wr_Command(0x0c);
        Lcd_Wr_Command(0x01);
        Lcd_Wr_Command(0x02);
        Lcd_Wr_Command(0x0f);
        Posit(0,1,Disp_12);
        Posit(0,2,Disp_13);
        //Lcd_Wr_Command(0x95);
       }
       Delay_ms(300);
      }break;
    default:P0=0xff;
   }  
    }
 }
關(guān)閉窗口

相關(guān)文章