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

📄 5.2.3-1.lst

📁 《单片机C语言编程与实例的代码.rar
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V6.20c  5_2_3_1                                                               09/02/2001 14:49:03 PAGE 1   


C51 COMPILER V6.20c, COMPILATION OF MODULE 5_2_3_1
OBJECT MODULE PLACED IN 5.2.3-1.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 5.2.3-1.c DEBUG OBJECTEXTEND

stmt level    source

   1          #include<reg51.h>
   2          #include<math.h>
   3          #include<INTRINS.H>
   4          #define Uchar unsigned char
   5          /*注:8031的晶振频率为12MHz*/
   6          /***********液晶显示器接口引脚定义***************/
   7          sbit	Elcm=P2^7;	
   8          sbit	CSALCM=	P2^2;
   9          sbit	CSBLCM=	P2^3;
  10          sbit	Dilcm=P2^0;
  11          sbit	Rwlcm=P2^1;
  12          sfr 	Datalcm=0x80;				/*数据口*/
  13          /***********常用操作命令和参数定义***************/
  14          #define	 DISPON		0x3f		/*显示on*/
  15          #define	 DISPOFF		0x3e		/*显示off	*/
  16          #define	 DISPFIRST	0xc0		/*显示起始行定义*/
  17          #define	 SETX		0x40		/*X定位设定指令(页)*/
  18          #define	 SETY		0xb8		/*Y定位设定指令(列)*/
  19          #define	 Lcdbusy		0x80		/*LCM忙判断位*/
  20          
  21          /**************显示分区边界位置*****************/
  22          #define	 MODL		0x00		/*左区*/
  23          #define	 MODM		0x40		/*左区和中区分界*/
  24          #define	 MODR		0x80		/*中区和右区分界*/
  25          #define	LCMLIMIT	0xC0		/*显示区的右边界*/
  26          
  27          /****************全局变量定义*******************/
  28          Uchar col,row,cbyte;				/*列x,行(页)y,输出数据*/
  29          bit xy;						/*画线方向标志:1水平*/
  30          
  31          /*****************函数列表**********************/
  32          void Lcminit(void);				/*液晶模块初始化*/
  33          void Delay(Uchar);				/*延时,入口数为Ms	*/
  34          void lcdbusyL(void);				/*busy判断、等待(左区)*/
  35          void lcdbusyM(void);				/*busy判断、等待(中区)*/
  36          void lcdbusyR(void);				/*busy判断、等待(右区)*/
  37          void Putedot(Uchar);				/*半角字符输出*/
  38          void Putcdot(Uchar);				/*全角(汉字)输出*/
  39          void Wrdata(Uchar);				/*数据输出给LCM*/
  40          void Lcmcls( void );				/*LCM全屏幕清零(填充0)	*/
  41          void wtcom(void);				/*公用busy等待*/
  42          void Locatexy(void);				/*光标定位*/
  43          void WrcmdL(Uchar);				/*左区命令输出	*/
  44          void WrcmdM(Uchar);				/*中区命令输出	*/
  45          void WrcmdR(Uchar);				/*右区命令输出	*/
  46          void Putstr(Uchar *puts,Uchar i);		/*中英文字符串输出*/
  47          void Rollscreen(Uchar x);			/*屏幕向上滚动*/
  48          void Rddata(void);				/*从液晶片上读数据*/
  49          void Linehv(Uchar length);			/*横(竖)方向画线*/
  50          void point(void);					/*打点*/
  51          void Linexy(Uchar endx,Uchar endy);
  52          
  53          /******************数组列表*********************/
  54          Uchar code Ezk[];				/*ASCII常规字符点阵码表	*/
  55          Uchar code Hzk[];				/*自用汉字点阵码表*/
C51 COMPILER V6.20c  5_2_3_1                                                               09/02/2001 14:49:03 PAGE 2   

  56          Uchar code STR1[];				/*自定义字符串*/
  57          Uchar code STR2[];
  58          Uchar code STR3[];
  59          Uchar code STR4[];
  60          
  61          /****************************************主程序*****************************************/
  62          void main(void)
  63          {
  64   1       	Uchar x;
  65   1      	col=0;
  66   1      	row=0;
  67   1      	Delay(40);					/*延时大约40Ms,等待外设准备好*/
  68   1      	Lcminit();					/*液晶模块初始化,包括全屏幕清屏*/
  69   1      	Putstr(STR1,12);				/*第一行字符输出,12字节*/
  70   1      	col=0;
  71   1      	row=2;
  72   1      	Putstr(STR2,14);				/*第二行字符输出,14字节*/
  73   1      	col=0;
  74   1      	row=4;
  75   1      	Putstr(STR3,11);				/*第三行字符输出,11字节*/
  76   1      	col=0;
  77   1      	row=6;
  78   1      	Putstr(STR4,12);				/*第四行字符输出,12字节*/
  79   1      	x=0;
  80   1      	col=0;
  81   1      	row=0;
  82   1      	xy = 1;					/*方向标志。定为水平方向*/
  83   1      	Linehv(192);				/*画一条横线(0,0)-(191,0)*/
  84   1      	col=0;
  85   1      	row=15;
  86   1      	xy = 1;
  87   1      	Linehv(192);				/*画一条横线(0,15)-(191,15)*/
  88   1      	col=0;
  89   1      	row=32;
  90   1      	xy = 1;
  91   1      	Linehv(192);				/*画一条横线(0,32)-(191,32)*/
  92   1      	col=0;
  93   1      	row=1;
  94   1      	xy = 0;					/*方向标志。定为垂直方向*/
  95   1      	Linehv(31);				/*画一条竖线(0,1)-(0,31)*/
  96   1      	col=191;
  97   1      	row=1;
  98   1      	xy = 0;
  99   1      	Linehv(31);				/*画一条竖线(191,1)-(191,31)*/
 100   1      	col=0;					/*设定斜线的起点坐标*/
 101   1      	row=63;
 102   1      	Linexy(44,31);				/*画一段斜线(0,63)-(44,31)	*/
 103   1      	col=44;
 104   1      	row=31;
 105   1      	Linexy(190,62);				/*继续画斜线(44,31)-(191,63)*/
 106   1      	while(1){
 107   2      		Rollscreen(x);			/*定位新的显示起始行*/
 108   2      		x++;
 109   2      		Delay(100);			/*延时,控制滚动速度*/
 110   2      		};
 111   1      }
 112          
 113          /***********************画线,任意方向的斜线,不支持垂直的或水平线***********************/
 114          void Linexy(Uchar endx,Uchar endy)
 115          {
 116   1      	register Uchar t;
 117   1      	int xerr=0,yerr=0,delta_x,delta_y,distance;
C51 COMPILER V6.20c  5_2_3_1                                                               09/02/2001 14:49:03 PAGE 3   

 118   1      	Uchar incx,incy;
 119   1      	delta_x=endx-col; 			/*计算两个方向的距离*/
 120   1      	delta_y=endy-row;
 121   1      	if(delta_x>0) incx=1; 			/*计算增量方向,增量为0表示既不是垂直线也不是水平线*/
 122   1      	else if( delta_x==0 ) incx=0;
 123   1      		else incx=-1;
 124   1      	if(delta_y>0) incy=1;
 125   1      	else if( delta_y==0 ) incy=0;
 126   1      		else incy=-1;
 127   1      	delta_x = cabs( delta_x ); 		/* 判定哪个距离比较大*/
 128   1      	delta_y = cabs( delta_y );
 129   1      	if( delta_x > delta_y ) distance=delta_x;
 130   1      	else distance=delta_y;
 131   1      /*开始画线*/
 132   1      	for( t=0;t <= distance+1; t++ ) {
 133   2      		point();
 134   2       	   xerr += delta_x ;
 135   2      		yerr += delta_y ;
 136   2      		if( xerr > distance ) {
 137   3      			xerr-=distance;
 138   3       		    col+=incx;
 139   3      		}
 140   2      		if( yerr > distance ) {
 141   3      			yerr-=distance;
 142   3       		    row+=incy;
 143   3      		}
 144   2      	}
 145   1      }
 146          
 147          /***************************画线,只提供X或Y方向的,不支持斜线*************************/
 148          void Linehv(Uchar length)
 149          	{
 150   1      		Uchar xs,ys;
 151   1      		if (xy){ys = col;
 152   2      			for (xs=0;xs<length;xs++){
 153   3      					col = ys + xs;
 154   3      					point();}
 155   2      				}
 156   1      		else	{xs = row;
 157   2      			for (ys=0;ys<length;ys++)
 158   2      {
 159   3      					row = xs + ys;
 160   3      					point();}
 161   2      				 }
 162   1      }
 163          
 164          /*****************************************画点******************************************/
 165          void point(void)
 166          	{
 167   1      		Uchar x1,y1,x,y;
 168   1      		x1=col;
 169   1      		y1=row;
 170   1      		row=y1>>3;			/*取Y方向分页地址*/
 171   1      		Rddata();
 172   1      		y=y1&0x07;			/*字节内位置计算*/
 173   1      		x=0x01;
 174   1      		x=x<<y;				/*移入所画点*/
 175   1      		Wrdata(cbyte|x);			/*画上屏幕*/
 176   1      		col=x1;				/*恢复xy坐标*/
 177   1      		row=y1;
 178   1      	}
 179          
C51 COMPILER V6.20c  5_2_3_1                                                               09/02/2001 14:49:03 PAGE 4   

 180          /**************************************屏幕滚动定位*************************************/
 181          void Rollscreen(Uchar x)
 182          	{
 183   1      		cbyte = DISPFIRST|x;		/*定义显示起始行为x?*/
 184   1      		WrcmdL(cbyte);
 185   1      		WrcmdM(cbyte);
 186   1      		WrcmdR(cbyte);
 187   1      	}
 188          
 189          /**************************************一个字串的输出***********************************/
 190          void Putstr(Uchar *puts,Uchar i)
 191          	{
 192   1      		Uchar j,X;
 193   1      		for (j=0;j<i;j++)
 194   1      		{
 195   2      		X = puts[j];
 196   2      			if (X&0x80)
 197   2      				{
 198   3      					Putcdot(X&0x7f);/*只保留低7位*/
 199   3      				}
 200   2      			else Putedot(X-0x20);		/*ascii码表从0x20开始*/
 201   2      		}
 202   1      	}
 203          
 204          /*********************************半角字符点阵码数据输出********************************/
 205          void Putedot(Uchar Order)
 206          	{
 207   1      	Uchar i,bakerx,bakery;			/*共定义4个局部变量*/
 208   1      	int x;						/*偏移量,字符量少的可以定义为UCHAR	*/
 209   1      	bakerx = col;				/*暂存x,y坐标,已备下半个字符使用*/
 210   1      	bakery = row;
 211   1      	x=Order * 0x10;				/*半角字符,每个字符16字节*/
 212   1      /*上半个字符输出,8列*/
 213   1      	for(i=0;i<8;i++)
 214   1      		{
 215   2      		cbyte = Ezk[x];			/*取点阵码,rom数组*/

⌨️ 快捷键说明

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