commc.lst

来自「郑州远博公司生产的单片机A型实验板原理图及配套试验源程序」· LST 代码 · 共 225 行

LST
225
字号
C51 COMPILER V7.20   COMMC                                                                 02/20/2005 14:59:35 PAGE 1   


C51 COMPILER V7.20, COMPILATION OF MODULE COMMC
OBJECT MODULE PLACED IN commc.OBJ
COMPILER INVOKED BY: C:\KEIL\C51\BIN\C51.EXE commc.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*======YB-51-A单片机通用实验板串口中断和液晶屏显示演示程序===========================
   2          在pc机上利用通用串口调试程序(在配套光盘上),发送的字符可以在液晶屏上显示出来,同时可以接收单片机回送的字
             -符
   3          注意:程序编译后,会出现警告提示,是由于有未调用的函数和有被多个程序调用的函数,在此不影响实验
   4          结果,暂可不用去理会。(可以通过屏蔽未调用的函数和把被多个程序调用的函数设为再入函数来解决)
   5          ======程序来源:远博科技  0371-6949037  13949105551  13603453895=======================
   6          ======日期:2004.9.8=====================*/
   7          /*===================================================================
   8          
   9          [注]:AT89C51的晶振频率为11.0592MHz
  10          ====================================================================*/
  11          
  12          /*            ACM1602A (16x2)接线图
  13          =====================================================================
  14          连接线图:   ACM-------51     ACM-------51     ACM--------51
  15                      DB0-----P0.0     DB4-----P0.4     RS-------P1_0
  16                      DB1-----P0.1     DB5-----P0.5     RW-------P1_1
  17                      DB2-----P0.2     DB6-----P0.6     E--------P1_2
  18                      DB3-----P0.3     DB7-----P0.7     BLA------P1_3
  19                      
  20                      VLCD接1K电阻到GND
  21          
  22          ====================================================================*/
  23          /*阅读本程序之前,请参考光盘上带的LCD1602的工作原理(长沙太阳人科技公司提供)*/
  24          
  25          #include <AT89X51.H>
  26          #include <Delay.h>
  27          #include <stdio.h>
  28          #include <Intrins.h>
  29          #define uchar unsigned char
  30          #define uint  unsigned int 
  31          
  32          // 1602连线
  33          #define RS    P1_0       //数据/命令选择
  34          #define RW    P1_1       //读/写选择
  35          #define Elcm  P1_2       //使能信号
  36          #define BLA   P1_3       //液晶显示屏背光
  37          
  38          #define DataPort P0      // 数据端口
  39          #define Busy    0x80
  40          void WaitForEnable( void );
  41          void LcdWriteData( char dataW );
  42          void LcdWriteCommand( uchar CMD,uchar AttribC ) ;
  43          void LcdReset( void ) ;
  44          void DispOneChar(uchar x,uchar y,uchar Wdata)  ;
  45          void ePutstr(uchar x,uchar y, uchar code *ptr) ;
  46          void comminit(void);
  47          void scomm(void);
  48          code char examp[]="serial communication test"; 
  49          uchar x=0,y=0,sedata;
  50          
  51          
  52           void main(void)      {
  53   1          DelayMs(1000);                      //延时,保证器件复位
  54   1          comminit();                          //串口初始化,打开串口中断
C51 COMPILER V7.20   COMMC                                                                 02/20/2005 14:59:35 PAGE 2   

  55   1          BLA=0;                               //打开液晶显示屏背光
  56   1          LcdReset();                         //液晶屏初始化
  57   1          ePutstr(0,0,examp);                 // 液晶屏显示一个预定字符串
  58   1              DelayMs(10000);     
  59   1          LcdReset();
  60   1          while(1);                           //无限循环。
  61   1                                  }
  62          
  63          
  64          /*=======================================================
  65          液晶屏上显示字符串
  66          =======================================================*/
  67          void ePutstr(uchar x,uchar y, uchar code *ptr) {
  68   1      uchar i,l=0;
  69   1          while (*ptr++ >0){l++;};       //统计字符的个数(c中,对于字符串而言,最后是以“\0”结束的,对应的ASC码
             -为零
  70   1              ptr=ptr-(l+1);                 //使指针重新指向首个字符
  71   1          for (i=0;i<l;i++)     { DispOneChar(x++,y,*ptr++);
  72   2                                  if ( x == 31 )  { x = 0; y ^= 0; }
  73   2                                 }
  74   1                                                      } 
  75          
  76          
  77          /*=======================================================
  78          显示光标定位
  79          =======================================================*/
  80          void Disp_XY( char posx,char posy) {
  81   1      
  82   1      uchar temp;
  83   1      
  84   1          temp = posx & 0x0f;
  85   1          posy &= 0x1;   
  86   1          if ( posx>15 )   temp |= 0x40;
  87   1              if (posy==1)   temp |=0x40;
  88   1          temp |= 0x80;
  89   1          LcdWriteCommand(temp,0);
  90   1      }
  91          
  92          /*=======================================================
  93          按指定位置显示数出一个字符
  94          =======================================================*/
  95          void DispOneChar(uchar x,uchar y,uchar Wdata)  {
  96   1      
  97   1          Disp_XY( x, y );                // 定位显示地址
  98   1          LcdWriteData( Wdata );            // 写字符
  99   1      }
 100          
 101          /*=======================================================
 102          初始化程序, 必须按照产品资料介绍的初始化过程进行
 103          =======================================================*/
 104          void LcdReset( void )  {
 105   1      
 106   1             LcdWriteCommand( 0x38, 0);            // 显示模式设置(不检测忙信号)
 107   1              DelayMs(10);
 108   1          LcdWriteCommand( 0x38, 0);            // 共三次
 109   1              DelayMs(10);
 110   1          LcdWriteCommand( 0x38, 0);
 111   1              DelayMs(10);
 112   1      
 113   1          LcdWriteCommand( 0x38, 1);            // 显示模式设置(以后均检测忙信号)
 114   1          LcdWriteCommand( 0x08, 1);            // 显示关闭
 115   1          LcdWriteCommand( 0x01, 1);            // 显示清屏
C51 COMPILER V7.20   COMMC                                                                 02/20/2005 14:59:35 PAGE 3   

 116   1          LcdWriteCommand( 0x06, 1);            // 显示光标移动设置
 117   1          LcdWriteCommand( 0x0c, 1);            // 显示开及光标设置
 118   1      }
 119          
 120          /*=======================================================
 121          写控制字符子程序: E=1 RS=0 RW=0
 122          =======================================================*/
 123          void LcdWriteCommand( uchar CMD,uchar AttribC )  {
 124   1      
 125   1          if (AttribC) WaitForEnable();                // 检测忙信号?
 126   1          RS=0; RW=0; _nop_();
 127   1          DataPort=CMD; _nop_();
 128   1          // 送控制字子程序
 129   1          Elcm=1;_nop_();_nop_();Elcm=0;            // 操作允许脉冲信号
 130   1      }
 131          
 132          /*=======================================================
 133          当前位置写字符子程序: E =1 RS=1 RW=0
 134          =======================================================*/
 135          void LcdWriteData( char dataW )  {
 136   1      
 137   1          WaitForEnable();
 138   1              // 检测忙信号
 139   1      
 140   1          RS=1; RW=0; _nop_();
 141   1      
 142   1          DataPort=dataW; _nop_();
 143   1      
 144   1          Elcm=1; _nop_(); _nop_(); Elcm=0;        // 操作允许脉冲信号
 145   1      
 146   1      }
 147          
 148          /*=======================================================
 149          正常读写操作之前必须检测LCD控制器状态:    CS=1 RS=0 RW=1
 150          DB7:    0  LCD控制器空闲; 1  LCD控制器忙
 151          ========================================================*/
 152          void WaitForEnable( void ) {
 153   1      
 154   1          DataPort = 0xff;
 155   1      
 156   1          RS=0; RW=1; _nop_();    Elcm=1; _nop_(); _nop_();
 157   1      
 158   1          while( DataPort & Busy );
 159   1          Elcm=0;
 160   1      }
 161          
 162          /********************************************************************************
 163                       串口中断服务程序,在中断中调用液晶屏显示程序
 164          *********************************************************************************/
 165          void scomm(void) interrupt 4 {     
 166   1                                while(!RI);  //判断是否接收完成
 167   1                                EA=0;
 168   1                                RI=0;
 169   1                                sedata=SBUF;     //保存数据
 170   1                                DispOneChar(x++,y,sedata);
 171   1                                if ( x == 32 )  { x = 0; y ^= 0; }  //显示到最后位置以后,重新开始从第一个位置显
             -示
 172   1                                SBUF=sedata;     //转发数据
 173   1                                while (!TI);  //判断是否发送完成
 174   1                                TI=0;
 175   1                                EA=1;
 176   1                                    }
C51 COMPILER V7.20   COMMC                                                                 02/20/2005 14:59:35 PAGE 4   

 177          /*********************************************************************************
 178                       串口初始化程序
 179          **********************************************************************************/                       
             - 
 180          void comminit(void)     {            
 181   1                                TMOD=0x20;   //定时器1方式2定时
 182   1                                TH1=0xfd;
 183   1                                TL1=0xfd;   //置定时器初值,选定9600bps
 184   1                                SCON=0x50;  //选择通讯方式1 (1位起始,8位数据,1位停止)
 185   1                                TR1=1;      //启动定时器
 186   1                                                        ET1=0;
 187   1                                ES=1;       //开串口中断
 188   1                                EA=1;       //开中断 
 189   1                               }
 190          
 191           


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    503    ----
   CONSTANT SIZE    =     26    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      3       9
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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