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

📄 11.c

📁 lcd1602编程资料。包括8位和4位口的c语言程序。当单片机口不够时可用4位接法
💻 C
字号:
/*******************************************************************
 *                                                                  
 * ME500单片机开发系统演示程序 - LCD1602    4位数据线控制方式                
 *                                                                  
 * LCD1602显示                                                      
 *                                                                  
 * 邮箱:  gguoqing@willar.com                                       
 * 网站: http://www.willar.com ;                                    
 * 作者: gguoqing                                                  
 * 时间: 2007/01/03                                                
 *                                                                  
 *【版权】Copyright(C)伟纳电子 www.willar.com  All Rights Reserved  
 *【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!        
 *                                                                  
 ********************************************************************
 *                                                                  
 * 描述:                                                           
 *    LCD1602可以分为8位和4位控制方式,8位控制方式是用D0-D7数据线   
 * 来传送控制命令及数据。4位控制方式是用D4-D7数据线来传送控制命令   
 * 及数据。使用4位数据线做控制时,需要分两次来传送,先送出高4位数   
 * 据,再送出低4位数据。可以节省单片机的4根端口线。                 
 *                                                                  
 *******************************************************************/
 #include < reg51.h >
 #include < intrins.h >
 #define uchar unsigned char
 #define uint  unsigned int

 #pragma src
 sbit  LCD_RS = P2^1;             
 sbit  LCD_RW = P2^2;
 sbit  LCD_EN = P2^0;
 
 uchar code  cdis1[ ] = {"   WELCOME TO   "}; 
 uchar code  cdis2[ ] = {" WWW.WILLAR.COM "};
 /**********************************************************
 * 5us 延时子程序
 **********************************************************/
 void  delayNOP()
 {
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
 }
 /**********************************************************
 * 延时子程序
 **********************************************************/
 void delay(uint ms) 
 {
    uchar t;
    while(ms--)
    { 
      for(t = 0; t < 120; t++);
    }
 }
 
 /**********************************************************
 * 检查LCD忙状态                                           
 * lcd_busy为1时,忙,等待。                               
 * lcd-busy为0时, 闲,可写指令与数据                        
 **********************************************************/ 
 bit lcd_busy()
  {                          
     bit result;
     LCD_RS = 0;
     LCD_RW = 1;
     LCD_EN = 1;
     delayNOP();
     result = (bit)(P0&0x80);
     LCD_EN = 0;
     return(result); 
  }
 /*********************************************************      
 * 写指令或数据
 * start=0, 写入命令;  start=1, 写入数据
 *********************************************************/
 void lcd_write(bit start, uchar in_data) 
 {
     uchar Hdata,Ldata;
     while(lcd_busy());
     Hdata=in_data&0xf0;             //取高四位
     Ldata=(in_data<<4)&0xf0;    //取低四位
     if(start==0) 
     LCD_RS = 0;                //写入命令
     else
     LCD_RS = 1;                 //写入数据

     LCD_RW = 0;

     LCD_EN = 0;
     delayNOP();
     P0 = Hdata;                 //发送高四位   
     LCD_EN = 1;
     delayNOP();
     LCD_EN = 0;

     delayNOP();
     P0 = Ldata;                 //发送低四位      
     LCD_EN = 1;
     delayNOP();
     LCD_EN = 0;
     delayNOP();
 }
 /*************************************************************
 *  LCD初始化设定                                             
 *************************************************************/
 void lcd_init()
 {
     delay(15);
     lcd_write(0,0x28);                //16*2显示,5*7点阵,4位数据
/*     delay(5);
     lcd_write(0,0x28);
     delay(5);
     lcd_write(0,0x28);
 */    delay(5);
     lcd_write(0,0x0c);               //显示开,关光标
     delay(5);
     lcd_write(0,0x06);              //移动光标
     delay(5);
     lcd_write(0,0x01);              //清除LCD的显示内容
     delay(25);                          //延时
 }
 /**********************************************************
 *  设定显示位置                                             
                                                         
 **********************************************************/
 void lcd_pos(uchar pos)
 {                          
    lcd_write(0,pos|0x80);     //数据指针=80+地址变量
 }
 /**********************************************************
 * 主函数
 **********************************************************/
 void  main()
 {
     uchar m;															  
	 #pragma asm 
	 
	   mov r2 #0x01
	 
	 #pragma endasm


	 
    
     
     lcd_init();                          //LCD1602初始化
  
     lcd_pos(0x00);                 //设置显示位置为第一行
     for(m=0;m<16;m++)
     lcd_write(1,cdis1[m]);
 
      lcd_pos(0x40);                //设置显示位置为第二行     
      for(m=0;m<16;m++)  
      lcd_write(1,cdis2[m]);
       while(1);
 }
 /*********************************************************/  
 

⌨️ 快捷键说明

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