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

📄 lcd_main.lst

📁 89c51的一个小程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V6.12  LCD_MAIN                                                               08/01/2005 20:10:26 PAGE 1   


C51 COMPILER V6.12, COMPILATION OF MODULE LCD_MAIN
OBJECT MODULE PLACED IN C:\DOCUME~1\ADMINI~1\MYDOCU~1\89C51\LCD_MAIN.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE C:\DOCUME~1\ADMINI~1\MYDOCU~1\89C51\LCD_MAIN.C DB SB OE

stmt level    source

   1          
   2          #include <AT89x51.H>
   3          #include <STRING.H>
   4          #include <INTRINS.H>
   5          
   6          #define LCM_RW P1_7 //定义引脚
   7          #define LCM_RS P1_6
   8          #define LCM_E P3_4
   9          #define LCM_Data P0
  10          #define Busy 0x80 //用于检测LCM状态字中的Busy标识
  11          
  12          #define Key_UP            P2_0    //上调温度
  13          #define Key_DOWN          P2_1    //下调温度
  14          #define Key_SET           P2_2    //设定键(温度设定,长按开电源)
  15          #define RelayOutPort      P2_6    //继电器输出
  16          #define tjrout		  			P1_5
  17          #define TMPort			  		P1_1	  //DS1820 DataPort
  18          #define optin							P2_3   //光藕开入
  19          unsigned char code LCDDis[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x20,0x2d}; //0-9的ASCII码,
             -0x20为空,0x2d为负号
  20          
  21          unsigned char i,j,cj,cj2,rs,rs2,tjrx,k;
  22          
  23          static unsigned char bdata StateREG;	//可位寻址的状态寄存器
  24          sbit DS1820ON = StateREG^0;	          //DS1820是否存在
  25          sbit SetTF = StateREG^1;              //是否是在温度设置状态
  26          sbit KeySETDown = StateREG^2;         //是否已按过SET键标识
  27          sbit PowTF = StateREG^3;              //电源标识
  28          sbit KeyTF = StateREG^4;		    //键盘是否允许
  29          
  30          //sbit KeySETDowning = StateREG^5;			//SET是否正在按下
  31          static unsigned char bdata TLV _at_ 0x0029;         //温度变量高低位
  32          static unsigned char bdata THV _at_ 0x0028;
  33          static signed char TMV;       //转换后的温度值
  34          static unsigned char KeyV,TempKeyV;      //键值
  35          static signed char TMRomV _at_ 0x0027;    //高温限制
  36          static signed char TMSetV _at_ 0x0026;    //温度设定值
  37          static unsigned char KSDNum;    //SET键连按时的采集次数
  38          static unsigned char IntNum,IntNum2,IntNum3;    //中断发生次数,IntNum用于SET长按检测,IntNum2用于设定状态
             -时LCD闪烁
  39          static signed char LCD_One,LCD_Two,LCD_Three;  //LCD的显示位 LCD_One为十位,LCD_Two为个位
  40          static signed char count_One,count_Two,count_Three,count_cj2;  //LCD的显示位 LCD_One为十位,LCD_Two为个位
  41          static signed char LCD_One_set,LCD_Two_set,LCD_Three_set;	//设置时的LCD值
  42          static unsigned char Sign, Sign_Set; //负号标识
  43          static unsigned char ss,ss2,ss3; //负号标识
  44          
  45          void WriteDataLCM(unsigned char WDLCM);
  46          void WriteCommandLCM(unsigned char WCLCM,BuysC);
  47          unsigned char ReadDataLCM(void);
  48          unsigned char ReadStatusLCM(void);
  49          void LCMInit(void);
  50          void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
  51          void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
  52          void Delay5Ms(void);
  53          void Delay400Ms(void);
C51 COMPILER V6.12  LCD_MAIN                                                               08/01/2005 20:10:26 PAGE 2   

  54          unsigned char code relays_s[] =	{"Relay Status:   "};
  55          unsigned char code cdle_net[] = {"    WellCome!   "};
  56          unsigned char code test_ok[] = {"  Test Over! :) "};
  57          unsigned char code email[] = {" Press Power Key"};
  58          unsigned char cur_temper[]={"Current Temp:   "};
  59          unsigned char cur_count[]= {"Tjr Count :     "};
  60          unsigned char cur_temper_set[]={"T_Set:          "};
  61          unsigned char code null[] 		={"                "};
  62          
  63          unsigned char BF = 0;	//定时中断标志,=1时显示当前温度值,=0显示欢迎
  64          
  65          void main(void)
  66          {
  67   1      	void InitDS1820(void);   //定义函数
  68   1      	void ROMDS1820(void);
  69   1      	void TMVDS1820(void);
  70   1      	void TMRDS1820(void);
  71   1      	void TMWDS1820(void);
  72   1      	void dtod(void);
  73   1      	void TMREDS1820(void);
  74   1      	void TMERDS1820(void);
  75   1      	void ReadDS1820(void);
  76   1      	void WriteDS1820(void);
  77   1      	void Delay_510(void);
  78   1      	void Delay_110(void);
  79   1      	void Delay_10ms(void);
  80   1      	void Delay_4s(void);
  81   1      	void V2ToV(void);
  82   1      	void tjr(void);
  83   1      
  84   1      	StateREG = 0;   //初始化变量
  85   1      	//SetTF = 1;	
  86   1      	PowTF = 1;			//关电源
  87   1      	//KeyTF = 1;
  88   1          tjrout=1;
  89   1      	tjrx=0;
  90   1      	cj	=0;
  91   1      	cj2 =0;
  92   1      	k		=0;
  93   1      	THV = 0;
  94   1      	TLV = 0;
  95   1      	TMV = 0;
  96   1      	KeyV = 0;
  97   1      	TempKeyV = 0;
  98   1      	KSDNum = 0;
  99   1      	IntNum = 0;
 100   1      	IntNum2 = 0;
 101   1      	IntNum3 = 0;
 102   1      	InitDS1820(); //初始化
 103   1      	ROMDS1820(); 	//跳过ROM
 104   1      	TMERDS1820();  //E2PRAM中温度上限值调入RAM
 105   1      	InitDS1820(); //初始化
 106   1      	ROMDS1820(); 	//跳过ROM
 107   1      	TMRDS1820(); 	//读出温度指令
 108   1      	ReadDS1820(); //读出温度值和上限值
 109   1      	TMSetV = TMRomV;  //拷贝保存在DS18B20ROM里的上限值到TMSetV
 110   1      	Delay400Ms(); //启动等待,等LCM讲入工作状态
 111   1      	LCMInit(); //LCM初始化
 112   1      	Delay5Ms(); //延时片刻(可不要)
 113   1      	EA = 1;					//允许CPU中断
 114   1      	ET0 = 1; 				//定时器0中断打开
 115   1      	ET1 = 1;
C51 COMPILER V6.12  LCD_MAIN                                                               08/01/2005 20:10:26 PAGE 3   

 116   1      	TMOD = 0x11;			//设定时器0为模式1,16位模式
 117   1      	TH0=0xB1;
 118   1      	TL0=0xDF;				//设定时值为20000us(20ms)
 119   1      	TH1=0xB1;
 120   1      	TL1=0xDF;				//设定时值为20000us(20ms)
 121   1      	TR0 = 1;				//开始定时
 122   1        TR1 = 1;
 123   1      	do
 124   1      		{
 125   2      			if (BF==2)
 126   2      			{
 127   3      				
 128   3      				
 129   3      				DisplayListChar(0, 1, test_ok);	//显示欢迎信息
 130   3      				DisplayListChar(0, 0, null);	
 131   3      				DisplayListChar(0, 2, null);
 132   3      				DisplayListChar(0, 3, null);
 133   3      				Delay_4s();
 134   3      				//for (j=0;i<4;j++)
 135   3      				//{
 136   3      				for (i=0;i<16;i++)
 137   3      						{
 138   4      							Delay_10ms();
 139   4      							Delay_10ms();									
 140   4      							DisplayOneChar(j,1,null[i]);//LCD的第二行显示设置温度和继电器状态
 141   4      							Delay_10ms();									
 142   4      												}
 143   3      				//}
 144   3      				 PowTF = 1;         //电源标识关  
 145   3      					EA=0;
 146   3      					BF=0;
 147   3      					cj=0;
 148   3      					cj2=0;
 149   3      					tjrout=1;
 150   3      				
 151   3      				}
 152   2      			if (BF==0)
 153   2      				{
 154   3      					for (j=0;j<4; j++)
 155   3      					{
 156   4      					for (i=0;i<16;i++)
 157   4      						{
 158   5      							Delay_10ms();				
 159   5      							DisplayOneChar(i,j,null[i]);//LCD的第二行显示设置温度和继电器状态
 160   5      					//		DisplayOneChar(i,1,null[i]);
 161   5      						//	DisplayOneChar(i,2,null[i]);
 162   5      							//DisplayOneChar(i,3,null[i]);
 163   5      							//Delay_10ms();
 164   5      							//Delay_10ms();									
 165   5      							
 166   5      				}
 167   4      			 		}
 168   3      					DisplayListChar(0, 0, cdle_net);	//显示欢迎信息
 169   3      					DisplayListChar(0, 1, email);
 170   3      					DisplayListChar(0, 2, null);
 171   3      					DisplayListChar(0, 2, null);
 172   3      					Delay_4s();
 173   3      					//PowTF = 1;
 174   3      					EA=1;
 175   3      					cj=0;
 176   3      					cj2=0;
 177   3      					tjrout=1;
C51 COMPILER V6.12  LCD_MAIN                                                               08/01/2005 20:10:26 PAGE 4   

 178   3      									}
 179   2      			if (BF==1)
 180   2      				{
 181   3      					for (i=0;i<16;i++)
 182   3      					{	
 183   4      							DisplayOneChar(i,0,cur_temper[i]);//LCD的第1行显示当前温度
 184   4      						}				
 185   3      					for (i=0;i<16;i++)
 186   3      						{
 187   4      							DisplayOneChar(i,1,cur_temper_set[i]);//LCD的第二行显示设置温度和继电器状态
 188   4      						}
 189   3      						//ReadDataLCM();//测试用句无意义	
 190   3      					for (i=0;i<16;i++)
 191   3      					{
 192   4      						DisplayOneChar(i,2,cur_count[i]);
 193   4      						}
 194   3      					for (i=0;i<13;i++)
 195   3      					{
 196   4      						DisplayOneChar(i,3,relays_s[i]);
 197   4      						}	
 198   3      					DisplayOneChar(13,3,ss);
 199   3      					DisplayOneChar(14,3,ss2);
 200   3      					DisplayOneChar(15,3,ss3);
 201   3      					EA=1;
 202   3      							}
 203   2      
 204   2      }
 205   1      while(1);
 206   1      }
 207          //定时器1中断处理
 208          
 209          void tjrtime1(void) interrupt 3 using 3
 210          {
 211   1      	TH1=0xB1;
 212   1      	TL1=0xDF;				//设定时值为20000us(20ms)
 213   1      	dtod();
 214   1      	if (!optin)
 215   1      	{
 216   2      		rs++;
 217   2         			}
 218   1      	if (BF==1)
 219   1        {
 220   2      	  if(tjrx==50)
 221   2      	  {
 222   3      			tjrout=~tjrout;
 223   3      		 	tjrx=0;
 224   3      			if(cj==99)
 225   3      			{	
 226   4      				cj=0;
 227   4      				if(cj2==9)
 228   4      				{
 229   5      		 			cj2=0;
 230   5      		 			BF=2;
 231   5      									}
 232   4      		 cj2++;
 233   4      					}
 234   3      			cj++;
 235   3      		if(rs>40)
 236   3      		{
 237   4      			rs2=1;
 238   4      			rs=0;
 239   4      						}
C51 COMPILER V6.12  LCD_MAIN                                                               08/01/2005 20:10:26 PAGE 5   

 240   3      			else
 241   3      			rs2=0;
 242   3      			rs=0;
 243   3      						}
 244   2      			tjrx++;
 245   2      							}	
 246   1      		 if (rs2==1)   //根据采集到的继电器状态
 247   1      					{
 248   2      					ss =0x20;	//" "
 249   2      					ss2=0x4f;	//"O"
 250   2      					ss3=0x4e;	//"N"
 251   2      					}
 252   1      		  else
 253   1      					{
 254   2      						ss=0x4f;	//"O"
 255   2      						ss2=0x46;	//"F"
 256   2      						ss3=0x46;	//"F"
 257   2      					}
 258   1      
 259   1      	}
 260          //定时器0中断外理中键扫描和处理要显示的值
 261          void KeyAndDis_Time0(void) interrupt 1 using 2
 262          {
 263   1      	TH0=0xB1;
 264   1      	TL0=0xDF;				//设定时值为20000us(20ms)
 265   1      
 266   1      	if (!Key_UP)	KeyV = 1;
 267   1      	if (!Key_DOWN)	KeyV = 2;
 268   1      	if (!Key_SET)	KeyV = 3;
 269   1      	//KeySETDowning = 0;  //清除
 270   1      	if (KeyV != 0)      //有键按下
 271   1      		{
 272   2      			Delay_10ms();   //延时防抖  按下10ms再测
 273   2      			if (!Key_UP)	TempKeyV = 1;
 274   2      			if (!Key_DOWN)	TempKeyV = 2;
 275   2      			if (!Key_SET)	TempKeyV = 3;
 276   2      
 277   2      			if (KeyV == TempKeyV)   //两次值相等为确定接下了键
 278   2      				{
 279   3      					if (KeyV == 3)      //按下SET键,如在SET状态就退出,否则进入
 280   3      						{
 281   4      							//KeySETDowning = 1; //表明SET正在按下
 282   4      							PowTF = 0;      //电源标识开
 283   4      							if (!KeyTF)		//KeyTF=0,键盘允许
 284   4      								if (SetTF)
 285   4      									{
 286   5      										SetTF = 0;    //标识位标识退出设定
 287   5      										InitDS1820(); //初始化
 288   5      										ROMDS1820(); 	//跳过ROM
 289   5      										TMWDS1820(); 	//写温度上限指令
 290   5      										WriteDS1820(); 	//写温度上限到DS18B20ROM
 291   5      										WriteDS1820(); 	//写温度上限到DS18B20ROM
 292   5      										WriteDS1820(); 	//写温度上限到DS18B20ROM
 293   5      										InitDS1820(); //初始化
 294   5      										ROMDS1820(); 	//跳过ROM
 295   5      										TMREDS1820(); 	//温度上限值COPY回E2PRAM
 296   5      										
 297   5      										//	V2ToV();
 298   5      									}
 299   4      								else
 300   4      									SetTF = 1;
 301   4      							if (!KeySETDown) //没有第一次按下SET时,KeySETDown标识置1

⌨️ 快捷键说明

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