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

📄 ca12864.lst

📁 12864液晶显示器串行操作程序
💻 LST
字号:
C51 COMPILER V8.05a   CA12864                                                              02/09/2009 14:06:55 PAGE 1   


C51 COMPILER V8.05a, COMPILATION OF MODULE CA12864
OBJECT MODULE PLACED IN CA12864.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE CA12864.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*********************************************************************/
   2          //程序名称:12864串行操作关键函数
   3          //编写人:王兵洋
   4          //版权声明:欢迎转载,注明原作者即可
   5          /*****************本程序提供的外部函数:
   6          extern void Lcd_Write_Str(UCHAR l_line,UCHAR l_site,UCHAR * words);//写字符串
   7          extern void Lcd_Init(void);//初始化
   8          extern void Lcd_Write_Bmp(unsigned char *puts); //写图片
   9          void Lcd_Clr_Scr(void); //清屏
  10          /*********************************************************************/
  11          #include <reg52.h>
  12          
  13          //数据类型定义
  14          typedef  unsigned char  UCHAR;
  15          typedef  unsigned int   UINT;
  16          
  17          //功能管脚定义
  18          sbit LCM_CS     = P1^0;                         //片选
  19          sbit LCM_SCK    = P1^1;                         //时钟
  20          sbit LCM_SID    = P1^2;                         //数据
  21          sbit LCM_BLK    = P1^3;                         //背光
  22          sbit LCM_RST    = P1^4;                         //复位
  23          //--------------------------------------------------------------------
  24          //功能说明:串行发送一个字节
  25          //输入参数:欲发送字节,输出参数:无
  26          void Send_Byte(UCHAR lcd_byte)
  27          {
  28   1          register UCHAR i;
  29   1          LCM_SCK = 0;
  30   1              for(i=0;i<8;i++)
  31   1              {
  32   2              lcd_byte <<= 1; //左移一位
  33   2              LCM_SID = CY;           //移出的位给SID
  34   2              LCM_SCK = 1;
  35   2              LCM_SCK = 0;
  36   2              }
  37   1      }
  38          //-------------------------------------------------------------------
  39          //功能说明:串行读取一个命令字节
  40          //输入参数:无,输出参数:读取的字节数据
  41          UCHAR Lcd_Read_Cmd(void)
  42          {
  43   1          register UCHAR i;
  44   1          register UCHAR temp;
  45   1          LCM_CS  = 0;
  46   1          LCM_SID = 0;
  47   1          LCM_SCK = 0;
  48   1          LCM_CS  = 1;
  49   1      Send_Byte(0xfc);//首先发送读命令
  50   1                      //11111,RW(1),RS(0),0
  51   1          temp = 0;
  52   1      for (i=0;i<8;i++)
  53   1      {
  54   2       LCM_SCK = 1;
  55   2       temp <<=1;
C51 COMPILER V8.05a   CA12864                                                              02/09/2009 14:06:55 PAGE 2   

  56   2       temp |= LCM_SID;
  57   2       LCM_SCK = 0;
  58   2      }  //读出高四位
  59   1          temp >>= 4;
  60   1      for (i=0;i<4;i++)
  61   1      {
  62   2       LCM_SCK = 1;
  63   2       temp <<=1;
  64   2       temp |= LCM_SID;
  65   2       LCM_SCK = 0;
  66   2      }  //读出第四位
  67   1          for (i=0;i<4;i++)
  68   1          {
  69   2           LCM_SCK = 1;
  70   2               LCM_SCK = 0;
  71   2          }
  72   1      LCM_CS  = 0;
  73   1      LCM_SID = 0;
  74   1      LCM_SCK = 0;
  75   1          return temp;
  76   1      }
  77          //--------------------------------------------------------------------
  78          //功能说明:串行写入一个字节
  79          //输入参数:lcd_data-欲写入字节,cmd_data-数据/命令选择位
  80          //输出参数:无
  81          void Lcd_Write_Byte(UCHAR lcd_data,bit cmd_data)
  82          {
  83   1      UCHAR lcdopt;
  84   1      register UCHAR temp;
  85   1      EA = 0; //禁用所有中断
  86   1          lcdopt = 0;
  87   1          do
  88   1          {
  89   2           lcdopt = Lcd_Read_Cmd();
  90   2          }
  91   1              while (lcdopt&0x80);
  92   1      
  93   1          LCM_CS  = 0;
  94   1          LCM_SID = 0;
  95   1          LCM_SCK = 0;
  96   1          LCM_CS  = 1;
  97   1      
  98   1      // 1111 1 RW RS 0
  99   1      //RW为0,选择写;RS为1,选择数据;RS为0,选择指令
 100   1      if(cmd_data==1)
 101   1      Send_Byte(0xfa);//发送数据
 102   1      else
 103   1      Send_Byte(0xf8);//发送指令
 104   1      
 105   1      temp = lcd_data&0xf0;
 106   1      Send_Byte(temp); //传输高四位
 107   1      temp = (lcd_data<<4)&0xf0;
 108   1      Send_Byte(temp); //传输低四位
 109   1      
 110   1      LCM_CS  = 0;
 111   1      LCM_SID = 0;
 112   1      LCM_SCK = 0;
 113   1      EA=1; //恢复中断
 114   1      }
 115          //--------------------------------------------------------------------
 116          //功能说明:写入一个命令
 117          //输入参数:写入命令字节,输出参数:无
C51 COMPILER V8.05a   CA12864                                                              02/09/2009 14:06:55 PAGE 3   

 118          void Lcd_Write_Cmd(UCHAR lcd_data)
 119          {
 120   1      Lcd_Write_Byte(lcd_data,0);
 121   1      }
 122          //--------------------------------------------------------------------
 123          //功能说明:写入一个数据
 124          //输入参数:欲写入数据,输出参数:无
 125          void Lcd_Write_Data(UCHAR lcd_data)
 126          {
 127   1      Lcd_Write_Byte(lcd_data,1);
 128   1      }
 129          //--------------------------------------------------------------------
 130          //功能说明:12864初始化
 131          //输入输出参数:无
 132          void Lcd_Init(void)
 133          {
 134   1      LCM_BLK = 0;//打开背光
 135   1      Lcd_Write_Cmd(0x30); //基本命令集
 136   1      Lcd_Write_Cmd(0x30);
 137   1      Lcd_Write_Cmd(0x0C);    //显示ON,游标OFF,游标位反白OFF
 138   1      Lcd_Write_Cmd(0x06);    //写入时,游标右移动
 139   1      Lcd_Write_Cmd(0x01);    //清除显示
 140   1      //Os_Wait2(K_TMO,1);
 141   1      Lcd_Write_Cmd(0x02);    //位址归位
 142   1      Lcd_Write_Cmd(0x06);    //写入时,游标右移动
 143   1      //Os_Wait2(K_TMO,1);  //根据所用单片机晶振加入等待
 144   1      }
 145          //--------------------------------------------------------------------
 146          //功能说明:写入字符串
 147          //输入参数:l_line:行0-3; l_site:列 0-7; words:中英字符
 148          //输出参数:无
 149          void Lcd_Write_Str(UCHAR l_line,UCHAR l_site,UCHAR * words)
 150          {  
 151   1       UCHAR c;
 152   1       c = 0; 
 153   1       l_site = l_site % 8;                  //使列在0-7范围
 154   1       if(l_line>1)                          //若行=2,3
 155   1       {
 156   2        l_line = l_line % 2;                 //2行变0行,3行变1行
 157   2        l_site = l_site + 8;                 //列加8
 158   2       }
 159   1       l_site = (l_line<<4) + l_site;        //行*16+列
 160   1       l_site = (l_site&0x3f)|0x80;
 161   1       Lcd_Write_Cmd(l_site);                //DDRAM地址
 162   1       
 163   1       while(*words != 0)                    //写字符
 164   1       {
 165   2        UCHAR tempdata;
 166   2        tempdata = *words;
 167   2        Lcd_Write_Data(tempdata);
 168   2        words++;
 169   2        l_site++;
 170   2        c++;
 171   2       }
 172   1       if (c%2)                              //写完数据,若最后一个字符列号是奇数则补空格
 173   1       {
 174   2       Lcd_Write_Data(0x20);
 175   2       }
 176   1      }
 177          //--------------------------------------------------------------------
 178          //功能说明:写入一副图像
 179          //输入参数:puts——图像数据起点
C51 COMPILER V8.05a   CA12864                                                              02/09/2009 14:06:55 PAGE 4   

 180          //图像数据格式要求:图片尺寸:128*64,横向取模左高位,数据排列:从左到右从上到下
 181          //输出参数:无
 182          void Lcd_Write_Bmp(unsigned char *puts)
 183          {
 184   1              unsigned int x=0;
 185   1              unsigned char i,j;
 186   1          Lcd_Write_Cmd(0x34); 
 187   1          Lcd_Write_Cmd(0x34); //8Bit扩充指令集,绘图OFF,要写两次
 188   1              for(i=0;i<32;i++)               //12864实际为256x32
 189   1              {       
 190   2                      Lcd_Write_Cmd(i|0x80);  //行位置
 191   2                      Lcd_Write_Cmd(0x80);    //列位置
 192   2                      for(j=0;j<16;j++)       //先写上半帧//再写下半帧
 193   2                      {                               //列位置每行自动增加
 194   3                      Lcd_Write_Data(puts[x]);
 195   3                      x++;
 196   3                      }
 197   2                      x-=16;
 198   2                      for(j=0;j<16;j++)       //先写上半帧//再写下半帧
 199   2                      {                               //列位置每行自动增加
 200   3                      Lcd_Write_Data(puts[x+0x200]);
 201   3                      x++;
 202   3                      }
 203   2              }
 204   1          Lcd_Write_Cmd(0x36); 
 205   1          Lcd_Write_Cmd(0x36); //绘图ON,基本指令集里面36H不能开绘图
 206   1      Lcd_Write_Cmd(0x30); 
 207   1      Lcd_Write_Cmd(0x30);  //恢复基本指令集
 208   1      }
 209          //--------------------------------------------------------------------
 210          //功能说明:清屏
 211          //输入输出参数:无
 212          void Lcd_Clr_Scr(void)
 213          {
 214   1      Lcd_Write_Cmd(0x01);  //清屏
 215   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    423    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----       8
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       1
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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