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

📄 lcd1602.lst

📁 此程序实现
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.50   LCD1602                                                               01/13/2009 21:19:07 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE LCD1602
OBJECT MODULE PLACED IN lcd1602.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE lcd1602.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*
   2          ***************************************************************************
   3          *
   4          *                                       (C) Copyright 2007,单片机初学者园地
   5          *                          All Rights reserved.
   6          *
   7          *项目名称:    51单片机学习开发系统
   8          *                
   9          *本文件名称:LCD1602.c 
  10          *       
  11          * 完成作者 : 单片机初学者 http://blog.ednchina.com/ahai0306/  qq:464976346   
  12          * 当前版本 : V1.0        
  13          * 完成日期 : 2007年4月20日
  14          * 描    述 :  
  15          *                此程序实现,完成液晶部分,数码管显示,中断切换界面
  16          *            同时还进行发光管指示,和蜂鸣器的响声,是一个比较综合的 
  17          *            程序,在以后的项目设计中,此程序是一个比较不错的范例!  
  18          ****************************************************************************
  19          */
  20          
  21          
  22          #include <reg52.h>               //调用头文件(单片机内部的寄存器定义)
  23          #include<intrins.h>
  24          
  25          #define uchar unsigned char
  26          #define uint  unsigned int
  27          
  28          /******本段为硬件I/O口定义********/
  29          sbit    LED0   = P0 ^ 0;         //KEY和发光管复用,请将4个跳线插到KEY端
  30          sbit    LED1   = P0 ^ 1;
  31          sbit    LED2   = P0 ^ 2;
  32          sbit    LED3   = P0 ^ 3;
  33          sbit    DIG0   = P0 ^ 4;         //数码管位0
  34          sbit    DIG1   = P0 ^ 5;         //数码管位1
  35          
  36          sbit    BUZZ   = P3 ^ 3;         //蜂鸣器
  37          sbit LCD_RS = P3^7 ;             
  38          sbit LCD_RW = P3^6 ;
  39          sbit LCD_EN = P3^4 ;
  40          
  41          #define  LED_SEG    P1          //数码管
  42          #define  LCD_DATA   P2          //LCD
  43          //#define  LCD_BUSY   0x80      // 用于检测LCD的BUSY标识
  44          sbit DQ = P3^5 ;  //定义DS18B20端口DQ  
  45          
  46          bit presence  ;
  47          
  48           //数码管显示0~9,定义到代码段,和程序数据烧在FLASH中
  49          code unsigned  char DispBuf[10]= {0x3f,0x06,0x5b,0x4f,0x66,
  50                                                                            0x6d,0x7d,0x07,0x7f,0x6f};
  51          
  52          //函数声明
  53          void  disp_selec(unsigned  char bit_selec,unsigned  char  seg);
  54          
  55          
C51 COMPILER V7.50   LCD1602                                                               01/13/2009 21:19:07 PAGE 2   

  56          uchar code  cdis1[ ] = {"   DS18B20 OK   "} ;
  57          uchar code  cdis2[ ] = {"  TEMP:    .  C "} ;
  58          uchar code  cdis3[ ] = {"    welcom!     "} ;
  59          uchar code  cdis4[ ] = {" MCU-STUDY-BOARD"} ;
  60          
  61          unsigned char data  temp_data[2] = {0x00,0x00} ;
  62          unsigned char data  display[5] =   {0x00,0x00,0x00,0x00,0x00} ;
  63          unsigned char code  ditab[16] =    {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
  64                                              0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09} ;
  65          void beep(); 
  66          unsigned char code  mytab[8] = {0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00} ;
  67          
  68          #define delayNOP(); {_nop_() ;_nop_() ;_nop_() ;_nop_() ;} ;
  69          
  70          /**************************************************
  71          ** 函数名称: dellay
  72          ** 入口参数:h(unsigned int型)
  73          ** 出口参数:无
  74          ** 功能描述: 短暂延时,使用11.0592晶体,约0.01MS
  75          ****************************************************/
  76          void dellay(unsigned int  h)
  77          {
  78   1        while(h--);      //0.01MS
  79   1      }
  80          
  81          /*******************************************************************/
  82          void delay1(int ms)
  83          {
  84   1       unsigned char y ;
  85   1        while(ms--)
  86   1       {
  87   2        for(y = 0 ; y<250 ; y++)
  88   2        {
  89   3         _nop_() ;
  90   3         _nop_() ;
  91   3         _nop_() ;
  92   3         _nop_() ;
  93   3        }
  94   2       }
  95   1      }
  96          
  97          /******************************************************************/
  98          /*检查LCD忙状态                                                   */
  99          /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。   */
 100          /******************************************************************/ 
 101          bit lcd_busy()
 102           {                          
 103   1          bit result ;
 104   1          LCD_RS = 0 ;
 105   1          LCD_RW = 1 ;
 106   1          LCD_EN = 1 ;
 107   1          delayNOP() ;
 108   1          result = (bit)(LCD_DATA&0x80) ;
 109   1          LCD_EN = 0 ;
 110   1          return(result) ; 
 111   1       }
 112          
 113          /*写指令数据到LCD                                                  */
 114          /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。          */
 115          /*******************************************************************/
 116          void lcd_wcmd(uchar cmd)
 117          {                          
C51 COMPILER V7.50   LCD1602                                                               01/13/2009 21:19:07 PAGE 3   

 118   1         while(lcd_busy()) ;
 119   1          LCD_RS = 0 ;
 120   1          LCD_RW = 0 ;
 121   1          LCD_EN = 0 ;
 122   1          _nop_() ;
 123   1          _nop_() ; 
 124   1          LCD_DATA = cmd ;
 125   1          delayNOP() ;
 126   1          LCD_EN = 1 ;
 127   1          delayNOP() ;
 128   1          LCD_EN = 0 ;  
 129   1      }
 130          
 131          /*******************************************************************/
 132          /*写显示数据到LCD                            */
 133          /*RS=H,RW=L,E=高脉冲,D0-D7=数据。       */
 134          /*******************************************************************/
 135          void lcd_wdat(uchar dat)
 136          {                          
 137   1         while(lcd_busy()) ;
 138   1          LCD_RS = 1 ;
 139   1          LCD_RW = 0 ;
 140   1          LCD_EN = 0 ;
 141   1          LCD_DATA = dat ;
 142   1          delayNOP() ;
 143   1          LCD_EN = 1 ;
 144   1          delayNOP() ;
 145   1          LCD_EN = 0 ; 
 146   1      }
 147          
 148          
 149          /*  LCD初始化设定                                                  */
 150          /*******************************************************************/
 151          void lcd_init()
 152          { 
 153   1          delay1(15) ;   
 154   1          lcd_wcmd(0x01) ;      //清除LCD的显示内容            
 155   1          lcd_wcmd(0x38) ;      //16*2显示,5*7点阵,8位数据
 156   1          delay1(5) ;
 157   1          lcd_wcmd(0x38) ;         
 158   1          delay1(5) ;
 159   1          lcd_wcmd(0x38) ;         
 160   1          delay1(5) ;
 161   1      
 162   1          lcd_wcmd(0x0c) ;      //显示开,关光标
 163   1          delay1(5) ;
 164   1          lcd_wcmd(0x06) ;      //移动光标
 165   1          delay1(5) ;
 166   1          lcd_wcmd(0x01) ;      //清除LCD的显示内容
 167   1          delay1(5) ;
 168   1      }
 169          
 170          /*  设定显示位置                                    */
 171          /*******************************************************************/
 172          void lcd_pos(uchar pos)
 173          {                          
 174   1        lcd_wcmd(pos | 0x80) ;  //数据指针=80+地址变量
 175   1      }
 176          
 177          /*自定义字符写入CGRAM                                   */
 178          /*******************************************************************/
 179          void  writetab()  
C51 COMPILER V7.50   LCD1602                                                               01/13/2009 21:19:07 PAGE 4   

 180          {  
 181   1          unsigned char i ;
 182   1          lcd_wcmd(0x40) ;            //写CGRAM
 183   1          for (i = 0 ; i< 8 ; i++)       
 184   1          lcd_wdat(mytab[ i ]) ;        
 185   1      }
 186          
 187          /*us级延时函数                                        */
 188          /*******************************************************************/
 189          
 190          void Delay(unsigned int num)
 191          {
 192   1        while( --num ) ;
 193   1      }
 194          
 195          /*初始化ds1820                                      */
 196          /*******************************************************************/
 197          Init_DS18B20(void)
 198          {  
 199   1           DQ = 1 ;      //DQ复位
 200   1           Delay(8) ;    //稍做延时
 201   1      
 202   1           DQ = 0 ;      //单片机将DQ拉低
 203   1           Delay(90) ;   //精确延时 大于 480us
 204   1      
 205   1           DQ = 1 ;       //拉高总线
 206   1           Delay(8) ;
 207   1      
 208   1           presence = DQ ;    //如果=0则初始化成功 =1则初始化失败
 209   1           Delay(100) ;
 210   1           DQ = 1 ; 
 211   1           
 212   1           return(presence) ; //返回信号,0=presence,1= no presence
 213   1      }
 214          
 215          
 216          /* 读一个字节                     */
 217          /*******************************************************************/
 218           ReadOneChar(void)
 219          {
 220   1      unsigned char i = 0 ;
 221   1      unsigned char dat = 0 ;
 222   1      
 223   1      for (i = 8 ; i > 0 ; i--)
 224   1        {
 225   2          DQ = 0 ; // 给脉冲信号
 226   2          dat >>= 1 ;

⌨️ 快捷键说明

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