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

📄 main.lst

📁 实现AT89C52的LM12864的显示
💻 LST
字号:
C51 COMPILER V8.08   MAIN                                                                  11/29/2008 23:51:17 PAGE 1   


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

line level    source

   1          //========================================
   2          //---------   小波电子工作室   -----------
   3          //      LM4229 液晶显示驱动程序 
   4          //  作者:聂金波   完成日期:2008/0/05 
   5          //  四川师范大学 电子工程学院 2005级5级
   6          //  改进:2008/08/08增加显示5个32*32汉字程序
   7          //        2008/08/10增加显示a*b大小照片(a为8的倍数)
   8          //----------------------------------------
   9          //   本程序参考proteus仿真论坛:http://proteus.5d6d.com一个网友
  10          // 写的LCD240*128显示程序,在此表示感谢!
  11          //=========================================
  12          
  13          
  14          #include<AT89X52.h>
  15          #include<en_code.h>
  16          #include<cn_code.h>
  17          
  18          #define uchar unsigned char
  19          #define uint  unsigned int
  20          #include<picture.h>
  21          #define DATA_PORT P0
  22          
  23          //-------------------------------------------
  24          //              管脚定义   
  25          //------------------------------------------
  26          sbit HALT=P2^0;   //暂不清楚
  27          sbit FS1=P2^1;    //字体模式选择
  28          sbit MD2=P2^2;    //方式选择
  29          sbit RST=P2^3;    //复位
  30          sbit CD=P2^4;     //数据(L)/命令(H)选择
  31          sbit READ=P2^5;     //读,低电平有效
  32          sbit WRIT=P2^6;     //写,低电平有效
  33          sbit CE=P2^7;     //使能,低电平有效
  34          
  35          //===========================================
  36          //              函数声明
  37          //-------------------------------------------
  38          void delay_lcd(uchar);
  39          void write_data(uchar);
  40          void write_com(uchar);
  41          void clr_lcd(uchar,uchar,uint);
  42          
  43          
  44          
  45          //--------------------------------------------
  46          //              延时函数
  47          //--------------------------------------------
  48          void delay_lcd(uchar t)
  49          {
  50   1       for(;t!=0; t--);
  51   1      }
  52          
  53          //--------------------------------------------
  54          //              写数据函数
  55          //--------------------------------------------
C51 COMPILER V8.08   MAIN                                                                  11/29/2008 23:51:17 PAGE 2   

  56          void write_data(uchar dat)
  57          {
  58   1       CD=0;          //数据
  59   1       CE=0;          //LCD使能
  60   1       WRIT=0;        //写
  61   1       DATA_PORT=dat; //把数据送到P口
  62   1       delay_lcd(1);      //当晶振较高时加延时
  63   1       WRIT=1;        //关写
  64   1       CE=1;          //关使能
  65   1      }
  66          
  67          
  68          //--------------------------------------------
  69          //              写命令函数
  70          //--------------------------------------------
  71          void write_com(uchar com)
  72          {
  73   1       CD=1;    //命令
  74   1       CE=0;
  75   1       WRIT=0;
  76   1       DATA_PORT=com;
  77   1       delay_lcd(1);    //当晶振较高时加延时
  78   1       WRIT=1;
  79   1       CE=1;
  80   1      }
  81          
  82          
  83          //--------------------------------------------
  84          //           指定位置、长度清屏
  85          //--------------------------------------------
  86          void clr_lcd(uchar x,uchar y,uint length)
  87          {
  88   1       uint i,place;
  89   1       place=x*30+y;
  90   1       write_data(place&0xff);
  91   1       write_data(place/256);
  92   1       write_com(0x24);        //设置
  93   1       for(i=0;i<length;i++)
  94   1       write_data(0xff);          //写入空格,清屏
  95   1       write_com(0xb2);        //关闭自动写
  96   1      }
  97          
  98          
  99          //--------------------------------------------
 100          //         指定位置向LCD写入指定字符
 101          //
 102          //
 103          //--------------------------------------------
 104          void write_lcd(uchar x,uchar y,char *cha)
 105          {
 106   1        uint place,i=0;
 107   1        uchar length,c1,c2,j,k;
 108   1        for(length=0;cha[length]!=0;length++);
 109   1         do
 110   1          {
 111   2            c1=cha[i];      //取字符串的ASCII码
 112   2            c2=cha[i+1];
 113   2            place=x*30+y;
 114   2            if(c1<=128)        //#####小于128为字符,大于128为汉字
 115   2             {
 116   3              for(k=0;k<16;++k)     //字符设置为16*8
 117   3              {
C51 COMPILER V8.08   MAIN                                                                  11/29/2008 23:51:17 PAGE 3   

 118   4                write_data(place&0xff);   //写入地址高位
 119   4                write_data(place/256);    //写入地址低位
 120   4                write_com(0x24);          //地址设置
 121   4                write_com(0xb0);          //设置数据自动写
 122   4                write_data(ASC_MSK[(c1-0x20)*16+k]); /*---例如:0的ASCII码为0x30,
 123   4                //在ASC_MSK中的位置为0x10*16 ---16字节字码依次写入LCD---   */
 124   4                write_com(0xb2);          //自动复位
 125   4                place=place+30;
 126   4              }
 127   3              if(y>28)            //y>28时候需要换行
 128   3                {x=x+16;y=0;}
 129   3              else                //否则,不换行,继续写下一个字符
 130   3                {y++;}
 131   3                 i++;
 132   3            }
 133   2           else                   //#####c1大于128为汉字
 134   2            {
 135   3              for(j=0;j<sizeof(GB_16)/sizeof(GB_16[0]);j++)  //找到汉字
 136   3               {
 137   4                 if(c1==GB_16[j].Index[0]&&c2==GB_16[j].Index[1])
 138   4                 break;            //汉字找到则跳出   
 139   4               }
 140   3              if(j<sizeof(GB_16)/sizeof(GB_16[0]))   //------如果汉字在子码表内
 141   3               {
 142   4                for(k=0;k<16;k++)     //字符设置为16*8
 143   4                 {
 144   5                  write_data(place&0xff);   //写入地址高位
 145   5                  write_data(place/256);    //写入地址低位
 146   5                  write_com(0x24);          //地址设置
 147   5                  write_com(0xb0);          //设置数据自动写
 148   5                  write_data(GB_16[j].Msk[k*2]);
 149   5                                 write_data(GB_16[j].Msk[k*2+1]); //16*16,每行2字节
 150   5                  write_com(0xb2);                 //自动复位
 151   5                  place=place+30;                  //下一行
 152   5                 }
 153   4               }
 154   3              else             //-----没找到对应汉字则涂黑
 155   3               {
 156   4                for(k=0;k<16;k++)     //字符设置为16*8
 157   4                 {
 158   5                  write_data(place&0xff);   //写入地址高位
 159   5                  write_data(place/256);    //写入地址低位
 160   5                  write_com(0x24);          //地址设置
 161   5                  write_com(0xb0);          //设置数据自动写
 162   5                  write_data(0xff);
 163   5                              write_data(0xff); 
 164   5                  write_com(0xb2);             //自动复位
 165   5                  place=place+30;              //下一行
 166   5                 }
 167   4               }
 168   3              if(y>27)      //-------换行
 169   3               {x+=16;y=0;}
 170   3              else          //--------不用换行,则下一个字
 171   3               {y+=2;}
 172   3               i+=2;
 173   3            } 
 174   2          }
 175   1         while(i<length);
 176   1      } 
 177          
 178          
 179          //--------------------------------------------
C51 COMPILER V8.08   MAIN                                                                  11/29/2008 23:51:17 PAGE 4   

 180          //         LM4229初始化函数
 181          //--------------------------------------------
 182          void lcd_init()
 183          {
 184   1              FS1 = 0;//fs1管脚高电平时表示字体为8*6;
 185   1                  //低电平时为8*8
 186   1              MD2 = 0;
 187   1              HALT = 0;
 188   1              write_data(0); 
 189   1              write_data(0);        //图形首地址
 190   1              write_com(0x42);     //图形首地址设置 
 191   1              write_data(30);
 192   1              write_data(0);
 193   1              write_com(0x43);     //图形区域设置
 194   1              write_com(0x80);     //设置为OR模式
 195   1              write_com(0x9a);    //关闭文本显示,开图形显示
 196   1      }
 197          
 198          //========================================================
 199          //--------------------------------------------
 200          //         LM4229在指定位置显示32*32汉字
 201          //--------------------------------------------
 202          
 203          void write_pic(uchar x,uchar y)
 204          {
 205   1       uint place;
 206   1       uchar i,n;
 207   1       place=x*30+y;
 208   1      
 209   1       for(n=0;n<5;n++)   //5个汉字
 210   1       {
 211   2         for(i=0;i<32;i++)   //32*32
 212   2          {
 213   3           write_data(place&0xff);
 214   3           write_data(place/256);
 215   3           write_com(0x24);  //设置地址
 216   3           write_com(0xb0);  //设置数据自动写
 217   3           write_data(tab_pic[4*i+0+128*n]);
 218   3           write_data(tab_pic[4*i+1+128*n]);
 219   3           write_data(tab_pic[4*i+2+128*n]);
 220   3           write_data(tab_pic[4*i+3+128*n]);
 221   3           write_com(0xb2);    //自动复位
 222   3           place=place+30;
 223   3          }
 224   2         place=x*30+y+4*(n+1);
 225   2       }
 226   1      }       
 227          //===============================================
 228          
 229          //--------------------------------------------
 230          //         LM4229在指定位置显示a*b图片
 231          //     a为图片长,b为图片宽(a为8的倍数)
 232          //--------------------------------------------
 233          void write_image(uchar x,uchar y,uchar a,uchar b,uchar *tab_image)
 234          {
 235   1        uint place;
 236   1        uchar i,j;
 237   1        place=x*30+y;
 238   1        for(i=0;i<b;i++)        //b行数据
 239   1        {
 240   2          write_data(place&0xff);   //写地址低8位
 241   2          write_data(place/256);    //写地址高8位
C51 COMPILER V8.08   MAIN                                                                  11/29/2008 23:51:17 PAGE 5   

 242   2          write_com(0x24);  //设置地址
 243   2          write_com(0xb0);  //设置数据自动写
 244   2          for(j=0;j<a/8;j++)    //a/8列数据
 245   2          {write_data(tab_image[(a/8)*i+j]);}
 246   2          write_com(0xb2);    //自动复位
 247   2          place=place+30;     //换行
 248   2        }
 249   1      }
 250          
 251          //==============================================
 252          void main(){
 253   1              uchar count=40;
 254   1                lcd_init();
 255   1              write_lcd(10,2,"------------------------------");
 256   1              write_lcd(102,2,"------------------------------");
 257   1              write_lcd(22,1,"北京奥运同北京奥运");
 258   1              write_image(33,12,80,72,tab_image_h);
 259   1       while(1){
 260   2              if(P3_3==0){
 261   3                       delay_lcd(255);
 262   3                       if(P3_3==0){
 263   4                              count+=10;
 264   4                              write_lcd(count,2,"北京奥运");
 265   4                              while(P3_3==0);
 266   4                       }
 267   3              }
 268   2       }
 269   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1015    ----
   CONSTANT SIZE    =   4942    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      26
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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