×
单片机 > 单片机程序设计 > 详情

LCD12232串行显示C51程序

发布时间:2020-06-06 发布时间:
|

这个程序包含三个方面的知识:
1。4*4按键的部份--完成(0~9)数字键,功能键,字母键的输入;按键抬起后才能作用;
2。LCD12232的显示部份;串行显示,只用两根线,显示中英文字母及数字;
3。TTL系列芯片与CMOS系列芯片的知识,及做库;这部份还没完成;
我想第三步完成了,MM还符合一名合格的大学毕业生的;
哈!直接上代码了,下载地址:http://www.51hei.com/f/12232ch.rar
#include
 #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[]={"浙江师范大学行"};
 uchar code Disp_2[]={"知学院电子信息"};
 uchar code Disp_3[]={"工程08级毛梦超"};
 uchar code Disp_4[]={"的毕业设计--集"}; 
 uchar code Disp_5[]={"成电路测试系统!"};
 uchar code Disp_6[]={"指导老师:丁宇"}; 
 uchar code Disp_7[]={"请插入芯片后按"};
 uchar code Disp_8[]={"确认键进行测试!"};
 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显示部份之写数据
//-----------------------------------------
 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!='')
  {
   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);}    //确认键`
     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;
 }[page]
//------------------main part-----------------
//主函数部份
//-----------------------------------------
 void main()
 {
  uchar key_code;
  Lcd_init();
//-------------------------------
//浙江师范大学行知学院电子信息
//------------------------------- 
  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级毛梦超的毕业设计-集
//-------------------------------
  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);
//-------------------------------
//成电路测试系统!指导老师:丁宇
//-------------------------------
  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);
//-------------------------------
//请插入芯片后按确认进行测试!
//-------------------------------
  Posit(0,1,Disp_7);
  Posit(0,2,Disp_8);
  Delay_ms(100);
  while(1)
  {
   key_code=s_scan();
//------------------------------------------------------
//键值处理程序,包含数字输入键和字母输入键以及功能键操作
//------------------------------------------------------
   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,"测试结果:");
         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,"测试结果:");
         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: //确认键
      {
       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;
   }  
    }
 }


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
如何为单片机选择合适的负载电容