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

📄 main.lst

📁 LED汉字显示屏控制电路部分的程序代码。接收来自PC机的串口数据
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V7.50   MAIN                                                                  09/19/2008 13:23:34 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN F:\PROJECT\CPROJE~1\LED汉~1\CONTRO~1\MAIN.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE F:\PROJECT\CPROJE~1\LED汉~1\CONTRO~1\MAIN.C DB SB OE

line level    source

   1          #include "fun.h"
   2          #include <ABSACC.H>
   3          /************针对FM1808存储区的变量*******/
   4          data  uint  BufAddr1;   //范围:0X7800~0X7FFF(2KBytes)
   5                                 //内容:存放从PC主机串口传来的数据
   6          data  uint  BufCount1;  //对从PC主机串口传来的数据计数
   7          data  uint  BufAddr2;   //范围:0X7000~0X7FFF(4KBytes)
   8                                 //内容:存放点阵显示数据的字库地址
   9          data  uint  BufCount2;  //
  10          data  uint  BufAddr3;   //范围:0X0000~0X6FFF(28KBytes)
  11                                 //内容:存放点阵显示的数据
  12          data  uint  BufCount3;  //
  13          
  14          data  uint  T0Count;       //UART有否超时的定时计数
  15          
  16          bdata uchar Flag;
  17          sbit  FlagUART    = Flag^0;  //TRUE有串口中断,FALSE无串口中断
  18          sbit  FlagFont    = Flag^1;  //TRUE显示24*24字体,FALSE显示16*16字体
  19          sbit  FlagDisp    = Flag^2;  //TRUE滚动显示,FALSE只显示一屏
  20          
  21          data  uint  TotalRow;      //总共需显示的行数
  22          data  uint  CurrentRow;    //fm1808当前行
  23          data  uchar StartRow;      //各显示单元的扫描起始行
  24          
  25          data union
  26          {ulong addr;
  27           struct
  28           {uchar nonaddr;
  29            uchar p1;
  30            uint  p2p0;
  31           }port;
  32          }ziku;
  33          
  34          /***************************************************************/
  35          
  36          void kmg(void)
  37          {KMG=0;
  38   1       KMG=1;
  39   1      }
  40          
  41          void delay(uint i)
  42          {while(i!=0)i--;
  43   1      }
  44          
  45          void t0_init(void)
  46          {TMOD&=0xf0;
  47   1       TMOD|=0x01;  //定时器T0,方式1
  48   1       TL0=0x00;
  49   1       TH0=0x00;
  50   1       TCON|=0x10;   //TF1TR1TF0TR0IE1IT1IE0IT0;TR0=1
  51   1       ET0=1;
  52   1       EA=1;
  53   1      }
  54          
  55          void to_interrupt(void) interrupt 1 using 1
C51 COMPILER V7.50   MAIN                                                                  09/19/2008 13:23:34 PAGE 2   

  56          {TH0=0x00;
  57   1       TL0=0x00;
  58   1       if(++T0Count>20)
  59   1       {FlagUART=FALSE;
  60   2        TR0=0;
  61   2        ET0=0;
  62   2        ES=0;
  63   2       }
  64   1      }
  65          
  66          void uart_init(void)
  67          {PCON=0x00;   //SMOD--------GF1GF0PDIDL=00000000;波特率未加倍
  68   1       TMOD&=0x0f;
  69   1       TMOD|=0x20;   //定时器T1,方式2
  70   1       TL1=0xfd;    //波特率9600
  71   1       TH1=0xfd;
  72   1       SCON=0x50;   //SM0SM1SM2RENTB8RB8TIRI=01010000B;串口方式1
  73   1       TCON|=0x40;  //TF1TR1TF0TR0IE1IT1IE0IT0;TR1=1
  74   1       IP=0x10;     //--------PSPT1PX1PT0PX0=00010000B;串口中断优先
  75   1       ES=1;
  76   1       EA=1;
  77   1      }
  78          
  79          void uart_interrupt(void) interrupt 4 using 2
  80          {if(RI==1)
  81   1       {if(!FlagUART)
  82   2        {FlagUART=TRUE;
  83   3         BufCount1=0;
  84   3         BufAddr1=BUFHEAD1;
  85   3        }
  86   2        P1=CS;
  87   2        XBYTE[BufAddr1++]=SBUF;
  88   2        BufCount1++;
  89   2        T0Count=0;
  90   2        RI=0;
  91   2       }
  92   1       else TI=0;
  93   1      }
  94          
  95          uchar rd_fm1808(uint addr)
  96          {P1=CS;
  97   1       return(XBYTE[addr]);
  98   1      }
  99          
 100          void wr_fm1808(uint addr,uchar dat)
 101          {P1=CS;
 102   1       XBYTE[addr]=dat;
 103   1      }
 104          
 105          void blankfm1808(void)
 106          {uint tempw;
 107   1       tempw=0;
 108   1       while(tempw<BUFHEAD1)
 109   1       {wr_fm1808(tempw,0);
 110   2        tempw++;
 111   2       }
 112   1      }
 113          
 114          void hanzi_addr(uchar qm,uchar wm)
 115          {ulong offset;
 116   1       offset=(ulong)(wm-0xa1);
 117   1       offset+=(ulong)((qm-0xb0)*94);
C51 COMPILER V7.50   MAIN                                                                  09/19/2008 13:23:34 PAGE 3   

 118   1       if(FlagFont)
 119   1       {offset*=72;
 120   2        offset+=BIG_FONT_HEAD;
 121   2        ziku.port.p2p0=(uint)offset;
 122   2        ziku.port.p1=(uchar)(offset>>16);
 123   2        ziku.port.p1&=0X0F;
 124   2        ziku.port.p1|=CS2;
 125   2       }
 126   1       else
 127   1       {offset*=32;
 128   2        offset+=SMALL_FONT_HEAD;
 129   2        ziku.port.p2p0=(uint)offset;
 130   2        ziku.port.p1=(uchar)(offset>>16);
 131   2        ziku.port.p1&=0X0F;
 132   2        ziku.port.p1|=CS1;
 133   2       }
 134   1      }
 135          
 136          void half_addr(uchar qm,uchar wm)
 137          {ulong offset;
 138   1       offset=wm;
 139   1       offset=(ulong)(qm-32);
 140   1       if(FlagFont)
 141   1       {offset*=72;
 142   2        ziku.port.p2p0=(uint)offset;
 143   2        ziku.port.p1=(uchar)(offset>>16);
 144   2        ziku.port.p1&=0X0F;
 145   2        ziku.port.p1|=CS2;
 146   2       }
 147   1       else
 148   1       {offset*=32;
 149   2        ziku.port.p2p0=(uint)offset;
 150   2        ziku.port.p1=(uchar)(offset>>16);
 151   2        ziku.port.p1&=0X0F;
 152   2        ziku.port.p1|=CS1;
 153   2       }
 154   1      }
 155          
 156          void full01_addr(uchar qm,uchar wm)
 157          {ulong offset;
 158   1       offset=(ulong)(wm-0xa1);
 159   1       offset+=(ulong)((qm-0xa1)*94);
 160   1       if(FlagFont)
 161   1       {offset*=72;
 162   2        ziku.port.p2p0=(uint)offset;
 163   2        ziku.port.p1=(uchar)(offset>>16);
 164   2        ziku.port.p1&=0X0F;
 165   2        ziku.port.p1|=CS3;
 166   2       }
 167   1       else
 168   1       {offset*=32;
 169   2        offset+=FULL01_FONT16_HEAD;
 170   2        ziku.port.p2p0=(uint)offset;
 171   2        ziku.port.p1=(uchar)(offset>>16);
 172   2        ziku.port.p1&=0X0F;
 173   2        ziku.port.p1|=CS1;
 174   2       }
 175   1      }
 176          
 177          void full03_addr(uchar qm,uchar wm)
 178          {ulong offset;
 179   1       offset=(ulong)(wm-0xa0);
C51 COMPILER V7.50   MAIN                                                                  09/19/2008 13:23:34 PAGE 4   

 180   1       offset+=(ulong)((qm-0xa3)*94);
 181   1       if(FlagFont)
 182   1       {offset*=72;
 183   2        offset+=FULL03_FONT24_HEAD;
 184   2        ziku.port.p2p0=(uint)offset;
 185   2        ziku.port.p1=(uchar)(offset>>16);
 186   2        ziku.port.p1&=0X0F;
 187   2        ziku.port.p1|=CS3;
 188   2       }
 189   1       else
 190   1       {offset*=32;
 191   2        offset+=FULL03_FONT16_HEAD;
 192   2        ziku.port.p2p0=(uint)offset;
 193   2        ziku.port.p1=(uchar)(offset>>16);
 194   2        ziku.port.p1&=0X0F;
 195   2        ziku.port.p1|=CS1;
 196   2       }
 197   1      }
 198          
 199          void wrzikuaddr(void)
 200          {uchar tempb;
 201   1       uint tempw;
 202   1       tempw=BufAddr2+BufCount2++;
 203   1       tempb=ziku.port.p1;
 204   1       wr_fm1808(tempw,tempb);
 205   1       tempw=BufAddr2+BufCount2++;
 206   1       tempb=(uchar)(ziku.port.p2p0>>8);
 207   1       wr_fm1808(tempw,tempb);
 208   1       tempw=BufAddr2+BufCount2++;
 209   1       tempb=(uchar)(ziku.port.p2p0);
 210   1       wr_fm1808(tempw,tempb);
 211   1      }
 212          
 213          void wrbblank(void)
 214          {uint tempw;
 215   1       tempw=BufAddr2+BufCount2++;
 216   1       wr_fm1808(tempw,BBLANKP1);
 217   1       tempw=BufAddr2+BufCount2++;
 218   1       wr_fm1808(tempw,BBLANKP2);
 219   1       tempw=BufAddr2+BufCount2++;
 220   1       wr_fm1808(tempw,BBLANKP0);
 221   1      }
 222          
 223          void wrsblank(void)
 224          {uint tempw;
 225   1       tempw=BufAddr2+BufCount2++;
 226   1       wr_fm1808(tempw,SBLANKP1);
 227   1       tempw=BufAddr2+BufCount2++;
 228   1       wr_fm1808(tempw,SBLANKP2);
 229   1       tempw=BufAddr2+BufCount2++;
 230   1       wr_fm1808(tempw,SBLANKP0);
 231   1      }
 232          
 233          void code_analyse(void)
 234          {uchar qm,wm;
 235   1       FlagFont=FALSE;   //默认为16*16字体
 236   1       BufAddr2=BUFHEAD2;
 237   1       BufCount2=0;
 238   1       BufAddr1=BUFHEAD1;
 239   1       while(BufCount1)
 240   1       {kmg();
 241   2        if(BufAddr1<(BufAddr2+100))
C51 COMPILER V7.50   MAIN                                                                  09/19/2008 13:23:34 PAGE 5   

 242   2        {break;
 243   3        }
 244   2        BufCount1--;
 245   2        qm=rd_fm1808(BufAddr1++);
 246   2        if(qm>=32&&qm<=126)    //半角标点符号
 247   2        {switch(qm)
 248   3         {case ASCII_SF:if(BufCount2==0)   //16*16
 249   4                        {wr_fm1808(BufAddr2,SFLAGFONT);
 250   5                         BufCount2++;
 251   5                        }
 252   4                        else if(!FlagFont)
 253   4                        {half_addr(qm,wm);
 254   5                         wrzikuaddr();
 255   5                         if(BufCount2>48)
 256   5                         {BufAddr2+=50;
 257   6                          BufCount2=0;
 258   6                         }
 259   5                        }
 260   4                        else
 261   4                        {while(BufCount2<=30)
 262   5                         {wrbblank();
 263   6                         }
 264   5                         BufAddr2+=50;
 265   5                         BufCount2=0;
 266   5                        }
 267   4                        FlagFont=FALSE;
 268   4                        break;
 269   4          case ASCII_BF:if(BufCount2==0)   //24*24
 270   4                        {wr_fm1808(BufAddr2,BFLAGFONT);
 271   5                         BufCount2++;
 272   5                        }
 273   4                        else if(FlagFont)
 274   4                        {half_addr(qm,wm);
 275   5                         wrzikuaddr();
 276   5                         if(BufCount2>30)
 277   5                         {BufAddr2+=50;
 278   6                          BufCount2=0;
 279   6                         }
 280   5                        }
 281   4                        else
 282   4                        {while(BufCount2<=48)
 283   5                         {wrsblank();
 284   6                         }
 285   5                         BufAddr2+=50;
 286   5                         BufCount2=0;

⌨️ 快捷键说明

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