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

📄 lcd160xb.lst

📁 这是一个以RW1067为控制器的LCD模块的控制程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V8.01   LCD160XB                                                              12/08/2006 10:51:10 PAGE 1   


C51 COMPILER V8.01, COMPILATION OF MODULE LCD160XB
OBJECT MODULE PLACED IN .\OutPut\Lcd160xb.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE SRC\Lcd160xb.c BROWSE INCDIR(.\HEAD\) DEBUG OBJECTEXTEND PRINT(.\List\Lcd16
                    -0xb.lst) TABS(8) OBJECT(.\OutPut\Lcd160xb.obj)

line level    source

   1          //==============================================================================
   2          //字符液晶模块的C51程序源文件
   3          //适用于内建ASCII字符字库的单/双行液晶,以及数据端口采用8位或4位两种引脚的接法!
   4          //File Name=lcd160xb.c
   5          //      1.8BIT数据接口(PIN3 V0不能连线)
   6          //        4BIT数据接口(PIN3 V0不能连线)
   7          //        增加4SPI接口方式(PIN3 V0不能连线)
   8          //        增加3SPI接口方式(PIN3 V0不能连线)
   9          //==============================================================================
  10          #include <Intrins.h>
  11          #include "public.h"
  12          #include "W78E52.h"
  13          #include "Delay_s.h"
  14          #include "lcd160xb.h"
  15          
  16          //全局变量
  17          uchar data lcd_line_1[CONST_LCD160XB_LINE_WIDTH+1];     //液晶第一行显示缓冲
  18          uchar data lcd_line_2[CONST_LCD160XB_LINE_WIDTH+1];     //液晶第二行显示缓冲
  19          
  20          //内部函数的定义
  21          #if ((LCD_PORT ==PORT_WIDTH_8BIT) || (LCD_PORT ==PORT_WIDTH_4BIT) )
  22          static void _lcd160xb_judge_busy(void);
  23          static uchar _lcd160xb_recv_byte(uchar rs);
  24          #endif
  25          
  26          static void _lcd160xb_send_byte(uchar da, uchar rs);
  27          
  28          #if (LCD_PORT ==PORT_WIDTH_4BIT)
              static void _lcd160xb_send_half_cmd(uchar da);
              #endif
  31          
  32          /********************************************************/
  33          //序号:
  34          //              HD_LCD160XB_S01
  35          //功能: 
  36          //              液晶初始化,没有关标显示
  37          //输入: 
  38          //              无
  39          //输出: 
  40          //              无
  41          /********************************************************/
  42          void lcd160xb_init_set(void)
  43          {
  44   1      #if (LCD_PORT ==PORT_WIDTH_4BIT)
                      #if (LCD_TYPE  ==TYPE_LCD1601B) 
                              delay_x1ms(15);
                              _lcd160xb_send_byte(CMD_LCD160XB_CONFIG_4BIT_1LINE,CONST_LCD160XB_COMMAND);
                              delay_x1ms(5);
                              _lcd160xb_send_byte(CMD_LCD160XB_CONFIG_4BIT_1LINE,CONST_LCD160XB_COMMAND);
                              delay_x1ms(5);
                              _lcd160xb_send_byte(CMD_LCD160XB_CONFIG_4BIT_1LINE,CONST_LCD160XB_COMMAND);
                      
                              _lcd160xb_judge_busy();
                              _lcd160xb_send_byte(CMD_LCD160XB_CONFIG_4BIT_1LINE,CONST_LCD160XB_COMMAND);
C51 COMPILER V8.01   LCD160XB                                                              12/08/2006 10:51:10 PAGE 2   

                      #else   //2行显示
                              delay_x1ms(50);
                              _lcd160xb_send_half_cmd(0x30);
                              delay_x1ms(10);
                              _lcd160xb_send_half_cmd(0x30);
                              delay_x1ms(1);
                              _lcd160xb_send_half_cmd(0x30);
                              delay_x1ms(1);
                              _lcd160xb_send_half_cmd(0x20);
                              delay_x1ms(1);
              
                              _lcd160xb_judge_busy();
                              _lcd160xb_send_byte(0x28,CONST_LCD160XB_COMMAND);
                      #endif
                      
                      _lcd160xb_judge_busy();
                      _lcd160xb_send_byte(CMD_LCD160XB_DISPLAY_ON,CONST_LCD160XB_COMMAND);
                      _lcd160xb_judge_busy();
                      _lcd160xb_send_byte(CMD_LCD160XB_CLR_SCREEN,CONST_LCD160XB_COMMAND);
                      _lcd160xb_judge_busy();
                      _lcd160xb_send_byte(CMD_LCD160XB_CURSE_SETS,CONST_LCD160XB_COMMAND);
              
                      lcd160xb_clr_scr();
                      lcd160xb_clr_scr();
              
                      //RE=1, SelectCodeBank=Bank1, LcdLines=2,RE=0   
                      _lcd160xb_judge_busy();
                      _lcd160xb_send_byte(0x24,CONST_LCD160XB_COMMAND);
                      _lcd160xb_judge_busy();
                      _lcd160xb_send_byte(0x08,CONST_LCD160XB_COMMAND);
                      _lcd160xb_judge_busy();
                      _lcd160xb_send_byte(0x11,CONST_LCD160XB_COMMAND);
                      _lcd160xb_judge_busy();
                      _lcd160xb_send_byte(0x20,CONST_LCD160XB_COMMAND);
              ////////////
              
              #elif   (LCD_PORT ==PORT_WIDTH_4SPI)
                      delay_x1ms(50);
                      _lcd160xb_send_byte(CMD_LCD160XB_CONFIG_8BIT_2LINE,CONST_LCD160XB_COMMAND);
                      delay_x1ms(5);
                      _lcd160xb_send_byte(CMD_LCD160XB_CONFIG_8BIT_2LINE,CONST_LCD160XB_COMMAND);
                      delay_x1ms(5);
                      _lcd160xb_send_byte(CMD_LCD160XB_CONFIG_8BIT_2LINE,CONST_LCD160XB_COMMAND);
                      delay_x1ms(5);
                                      
                      _lcd160xb_send_byte(CMD_LCD160XB_DISPLAY_OFF,CONST_LCD160XB_COMMAND);
                      _lcd160xb_send_byte(CMD_LCD160XB_CLR_SCREEN,CONST_LCD160XB_COMMAND);
                      delay_x1ms(11);
                      _lcd160xb_send_byte(CMD_LCD160XB_CURSE_SETS,CONST_LCD160XB_COMMAND);
                      _lcd160xb_send_byte(CMD_LCD160XB_DISPLAY_ON,CONST_LCD160XB_COMMAND);
              
                      lcd160xb_clr_scr();
              
                      //RE=1, SelectCodeBank=Bank1, LcdLines=2,RE=0   
                      _lcd160xb_send_byte(0x34,CONST_LCD160XB_COMMAND);
                      _lcd160xb_send_byte(0x08,CONST_LCD160XB_COMMAND);
                      _lcd160xb_send_byte(0x11,CONST_LCD160XB_COMMAND);
                      _lcd160xb_send_byte(0x30,CONST_LCD160XB_COMMAND);
              
              #elif   (LCD_PORT ==PORT_WIDTH_3SPI)
                      delay_x1ms(50);
                      _lcd160xb_send_byte(CMD_LCD160XB_CONFIG_8BIT_2LINE,CONST_LCD160XB_COMMAND);
C51 COMPILER V8.01   LCD160XB                                                              12/08/2006 10:51:10 PAGE 3   

                      delay_x1ms(5);
                      _lcd160xb_send_byte(CMD_LCD160XB_CONFIG_8BIT_2LINE,CONST_LCD160XB_COMMAND);
                      delay_x1ms(5);
                      _lcd160xb_send_byte(CMD_LCD160XB_CONFIG_8BIT_2LINE,CONST_LCD160XB_COMMAND);
                      delay_x1ms(5);
                                      
                      _lcd160xb_send_byte(CMD_LCD160XB_DISPLAY_OFF,CONST_LCD160XB_COMMAND);
                      _lcd160xb_send_byte(CMD_LCD160XB_CLR_SCREEN,CONST_LCD160XB_COMMAND);
                      delay_x1ms(11);
                      _lcd160xb_send_byte(CMD_LCD160XB_CURSE_SETS,CONST_LCD160XB_COMMAND);
                      _lcd160xb_send_byte(CMD_LCD160XB_DISPLAY_ON,CONST_LCD160XB_COMMAND);
              
                      lcd160xb_clr_scr();
              
                      //RE=1, SelectCodeBank=Bank1, LcdLines=2,RE=0   
                      _lcd160xb_send_byte(0x34,CONST_LCD160XB_COMMAND);
                      _lcd160xb_send_byte(0x08,CONST_LCD160XB_COMMAND);
                      _lcd160xb_send_byte(0x11,CONST_LCD160XB_COMMAND);
                      _lcd160xb_send_byte(0x30,CONST_LCD160XB_COMMAND);
              
              #else   //8位数据端口
 138   1              #if (LCD_TYPE  ==TYPE_LCD1601B) 
                              delay_x1ms(15);
                              _lcd160xb_send_byte(CMD_LCD160XB_CONFIG_8BIT_1LINE,CONST_LCD160XB_COMMAND);
                              delay_x1ms(5);
                              _lcd160xb_send_byte(CMD_LCD160XB_CONFIG_8BIT_1LINE,CONST_LCD160XB_COMMAND);
                              delay_x1ms(5);
                              _lcd160xb_send_byte(CMD_LCD160XB_CONFIG_8BIT_1LINE,CONST_LCD160XB_COMMAND);
                      
                              _lcd160xb_judge_busy();
                              _lcd160xb_send_byte(CMD_LCD160XB_CONFIG_8BIT_1LINE,CONST_LCD160XB_COMMAND);
                      #else   //2行显示
 149   1                      delay_x1ms(15);
 150   1                      _lcd160xb_send_byte(CMD_LCD160XB_CONFIG_8BIT_2LINE,CONST_LCD160XB_COMMAND);
 151   1                      delay_x1ms(5);
 152   1                      _lcd160xb_send_byte(CMD_LCD160XB_CONFIG_8BIT_2LINE,CONST_LCD160XB_COMMAND);
 153   1                      delay_x1ms(5);
 154   1                      _lcd160xb_send_byte(CMD_LCD160XB_CONFIG_8BIT_2LINE,CONST_LCD160XB_COMMAND);
 155   1              
 156   1                      _lcd160xb_judge_busy();
 157   1                      _lcd160xb_send_byte(CMD_LCD160XB_CONFIG_8BIT_2LINE,CONST_LCD160XB_COMMAND);     
 158   1              #endif
 159   1                      
 160   1              _lcd160xb_judge_busy();
 161   1              _lcd160xb_send_byte(CMD_LCD160XB_DISPLAY_OFF,CONST_LCD160XB_COMMAND);
 162   1              _lcd160xb_judge_busy();
 163   1              _lcd160xb_send_byte(CMD_LCD160XB_CLR_SCREEN,CONST_LCD160XB_COMMAND);
 164   1              _lcd160xb_judge_busy();
 165   1              _lcd160xb_send_byte(CMD_LCD160XB_CURSE_SETS,CONST_LCD160XB_COMMAND);
 166   1              _lcd160xb_judge_busy();
 167   1              _lcd160xb_send_byte(CMD_LCD160XB_DISPLAY_ON,CONST_LCD160XB_COMMAND);
 168   1      
 169   1              //20061128(2-1)
 170   1              //RE=1, SelectCodeBank=Bank1, LcdLines=2,RE=0   
 171   1              _lcd160xb_judge_busy();
 172   1              _lcd160xb_send_byte(0x34,CONST_LCD160XB_COMMAND);
 173   1              _lcd160xb_judge_busy();
 174   1              _lcd160xb_send_byte(0x08,CONST_LCD160XB_COMMAND);
 175   1              _lcd160xb_judge_busy();
 176   1              _lcd160xb_send_byte(0x11,CONST_LCD160XB_COMMAND);
 177   1              _lcd160xb_judge_busy();
 178   1              _lcd160xb_send_byte(0x30,CONST_LCD160XB_COMMAND);
C51 COMPILER V8.01   LCD160XB                                                              12/08/2006 10:51:10 PAGE 4   

 179   1      ////////////
 180   1      
 181   1      #endif
 182   1      
 183   1      }
 184          
 185          /********************************************************/
 186          //序号:
 187          //              HD_LCD160XB_S02
 188          //功能: 
 189          //              液晶清屏
 190          //输入: 
 191          //              无
 192          //输出: 
 193          //              无
 194          /********************************************************/
 195          void lcd160xb_clr_scr(void)
 196          {
 197   1      #if (LCD_PORT ==PORT_WIDTH_4BIT)
                      _lcd160xb_judge_busy();
                      _lcd160xb_send_byte(CMD_LCD160XB_CLR_SCREEN,CONST_LCD160XB_COMMAND);
              #elif   (LCD_PORT ==PORT_WIDTH_4SPI)
                      _lcd160xb_send_byte(CMD_LCD160XB_CLR_SCREEN,CONST_LCD160XB_COMMAND);
                      delay_x1ms(2);
              #elif   (LCD_PORT ==PORT_WIDTH_3SPI)
                      _lcd160xb_send_byte(CMD_LCD160XB_CLR_SCREEN,CONST_LCD160XB_COMMAND);
                      delay_x1ms(2);
              #else
 207   1              _lcd160xb_judge_busy();
 208   1              _lcd160xb_send_byte(CMD_LCD160XB_CLR_SCREEN,CONST_LCD160XB_COMMAND);
 209   1      #endif
 210   1      }
 211          
 212          
 213          /********************************************************/
 214          //序号:
 215          //              HD_LCD160XB_S03
 216          //功能: 
 217          //              液晶设置显示数据RAM(DD RAM)的地址
 218          //输入: 
 219          //              pos     液晶的字符位置,=0...15 从作到右16个字符
 220          //              line    指定的行号,=0/1 表示第1/2行
 221          //输出: 
 222          //              无
 223          /********************************************************/
 224          void lcd160xb_set_disp_addr(uchar pos, uchar line)
 225          {
 226   1      //保证平时RE=0
 227   1      #if (LCD_PORT ==PORT_WIDTH_4BIT)
                      _lcd160xb_judge_busy();
                      _lcd160xb_send_byte(0x20,CONST_LCD160XB_COMMAND);       //RE=0
              
              #if (LCD_TYPE ==TYPE_LCD1601B)
                      line =0x80 |(pos &0x0f);
              #else
                      line =(line ==CONST_LCD160XB_FIRST_LINE ? 0x80 :0xC0) |(pos &0x0f);
              #endif  
                      _lcd160xb_judge_busy();
                      _lcd160xb_send_byte(line, CONST_LCD160XB_COMMAND);
                      _lcd160xb_judge_busy();
                      _lcd160xb_send_byte(0x24,CONST_LCD160XB_COMMAND);       //RE=1
                      _lcd160xb_judge_busy();
C51 COMPILER V8.01   LCD160XB                                                              12/08/2006 10:51:10 PAGE 5   

                      _lcd160xb_send_byte(0x08,CONST_LCD160XB_COMMAND);
                      _lcd160xb_judge_busy();
                      _lcd160xb_send_byte(0x11,CONST_LCD160XB_COMMAND);
                      _lcd160xb_judge_busy();
                      _lcd160xb_send_byte(0x20,CONST_LCD160XB_COMMAND);       //RE=0
                      
              #elif   (LCD_PORT ==PORT_WIDTH_4SPI)
                      _lcd160xb_send_byte(0x30,CONST_LCD160XB_COMMAND);       //RE=0
              
                      line =(line ==CONST_LCD160XB_FIRST_LINE ? 0x80 :0xC0) |(pos &0x0f);
                      _lcd160xb_send_byte(line, CONST_LCD160XB_COMMAND);
              
                      _lcd160xb_send_byte(0x34,CONST_LCD160XB_COMMAND);       //RE=1
                      _lcd160xb_send_byte(0x08,CONST_LCD160XB_COMMAND);
                      _lcd160xb_send_byte(0x11,CONST_LCD160XB_COMMAND);
                      _lcd160xb_send_byte(0x30,CONST_LCD160XB_COMMAND);       //RE=0
              
              #elif   (LCD_PORT ==PORT_WIDTH_3SPI)
                      _lcd160xb_send_byte(0x30,CONST_LCD160XB_COMMAND);       //RE=0
              
                      line =(line ==CONST_LCD160XB_FIRST_LINE ? 0x80 :0xC0) |(pos &0x0f);
                      _lcd160xb_send_byte(line, CONST_LCD160XB_COMMAND);
              
                      _lcd160xb_send_byte(0x34,CONST_LCD160XB_COMMAND);       //RE=1
                      _lcd160xb_send_byte(0x08,CONST_LCD160XB_COMMAND);
                      _lcd160xb_send_byte(0x11,CONST_LCD160XB_COMMAND);
                      _lcd160xb_send_byte(0x30,CONST_LCD160XB_COMMAND);       //RE=0
              
              #else   //8BIT 数据接口
 270   1              //20061128(2-2)
 271   1              _lcd160xb_judge_busy();
 272   1              _lcd160xb_send_byte(0x30,CONST_LCD160XB_COMMAND);       //RE=0
 273   1              //////////////  
 274   1      
 275   1      #if (LCD_TYPE ==TYPE_LCD1601B)
                      line =0x80 |(pos &0x0f);
              #else
 278   1              line =(line ==CONST_LCD160XB_FIRST_LINE ? 0x80 :0xC0) |(pos &0x0f);
 279   1      #endif  
 280   1              _lcd160xb_judge_busy();
 281   1              _lcd160xb_send_byte(line, CONST_LCD160XB_COMMAND);
 282   1      
 283   1              //20061128(2-3)
 284   1              _lcd160xb_judge_busy();
 285   1              _lcd160xb_send_byte(0x34,CONST_LCD160XB_COMMAND);       //RE=1
 286   1              _lcd160xb_judge_busy();
 287   1              _lcd160xb_send_byte(0x08,CONST_LCD160XB_COMMAND);
 288   1              _lcd160xb_judge_busy();

⌨️ 快捷键说明

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