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

📄 lcd1602.h

📁 等精度频率计 利用51单片机实现 有源码以及执行文件
💻 H
字号:
#ifndef __LCD_1602_H__
#define __LCD_1602_H__


#define uchar unsigned char
#define uint unsigned int

/*LCD1602接口定义*/
uchar xdata M51_LCD1602_CW _at_ 0xfceb;
uchar xdata M51_LCD1602_CR _at_ 0xfeeb;
uchar xdata M51_LCD1602_DW _at_ 0xfdeb; 
uchar xdata M51_LCD1602_DR _at_ 0xffeb;

//以下常数定义来自LCD数据手册  
#define LCD_LINE_1        0x00
#define LCD_LINE_2        0x40
#define LCD_LINE_3        0x14
#define LCD_LINE_4        0x54

#define LCD_ClEAR_SCREEN  0x01    //清屏
#define LCD_HOMING        0x02    //光标返回原点  
#define LCD_AC_UP         0x06    //地址计数器自动+1
#define LCD_AC_DOWN       0x04    //地址计数器自动-1,default
#define LCD_MOVE          0x05    //画面可平移  
#define LCD_NO_MOVE       0x04    //画面不可平移,default
#define LCD_SHOW          0x0c    //显示开
#define LCD_HIDE          0x08    //显示关        
#define LCD_CURSOR_NO_FLASH 0x0e  //显示光标不闪烁
#define LCD_CURSOR_FLASH  0x0f    //显示光标不闪烁
#define LCD_NO_CURSOR     0x0c    //无光标        
#define LCD_PIC_MOVE      0x18    //画面平移一个字符  
#define LCD_CURSOR_MOVE   0x10    //光标平移一个字符  
#define LCD_RIGHT_MOVE    0x14    //右移
#define LCD_lEFT_MOVE     0x10    //左移        
#define LCD_SET_7         0x38    //8位接口,双行显示,5*7字符  
#define LCD_SET_10        0x3c    //8位接口,双行显示,5*10字符  

//LCD1602_CW等在Mini51BH中定义
#define LCD_CW M51_LCD1602_CW     //定义液晶的写命令地址
#define LCD_CR M51_LCD1602_CR     //定义液晶的判断忙标志位
#define LCD_DW M51_LCD1602_DW     //单片机向LCD写数据
#define LCD_DR M51_LCD1602_DR     //读数据 一般情况用的很少

#define LCD_CGRAM_ADDR(addr) (0x40|addr)
#define LCD_DDRAM_ADDR(addr) (0x80|addr)



//LCD状态检测,根据最高位判断LCD是否忙
void loop_lcd1602_is_busy(void)
{
   uchar temp=0;
   while((bit)(LCD_CR & 0x80))  //读数据口的最高位,判断液晶是否忙 
     if(temp++>10) break;		//超时跳出
}


//LCD初始化
void lcd1602_init(void)
{
  loop_lcd1602_is_busy();   //同上
  LCD_CW = LCD_SET_7;   
  loop_lcd1602_is_busy();   //同上
  LCD_CW = LCD_SHOW;
  loop_lcd1602_is_busy();    //同上
  LCD_CW = LCD_AC_UP; 
}


void lcd_goto_xy(uchar x,uchar y)
{
   loop_lcd1602_is_busy();
   switch(y)
   {
     case 1:      
       LCD_CW = LCD_DDRAM_ADDR(LCD_LINE_1+x-1);//定位从那个位置开始显示
       break;
     case 2:
       LCD_CW = LCD_DDRAM_ADDR(LCD_LINE_2+x-1);//定位从那个位置开始显示
       break;
     case  3: 
       LCD_CW = LCD_DDRAM_ADDR(LCD_LINE_3+x-1);//定位从那个位置开始显示
       break;
     case 4:
       LCD_CW = LCD_DDRAM_ADDR(LCD_LINE_4+x-1);//定位从那个位置开始显示
       break;
     default:
       break;
   }  
}


//带定位参数的字符写函数  
void lcd_put_xys(uchar x,uchar y,uchar *str)
{     
  lcd_goto_xy(x,y);
  while(*str)
  {
    loop_lcd1602_is_busy();
    LCD_DW = *str;
    str++;
  }
}

#endif

⌨️ 快捷键说明

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