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

📄 1602driver.lst

📁 有人认为液晶不能显示
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V7.06   1602DRIVER                                                            09/25/2008 20:34:56 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE 1602DRIVER
OBJECT MODULE PLACED IN 1602driver.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 1602driver.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          
   2          /****************************************/////////////////////////////
   3          /*文件名称:1602driver
   4           *文件标识:
   5           *摘    要:LCD 1602 驱动程序,显示内容:数字,英文字符,ascii码符号,
   6           *                      内设有几个子函数  1.显示位置的控制,根据 line ,row 的值设定,随意开始显示的位置
   7                                                                    2.显示字符子函数,调用函数,(“要显示的字符”)
   8                                                                    3.显示数值子函数,调用该函数(整数部分的数值,小数部分的数值)
   9                                                                    4.显示数值+字符的子函数 调用函数 ((“要显示的字符”,整数,小数,“单位”)
  10           *作    者:陈军
  11           *完成日期:20080923
  12           *
  13           *
  14          *///////////////////////////////////////***************************************/
  15          
  16          #include <reg52.h>
  17          
  18                                                                                                          //各功能设定时候的指令码如下:
  19          const unsigned char CLEAR_SCREEN  = 0X01;
  20          const unsigned char CURSOR_RETURN = 0X02;
  21          const unsigned char MODE_SET      = 0X06;       // 完成一个字码传送后,AC自动加1,显示不发生位移
  22          const unsigned char DISPLAY_ON    = 0X0C;               // 开显示,光标不显示,光标所在位置的字符不闪烁
  23          const unsigned char CURSOR_DISPLAY_SHIFT = 0X14;//光标向右移,显示不动,AC自动加1
  24          const unsigned char FUNCTION_SET  = 0X38;               //数据接口宽度为8位,两行显示,5*8点阵字符
  25          const unsigned char CGRAM_ADD_INI = 0X40;               //CGRAM 初始地址设为000000,    
  26          const unsigned char DDRAM_ADD_INI_1 = 0X80;             //DDRAM 初始地址设为000000
  27          const unsigned char DDRAM_ADD_INI_2 = 0XC0;
  28          
  29          const bit E_READ        = 1;                                            // E=1,读
  30          
  31          const bit RS_INST       = 0;                                            //RS=0,DB7~0,数据操作指向指令寄存器
  32          const bit RS_DATA       = 1;                                            //RS=1,DB7~0,数据操作指向数据寄存器
  33          
  34          const bit RW_READ       = 1;                                            //此时进行访问的为,读操作
  35          const bit RW_WRITE      = 0;                                            //此时进行访问的为,写操作 
  36          
  37          
  38          //端口定义
  39          // P07~P00 对应的为LCD数据窗口的DB7~DB0
  40          sbit    RS = P2^0;                                              //指向指令、数据寄存器的mcu控制端口
  41          sbit    RW = P2^1;                                                              //读写操作控制由 mcu P2^1端口提供
  42          sbit    E  = P2^2;                                                              //读写控制使能信号,由P2^3控制
  43          sbit    BF = P0^7;      
  44          
  45          unsigned char code num_dis_code[10]="0123456789";
  46          unsigned char *p_number = &num_dis_code[0]; 
  47          
  48          unsigned char code self_definition_char[] = {
  49          
  50                  0x06,0x02,0x0a,0x11,0x08,0x12,0x0d,0x00,        //"公"代码
  51                  0x0e,0x00,0x1f,0x0a,0x0a,0x0a,0x13,0x00,    //"元"代码
  52              0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x00,    //"年"代码
  53              0x0f,0x09,0x0f,0x09,0x0f,0x09,0x11,0x00,    //"月"代码
  54              0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00,    //"日"代码
  55              0x00,0x1F,0x15,0x15,0x1B,0x11,0x1F,0x00,    //"四"代码
C51 COMPILER V7.06   1602DRIVER                                                            09/25/2008 20:34:56 PAGE 2   

  56              0x1F,0x04,0x04,0x1E,0x0A,0x12,0x1F,0x00,    //"五"代码
  57              0x08,0x04,0x1F,0x00,0x0A,0x11,0x00,0x00,    //"六"代码
  58              0x00,0x10,0x08,0x04,0x02,0x01,0x00,0x00,    //"\"代码
  59          
  60              0x01,0x02,0x05,0x02,0x06,0x02,0x02,0x02,    //自定义字符
  61              0x04,0x0A,0x1F,0x04,0x1F,0x0E,0x15,0x0C,    //自定义字符
  62              0x01,0x0F,0x04,0x02,0x01,0x02,0x04,0x08,    //自定义字符
  63              0x00,0x1E,0x08,0x10,0x00,0x10,0x08,0x06,    //自定义字符
  64              0x0F,0x12,0x0F,0x04,0x0F,0x00,0x0F,0x00,    //自定义字符
  65              0x1F,0x12,0x1C,0x10,0x1E,0x10,0x1F,0x10,    //自定义字符
  66          };                       
  67          
  68                                                                                                          //unsigned char *p_number = "0123456789";
  69          
  70          unsigned char k;
  71          //unsigned char start_positon;
  72          
  73          unsigned char second=0;                 /*相应的位置上要显示的字符,时分秒,10*(时,分,秒)*/
  74          unsigned char ten_second=0;                                                                               
             -                                                                                                                        
             -                                                                                                                        
             -                                                                                                                        
             -                                                                                                                        
             -                                                                                                                        
             -                                                                                                                        
             -                                                                                                                        
             -                                                                                                                        
             -                                                                                                                        
             -                                                                                                                        
             -                                                                                                                        
             -                                                                                                                        
             -                                                                                                                        
             -                                                                                                                        
             -                                                                                                                        
             -                                                                                                                        
             -                    
  75          unsigned char miniute=0;
  76          unsigned char ten_miniute=0;
  77          unsigned char hour=0;
  78          unsigned char ten_hour=0;                                                                                               //char code int2charLCD[]="0123456789";
  79          ///////////////////////////////////////////////////////////////////////////////
  80          
  81          void fun_wait_bf(void)                        ///读,等待,busy标志位,busy=0 方可进行操作
  82          {
  83   1              RS = RS_INST;
  84   1              RW = RW_READ;
  85   1              E  = E_READ;
  86   1              while (BF)
  87   1              {
  88   2              }
  89   1      }
  90          
  91          void fun_write_e(void)                      //制造一个E 的上升沿,能够为写数据服务
  92          {
  93   1              E=0;
  94   1              E=0;
  95   1              E=1;
  96   1              E=1;
  97   1              E=0;
  98   1              E=0;    
  99   1      }
 100          
C51 COMPILER V7.06   1602DRIVER                                                            09/25/2008 20:34:56 PAGE 3   

 101          
 102          void fun_write_instruction(unsigned char instruction_data)
 103          {
 104   1              fun_wait_bf();                                                  //在开始操作前,确定bf,负责等待到 lcd 模块空闲后再操作
 105   1              RS = RS_INST;                                                   //指向指令寄存器
 106   1              RW = RW_WRITE;                                                  //写操作控制
 107   1              P0 = instruction_data;                                  //具体指令码送P0口,即DB7~DB0
 108   1              fun_write_e();                                                  // e制造一个上升沿,让指令写入,lcd模块的内部寄存器
 109   1      }
 110          
 111          void fun_write_data(unsigned char data_data)  
 112          {
 113   1              fun_wait_bf();                                                  //在开始操作前,确定bf,负责等待到 lcd 模块空闲后再操作
 114   1              RS = RS_DATA;                                                   //指向数据寄存器
 115   1              RW = RW_WRITE;                                                  //写操作控制
 116   1              P0 = data_data;                                                 //具体数据送P0口,即DB7~DB0
 117   1              fun_write_e();                                                  // e制造一个上升沿,让数据写入,lcd模块的内部寄存器
 118   1      }
 119          
 120          /*
 121           *函数介绍: .显示位置的控制,根据 line ,row 的值设定,随意开始显示的位置
 122           *输入参数: line 行 =1,2   row =0~15.
 123           *输出参数:
 124           *返回值  :
 125          */
 126          
 127          
 128          
 129          void fun_display_position(unsigned char line,unsigned char row)  //
 130          {
 131   1              unsigned char start_position = 0;
 132   1              
 133   1              if (line == 1)
 134   1              {
 135   2              start_position = DDRAM_ADD_INI_1 + row;                         //开始位置设定在 第一行,根据row定第几列
 136   2              }
 137   1              
 138   1              if (line == 2 )
 139   1              {
 140   2              start_position = DDRAM_ADD_INI_2 + row;                         //开始位置设定在 第二行,根据row定第几列
 141   2              }
 142   1              
 143   1              fun_write_instruction(start_position);
 144   1      }
 145          
 146          
 147          
 148          
 149          
 150          void fun_display_char(unsigned char *p_char)         //显示字符符子函数
 151          {
 152   1                      while (*p_char)                                                         //指针指向要显示字符的首地址,只要字符就传送字符对应的字模
 153   1              {                                                                                               //直到指针找不到字符为止,判断为要传送的字符结束。                                      
 154   2                      fun_write_data(*p_char);
 155   2                      p_char++;       
 156   2              }
 157   1      
 158   1      
 159   1      }
 160          
 161          
 162          
C51 COMPILER V7.06   1602DRIVER                                                            09/25/2008 20:34:56 PAGE 4   

 163          void fun_display_num4(unsigned long int zhengshu)
 164          {
 165   1              unsigned char ge,shi,bai,qian;
 166   1                      
 167   1      
 168   1              if ((zhengshu>=1000) && (zhengshu<=9999))                       //数值再10的3次方以上
 169   1              {
 170   2                      
 171   2                      
 172   2                      qian     = zhengshu/1000;
 173   2                      bai      = (zhengshu%1000)/100;
 174   2                      shi      = (zhengshu%100)/10;
 175   2                      ge           = (zhengshu%10);
 176   2                      
 177   2                      p_number = &num_dis_code[0]+qian;
 178   2                      fun_write_data(*p_number);
 179   2                      p_number = &num_dis_code[0]+bai;
 180   2                      fun_write_data(*p_number);
 181   2                      p_number = &num_dis_code[0]+shi;
 182   2                      fun_write_data(*p_number);
 183   2                      p_number = &num_dis_code[0]+ge;
 184   2                      fun_write_data(*p_number);      
 185   2              }
 186   1              
 187   1              if ((zhengshu>=100) && (zhengshu<=999))                         //数值再10的2次方以上
 188   1              {
 189   2                      
 190   2                      
 191   2                      bai      = zhengshu/100;
 192   2                      shi      = (zhengshu%100)/10;
 193   2                      ge           = (zhengshu%10);
 194   2      
 195   2                      p_number = &num_dis_code[0]+bai;
 196   2                      fun_write_data(*p_number);
 197   2                      p_number = &num_dis_code[0]+shi;
 198   2                      fun_write_data(*p_number);
 199   2                      p_number = &num_dis_code[0]+ge;
 200   2                      fun_write_data(*p_number);      
 201   2              }       
 202   1              
 203   1              if ((zhengshu>=10) && (zhengshu<=99))                           //数值再10的1次方以上
 204   1              {
 205   2                      
 206   2                      
 207   2                      shi      = zhengshu/10;
 208   2                      ge           = (zhengshu%10);
 209   2              
 210   2                      p_number = &num_dis_code[0]+shi;
 211   2                      fun_write_data(*p_number);
 212   2                      p_number = &num_dis_code[0]+ge;
 213   2                      fun_write_data(*p_number);              
 214   2              }
 215   1              
 216   1              if ((zhengshu>=0) && (zhengshu<=9))                                     //只有个位
 217   1              {
 218   2                      
 219   2                      ge           = (zhengshu%10);
 220   2              
 221   2                      p_number = &num_dis_code[0]+ge;
 222   2                      fun_write_data(*p_number);
 223   2              }
 224   1              
C51 COMPILER V7.06   1602DRIVER                                                            09/25/2008 20:34:56 PAGE 5   

 225   1      
 226   1      }
 227          
 228          /*************************************************************************
 229           *函数介绍:显示数值子函数,调用该函数(整数部分的数值,小数部分的数值),
 230                                  
 231           *输入参数:整数部分的最大值,显示为10000000,小数部分显示3位,
 232           
 233           *输出参数:小数部分,输入0,显示 。000, 输入123 显示 。123,以此类推
 234           *返回值  :
 235          */////////////////////////////////////////////////////////////////////
 236          
 237          
 238          void fun_display_num_dot(unsigned long int zhengshu,unsigned int dot)
 239          {
 240   1              unsigned char ge,shi,bai,qian,wang,wang10,wang100,wang1000,dot1,dot01,dot001;
 241   1              
 242   1              if ((zhengshu>=10000000) && (zhengshu<99999999))                        //数值再10的7次方以上
 243   1              {
 244   2                      
 245   2                      wang1000 = zhengshu/10000000;                                   //取各个数量级位,          
 246   2                      wang100  = (zhengshu%10000000)/1000000;
 247   2                      wang10   = (zhengshu%1000000)/100000;
 248   2                      wang     = (zhengshu%100000)/10000;
 249   2                      qian     = (zhengshu%10000)/1000;
 250   2                      bai      = (zhengshu%1000)/100;
 251   2                      shi      = (zhengshu%100)/10;

⌨️ 快捷键说明

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