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

📄 lcd.lst

📁 C51对C6963C的驱动编程,包含具体的连接定义和汉字字库,我已经完全显示成功
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.02b   LCD                                                                  08/02/2005 17:51:31 PAGE 1   


C51 COMPILER V7.02b, COMPILATION OF MODULE LCD
OBJECT MODULE PLACED IN lcd.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE lcd.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          /*----------------------------------------------------------------------------------------*/
   2          //240*128液晶显示驱动程序
   3          //控制器件为:AT89S52 
   4          //程序设计:卢印举
   5          /*----------------------------------------------------------------------------------------*/
   6          
   7          #include <AT89X51.H>
   8          #include <math.h>
   9          #include <absacc.h>
  10          #include <string.h>
  11          
  12          //以8*8字符计算,显示屏横向、纵向可以显示的字符个数
  13          #define LineChar  16//共16行
  14          #define ColumnChar 30 //总共30列
  15          
  16          //信号管脚定义(全局变量)(注意:因为液晶数据口接P0,故为直接访问方式)
  17          sbit cd=P2^0;
  18          //sbit reset=P2^5;
  19          sbit ce=P2^1;
  20          sbit wr=P3^6;
  21          sbit rd=P3^7;
  22          unsigned char  code ASCII816[ ][16];  //西文字模
  23          unsigned char code HZTable[ ][32];    //汉字字模
  24          
  25          //const char string[15]={"HELLO WORD"};
  26          
  27          //数据线定义
  28          #define dataport P0          //P0为数据口
  29          #define unchar unsigned char //定义unchar 
  30          #define unint  unsigned int  //定义unint 
  31          
  32          /*----------------------------------------------------------------------------------------*/
  33          //延时函数
  34          void Lcddelay(unsigned char MS)
  35          {
  36   1        unsigned char us, usn;
  37   1        while(MS!=0)
  38   1         {
  39   2          usn = 4;
  40   2          while(usn!=0)
  41   2           {
  42   3            us=0xf0;
  43   3            while(us!=0)
  44   3                {us--;}
  45   3            usn--;
  46   3           }
  47   2          MS--;
  48   2         }
  49   1      }
  50          
  51          /*---------------------------------------------------------------------------------------*/
  52          //状态检查函数
  53          //指令,数据读写状态检查
  54          //1-准备好;0-没有准备好;
  55          //数据的读写之前,必须对芯片进行状态检查
C51 COMPILER V7.02b   LCD                                                                  08/02/2005 17:51:31 PAGE 2   

  56          
  57          void RWCheck()
  58          {
  59   1        unchar dat;
  60   1        do{
  61   2          dataport=0xff;
  62   2          cd=1;
  63   2          rd=0;
  64   2          dat=dataport;
  65   2          rd=1;
  66   2          dat=0x03&dat;//STA0,STA1分别是检查准备好
  67   2           }while(dat!=0x03);
  68   1      }
  69          //数据自动读状态检查
  70          void AutoRCheck()
  71          {
  72   1       unchar dat;
  73   1       ce=0;
  74   1          do{
  75   2              dataport=0xff;
  76   2              cd=1;
  77   2              rd=0;
  78   2              dat=dataport;
  79   2              rd=1;
  80   2              dat=0x04&dat;//STA2是否准备好
  81   2              }while(dat==0x00);
  82   1       }
  83           //数据自动写状态检查
  84          void AutoWCheck()
  85          {
  86   1       unchar dat;
  87   1          do{
  88   2              dataport=0xff;
  89   2              cd=1;
  90   2              rd=0;
  91   2              dat=dataport;
  92   2              rd=1;
  93   2              dat=0x08&dat;//STA3是否准备好
  94   2              }while(dat==0x00);
  95   1      }
  96          
  97          
  98          /*------------------------------------------------------------------------------------*/
  99          //输入/出函数,与T6963C通讯
 100          //读数据线上的数据
 101          unchar InPortData()
 102          {
 103   1       unchar dat;
 104   1       RWCheck();
 105   1       cd=0;
 106   1       dataport=0xff;
 107   1       rd=0;
 108   1       dat=dataport;
 109   1       rd=1;
 110   1       return(dat);
 111   1      }
 112          
 113          //向数据口发送Data
 114          void OutPortData(dat){RWCheck();cd=0;wr=0;dataport=dat;wr=1;}
 115          
 116          //写有 1 个参数命令:仅仅发送一个命令
 117          void OutPortCom1(command) { RWCheck();cd=1;wr=0;dataport=command;wr=1;}
C51 COMPILER V7.02b   LCD                                                                  08/02/2005 17:51:31 PAGE 3   

 118          
 119          //写有 2 个参数命令:向数据端口发送一个数据(dat),然后发送一个命令
 120          void OutPortCom2(dat, command) { OutPortData(dat); OutPortCom1(command); }
 121          
 122          //写有 3 个参数命令:向数据端口发送两个数据(dat1和dat2),然后发送一个命令
 123          void OutPortCom3(data1, data2, command) { OutPortData(data1); OutPortData(data2); OutPortCom1(command);}
 124          
 125          /*-----------------------------------------------------------------------------------*/
 126          //显示30*16字符(显示范围为:30列16行)(图形显示方式)
 127          //lin:行位置,(范围:0-15)
 128          //column: 列位置,(范围0-29)
 129          //ch:被发送的字符代码(标准ASCII码)
 130          void ShowChar(unchar lin,unchar column,unchar ch)
 131          {
 132   1      unchar i;
 133   1      unchar dat;
 134   1      unint StartAddr;//开始的地址
 135   1      
 136   1      while(column>15)
 137   1      {
 138   2           column=column-16;
 139   2           lin=lin+1;
 140   2         }
 141   1      if (lin>3)  return;
 142   1      
 143   1      //StartAddr=(lin<<8)+column; //定位起始行(要求文本区从0x0000开始)
 144   1      StartAddr=lin*LineChar+column; //定位起始行(要求文本区从0x0000开始)
 145   1      
 146   1      for(i=0;i<16;i++)
 147   1      {
 148   2      dat=ASCII816[ch][i];//后面定义
 149   2      OutPortCom3((unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24); //set address(可行吗?)
 150   2      OutPortCom2(dat, 0xc4);
 151   2      
 152   2      StartAddr=StartAddr + ColumnChar;
 153   2      }
 154   1      }
 155          
 156          /*----------------------------------------------------------------------------------------------*/
 157          //显示一个汉字(汉字为:8*8点阵格式,显示范围为:240X128点阵) (图形方式显示)
 158          //lin:行位置。(范围0-15)
 159          //column: 列位置,(范围0-29)
 160          //hzcode: 要发送的汉字代码(自定义的汉字字库)
 161          void ShowHZ(unchar lin,unchar column,unint hzcode)
 162          {
 163   1      unsigned char i;
 164   1      unsigned int StartAddr;
 165   1      
 166   1      while(column>14)
 167   1      {
 168   2           column=column-16;
 169   2           lin=lin+1;
 170   2         }
 171   1      if (column<0) column=0;
 172   1      if (lin>3)  return;
 173   1      
 174   1      StartAddr=(lin<<8)+column; //定位起始行(括号中相当于lin*ColumnChar*16)
 175   1      
 176   1      for(i=0;i<16;i++)
 177   1      {
 178   2      OutPortCom3( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24);
 179   2      OutPortCom2( HZTable[hzcode][i*2], 0xc0); //左半部 地址加一
C51 COMPILER V7.02b   LCD                                                                  08/02/2005 17:51:31 PAGE 4   

 180   2      OutPortCom2( HZTable[hzcode][i*2+1], 0xc4); //右半部 字模地址加一
 181   2      
 182   2      StartAddr=StartAddr + ColumnChar;
 183   2      }
 184   1      }
 185          
 186          /*-----------------------------------------------------------------------------------*/
 187          //显示一行字符串(汉字,字母混排)
 188          //lin:行位置。(范围0-15)
 189          //column: 列位置,(范围0-29)
 190          void ShowLine(unchar lin,unchar column,unchar *puts,unchar i)
 191           {
 192   1        unchar j,byte,k;
 193   1        while(column>15)
 194   1                      {
 195   2                        column=column-16;
 196   2                        lin=lin+1;
 197   2                       }
 198   1                      if (lin>3)  return;//看首行是否超出屏幕
 199   1                      for (k=column,j=0;j<i;j++)
 200   1        {
 201   2        byte = puts[j];
 202   2         if (byte&0x80) //汉字  /*汉字从0x80开始,包括0x80*/
 203   2          {
 204   3           ShowHZ(lin,k,byte&0x7f);
 205   3           k=k+2;
 206   3          }
 207   2         else {ShowChar(lin,k,byte-0x20);k=k+1;}//字母  /*ascii码表从0x20开始*/
 208   2      
 209   2        }
 210   1       }
 211          
 212          /*----------------------------------------------------------------------------------------------------*/
 213          //反显一个字符
 214          //lin:行位置。(范围0-15)
 215          //column: 列位置,(范围0-29)
 216          void ReverseShowChar(unchar lin,unchar column)
 217          {
 218   1      unsigned char i;
 219   1      unsigned char dat;
 220   1      unsigned int StartAddr;
 221   1      
 222   1      StartAddr=(lin<<8) +column; //定位起始行
 223   1      
 224   1      for(i=0;i<16;i++)
 225   1      {
 226   2      OutPortCom3( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24); //set address
 227   2      OutPortCom1( 0xc5 ); //数据一次读,地址不变
 228   2      dat=InPortData(); //读入数据
 229   2      dat=~dat; //取反
 230   2      OutPortCom2( dat, 0xc4); //送回
 231   2      

⌨️ 快捷键说明

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