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

📄 lyd.c.c

📁 基于测距式的超声波测距仪
💻 C
字号:
   
            /*===========================================================================
            
                                    KS0070(44780) 16x2 字符液晶屏驱动演示程序总线方式         晓奇
            =============================================================================
            连接线图:       LCM-------51    LCM-------51    LCM--------51
                            DB0-----P0.0    DB4-----P0.4    RW-------P2.0
                           DB1-----P0.1    DB5-----P0.5    RC-------P2.1
                            DB2-----P0.2    DB6-----P0.6    E--------P2.7 =>74ls00+wr+rd
                          DB3-----P0.3    DB7-----P0.7    VLCD接1K2电阻到GND
           
            [注]:AT89C51的晶振频率为12MHz
            ============================================================================*/
            //#pragma src                                                           // 产生汇编文件
           #include <reg51.h>
           #include<intrins.h>
           
           //========= 变量类型标识的宏定义,大家都喜欢这么做 ==============
            #define Uchar unsigned char
            #define Uint unsigned int
           
            // ================= LCM1602A端口地址定义 =======================
            char xdata Lcd1602CmdPort _at_ 0x8cff;          //E=1 RS=0 RW=0
            char xdata Lcd1602WdataPort _at_ 0x8dff;        //E =1 RS=1 RW=0
           char xdata Lcd1602StatusPort _at_ 0x8eff;       //CS=1 RS=0 RW=1
           
            #define Busy    0x80                                            // 忙判别位
            
            
            code char exampl[]="For an example.     - By xiaoqi\n";
           
            void Delay400Ms(void);
            void Delay5Ms(void);
            void LcdWriteData( char dataW );
            void LcdWriteCommand( Uchar CMD,Uchar AttribC );
           void LcdReset( void );
            void Display( Uchar dd );
           void DispOneChar(Uchar x,Uchar y,Uchar Wdata);
            void ePutstr(Uchar x,Uchar y, Uchar code *ptr);
            
            //================ 随便写几句测试主程序 ================
           void main(void)
           {
               Uchar temp;
                
                Delay400Ms();                   // 启动时必须的延时,等待lcm进入工作状态
        
                LcdReset();                     // 这也是必需的....初始化
                temp = 32;
                ePutstr(0,0,exampl);            // 上面一行显示一个预定字符串
        
                Delay400Ms();                   // 保留显示内容
                Delay400Ms();
                Delay400Ms();
                Delay400Ms();
                Delay400Ms();
                Delay400Ms();
                Delay400Ms();
                Delay400Ms();
        
               while(1)
                {
                        temp &= 0x7f;            // 只显示ASCII字符
        
                        if (temp<32)temp=32;    // 屏蔽控制字符,不予显示
                        Display( temp++ );
                        
                        Delay400Ms();
                }
        }
            
            /*=======================================================
             显示字符串
            =======================================================*/
           void ePutstr(Uchar x,Uchar y, Uchar code *ptr) {
           Uchar i,l=0;
                while (ptr[l] >31){l++;};
                for (i=0;i<l;i++) {
                        DispOneChar(x++,y,ptr[i]);
                        if ( x == 16 ){
                                x = 0; y ^= 1;
                        }
                }
        }
           
            /*=======================================================
            演示一行连续字符串,配合上位程序演示移动字串
            =======================================================*/
          void Display( Uchar dd ) {
        
        Uchar i;
                
                for (i=0;i<16;i++) {
        
                        DispOneChar(i,1,dd++);
                        
                        dd &= 0x7f;
                        if (dd<32) dd=32;
                }
        }
           
          /*=======================================================
            显示光标定位
           =======================================================*/
          void LocateXY( char posx,char posy) {
       
       Uchar temp;
      
               temp = posx & 0xf;
               posy &= 0x1;
               if ( posy )temp |= 0x40;
               temp |= 0x80;
               LcdWriteCommand(temp,0);        //??????
       }
           
          /*=======================================================
            按指定位置显示数出一个字符
                                                         

          =======================================================*/
         void DispOneChar(Uchar x,Uchar y,Uchar Wdata) {
       
               LocateXY( x, y );                               // 定位显示地址
               LcdWriteData( Wdata );                  // 写字符
      }
           
           /*=======================================================
           初始化程序, 必须按照产品资料介绍的初始化过程进行
          =======================================================*/
          void LcdReset( void ) {
      
              LcdWriteCommand( 0x38, 0);                      // 显示模式设置(不检测忙信号)
                       Delay5Ms();
               LcdWriteCommand( 0x38, 0);                      // 共三次
                       Delay5Ms();
               LcdWriteCommand( 0x38, 0);
                       Delay5Ms();
       
              LcdWriteCommand( 0x38, 1);                      // 显示模式设置(以后均检测忙信号)
           LcdWriteCommand( 0x08, 1);                  // 显示关闭
               LcdWriteCommand( 0x01, 1);                      // 显示清屏
               LcdWriteCommand( 0x06, 1);                      // 显示光标移动设置
               LcdWriteCommand( 0x0c, 1);                      // 显示开及光标设置
       }
           
          /*=======================================================
           写控制字符子程序: E=1 RS=0 RW=0
           =======================================================*/
           void LcdWriteCommand( Uchar CMD,Uchar AttribC ) {
      
               if (AttribC) while( Lcd1602StatusPort & Busy );         // 检测忙信号?
               Lcd1602CmdPort = CMD;
       }
                  
           /*=======================================================
           当前位置写字符子程序: E =1 RS=1 RW=0
           =======================================================*/
           void LcdWriteData( char dataW ) {
      
               while( Lcd1602StatusPort & Busy );                                      // 检测忙信号
               Lcd1602WdataPort = dataW;
       }
           
           // 短延时
           void Delay5Ms(void)
           {
               Uint i = 5552;
               while(i--);
       }
          
           //长延时
           void Delay400Ms(void)
           {
               Uchar i = 5;
               Uint j;
               while(i--)
               {
                       j=7269;
                       while(j--);
               };
      } 


     

⌨️ 快捷键说明

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