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

📄 12864.lst

📁 LCD12864程序及Protues仿真
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V7.07   12864                                                                 09/12/2008 07:31:04 PAGE 1   


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

stmt level    source

   1          //LCD12864
   2          //**********************************************************
   3          //连线表: CPU=89C51    SysClock=12MHz                     *
   4          //RS=P2.0   R/W=P2.1    E=P2.2    CS1=P2.3    CS2=P2.4     *
   5          //DB0-DB7=P0.0-P0.7       /Reset=InBoard                   *
   6          //********************************************************** 
   7          #include <reg52.h>
   8          #include <stdlib.h>
   9          #include <intrins.h>
  10          #include <stdio.h> 
  11          #include <math.h>
  12          #define uchar unsigned char
  13          #define uint unsigned int
  14          /********************引脚定义********************/ 
  15          #define DataPort P3     //LCD128*64 I/O 信号管脚
  16          sbit    RS =P2^0;      //数据指令
  17          sbit    RW =P2^1;      //读写
  18          sbit    E   =P2^2;      //使能
  19          sbit    CSL =P2^3;      //左片选
  20          sbit    CSR =P2^4;      //右片选 
  21          sbit    Key1=P1^3;
  22          sbit    Key2=P1^4;
  23          uchar Page;             //页 地址
  24          uchar Col;              //列 地址 
  25          uchar code BMP1[];      //一幅图
  26          uchar code HZK_12[];    //12×12阵点字模
  27          uchar code ASC_5x7[];   //5×7阵点字模
  28          uchar str[4];
  29          /********************函数定义*******************/
  30          void BusyL(void);          //左屏检测忙
  31          void BusyR(void);          //右屏检测忙
  32          void CheckBusy(void);      //读取忙信号
  33          void Delay(uint MS);       //延时
  34          void Locatexy(void);       //将屏幕横向0-12纵向0-7转换成左、右屏的的X、Y
  35          void WriteCommandL( uchar CommandByte );    //向左屏写入指令
  36          void WriteCommandR( uchar CommandByte );    //向右屏写入指令
  37          uchar ReadData( void );       //读数据
  38          void WriteData( uchar DataByte );    //写数据
  39          void LcmClear( void );       //清屏
  40          void LcmInit( void );        //初始化
  41          void LcmPutBMP( uchar *puts );      //显示一幅图
  42          void LcmReverseBMP( void );         //将整屏反显
  43          void LcmPutHZ_12( uchar x,uchar y,uchar HZcode ); //在屏幕上任意点显示一个12×12汉字
  44          uchar * uchartostr(unsigned char unm);            //将值转成字符串
  45          void LcmPutAsc( uchar asc );     //显示一个5×7的ASC字符
  46          void LcmPutstr( uchar row,uchar y,uchar * str );       //在设定位置显示字符串
  47          void LcmPutpoint( uchar ro,uchar lie,uchar colour );   //在设定位置显示一个点
  48          
  49          /***************************/
  50          /*检查Busy                 */
  51          /***************************/
  52          void BusyL(void)
  53          {
  54   1              CSL= 1;
  55   1              CSR= 0;
C51 COMPILER V7.07   12864                                                                 09/12/2008 07:31:04 PAGE 2   

  56   1              CheckBusy();
  57   1      } 
  58          void BusyR(void)
  59          {
  60   1              CSL= 0;
  61   1              CSR= 1;
  62   1              CheckBusy();
  63   1      } 
  64          void CheckBusy(void)
  65          {
  66   1              RS = 0;         //指令
  67   1              RW = 1;
  68   1                      DataPort= 0xFF;      //输出0xff以便读取正确
  69   1              E = 1;
  70   1              _nop_();
  71   1                      while(!(DataPort & 0x80));
  72   1                      /*DataPort & 0x80);*/    
  73   1                      //Status Read Bit7 = BUSY 这地方有点问题,用了while(//DataPort & 0x80)后就一直
  74   1                      //读不到0了,陷入死循环。当用while(0) 时反而能正常工作,不知道有没有人能解释       
  75   1              E = 0;
  76   1              _nop_();
  77   1      } 
  78          /********************************************************/
  79          /*根据设定的坐标数据,定位LCM上的下一个操作单元位置     */
  80          /********************************************************/
  81          void Locatexy(void)
  82          {
  83   1              uchar x,y;
  84   1              switch (Col&0xc0)       /* col.and.0xC0        */
  85   1              {                       /*条件分支执行          */
  86   2                      case 0:         {BusyL();break;}/*左区 */
  87   2                      case 0x40:      {BusyR();break;}/*右区 */
  88   2              }
  89   1              x = Col&0x3F|0x40;      /* col.and.0x3f.or.Set Y Address*/
  90   1              y = Page&0x07|0xB8;     /* row.and.0x07.or.set Page     */
  91   1              CheckBusy();                /* waitting for enable */
  92   1              RS = 0;                 //指令
  93   1              RW = 0;                 //写
  94   1              DataPort = y;                 //设置页面地址
  95   1              E = 1;
  96   1              _nop_();
  97   1              E = 0;
  98   1              _nop_();
  99   1              CheckBusy();                /* waitting for enable */
 100   1              RS = 0;
 101   1              RW = 0;
 102   1              DataPort = x;                 //设置列地址
 103   1              E = 1;
 104   1              _nop_();
 105   1              E = 0;
 106   1              _nop_();
 107   1      } 
 108          /***************************/
 109          /*写指令                   */
 110          /***************************/
 111          void WriteCommandL( uchar CommandByte )
 112          {
 113   1              BusyL();
 114   1              DataPort = CommandByte;
 115   1              RS = 0;         //指令
 116   1              RW = 0;
 117   1              E = 1;
C51 COMPILER V7.07   12864                                                                 09/12/2008 07:31:04 PAGE 3   

 118   1              _nop_();
 119   1              E = 0;
 120   1              _nop_();
 121   1      } 
 122          void WriteCommandR( uchar CommandByte )
 123          {
 124   1              BusyR();
 125   1              DataPort = CommandByte;
 126   1              RS = 0;         //指令
 127   1              RW = 0;
 128   1              E = 1;
 129   1              _nop_();
 130   1              E = 0;
 131   1              _nop_();
 132   1      } 
 133          /***************************/
 134          /*读数据                   */
 135          /***************************/
 136          uchar ReadData( void )
 137          {
 138   1              uchar DataByte;
 139   1              Locatexy();     /*坐标定位,返回时保留分区状态不变      */
 140   1              RS = 1;         /*数据输出*/
 141   1              RW = 1;         /*读入 */
 142   1              DataPort = 0xFF;              //输出0xff以便读取正确
 143   1              E = 1;         /*读入到LCM*/
 144   1              _nop_();
 145   1              DataByte = DataPort; /*数据读出到数据口P1 */
 146   1              E = 0;
 147   1              _nop_();
 148   1              return DataByte;
 149   1      } 
 150          /***************************/
 151          /*写数据                   */
 152          /***************************/
 153          void WriteData( uchar DataByte )
 154          {
 155   1              Locatexy();     /*坐标定位,返回时保留分区状态不变      */
 156   1              RS = 1;         /*数据输出*/
 157   1              RW = 0;         /*写输出 */
 158   1              DataPort = DataByte; /*数据输出到数据口 */
 159   1              E = 1;         /*写入到LCM*/
 160   1              _nop_();
 161   1              E = 0;
 162   1              _nop_();
 163   1      } 
 164          void LcmClear( void )
 165          {
 166   1              Page = 0;
 167   1              Col = 0;
 168   1              for(Page=0;Page<8;Page++)
 169   1                      for(Col=0;Col<128;Col++)
 170   1                              WriteData(0);
 171   1      } 
 172          void LcmInit( void )
 173          {
 174   1          Delay(200);     //等待复位
 175   1              WriteCommandL(0x3f);    //开显示
 176   1              WriteCommandR(0x3f);
 177   1              
 178   1              WriteCommandL(0xc0);    //设置起始地址=0
 179   1              WriteCommandR(0xc0); 
C51 COMPILER V7.07   12864                                                                 09/12/2008 07:31:04 PAGE 4   

 180   1              WriteCommandL(0x3f);    //开显示
 181   1              WriteCommandR(0x3f); 
 182   1              LcmClear();
 183   1              Col = 0;
 184   1              Page= 0;
 185   1              Locatexy();
 186   1      }
 187          void LcmPutBMP( uchar *puts )
 188          {
 189   1              uint X=0;
 190   1              Page = 0;
 191   1              Col = 0;
 192   1              for(Page=0;Page<8;Page++)
 193   1              {
 194   2                      for(Col=0;Col<128;Col++)
 195   2                      {
 196   3                              WriteData( puts[X] );
 197   3                              X++;
 198   3                      }
 199   2              }
 200   1      } 
 201          void LcmReverseBMP( void )
 202          {
 203   1              uchar temp;
 204   1              Page = 0;
 205   1              Col = 0;
 206   1              for(Page=0;Page<8;Page++)
 207   1              {
 208   2                      for(Col=0;Col<128;Col++)
 209   2                      {
 210   3                              temp = ReadData();      //空读一次
 211   3                              temp = ReadData();
 212   3                              temp = ~temp;
 213   3                              WriteData(temp);
 214   3                      }
 215   2              }
 216   1      } 
 217          void LcmPutHZ_12( uchar x,uchar y,uchar HZcode )
 218          {      
 219   1         uchar offset,Rd,Wt,m,tmp,i;
 220   1         uint n;
 221   1         if(x<117&y<53)
 222   1          {
 223   2          Page=(y & 0x38)>>3;
 224   2         Col=x;
 225   2            n = 0x18*HZcode;
 226   2         offset=y&0x07;
 227   2         if(offset<5)
 228   2         {
 229   3                   for(i=12;i>0;i--)
 230   3                    { 
 231   4                       Rd=ReadData();
 232   4             Rd=ReadData();
 233   4             m=HZK_12[n];
 234   4                   Wt=Rd&(0xff>>(8-offset))|(m<<offset);
 235   4                       WriteData(Wt);
 236   4               Page++;
 237   4               n++;
 238   4               tmp=m;
 239   4               m=HZK_12[n];
 240   4               Rd=ReadData();
 241   4             Rd=ReadData();
C51 COMPILER V7.07   12864                                                                 09/12/2008 07:31:04 PAGE 5   

 242   4               Wt=tmp>>(8-offset)|(m<<offset)|(Rd&(0xff<<(offset+4)));
 243   4                       WriteData(Wt);
 244   4                       Col++;
 245   4                       Page--;
 246   4             n++;
 247   4            }
 248   3         }
 249   2         else
 250   2         {
 251   3             for(i=12;i>0;i--)
 252   3                       {
 253   4                         Rd=ReadData();
 254   4             Rd=ReadData();
 255   4                 m=HZK_12[n];
 256   4                     Wt=Rd&(0xff>>(8-offset))|(m<<offset);
 257   4                         WriteData(Wt);
 258   4                 Page++;

⌨️ 快捷键说明

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