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

📄 液晶显示2.c

📁 此程序使用单片机C言语编写的液晶显示及键盘输出程序
💻 C
字号:
#include <reg52.h>

#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long

sbit LCM_RS=P3^2; //定义LCD引脚
sbit LCM_E=P3^4;
#define LCM_Data P0


sbit Key_Data=P3^5; //定义Keyboard引脚
sbit Key_CLK=P3^3;


//#define DDS_Word P0   //定义DDS控制字接口
//sbit RESET_9852=P1^1;
//sbit PD1=P1^5;
//sbit PD2=P1^6;
//sbit FQ_UD=P1^7;

//sbit W_CLK=P3^6;
//sbit RD_CLK=P3^7;

//sbit A0=P2^0;
//sbit A1=P2^1;
//sbit A2=P2^2;
//sbit A3=P2^3;
//sbit A4=P2^4;
//sbit A5=P2^5;
//sbit EN0=P2^6;
//sbit EN1=P2^7;

#define predefine 131   //2^32除以DDS晶振频率(32.768MHz)

void LCMInit(void);
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
void Delay5Ms(void);
void Delay400Ms(void);
//void Decode(unsigned char ScanCode);
void WriteDataLCM(unsigned char WDLCM);
void WriteCommandLCM(unsigned char WCLCM);

void UpdateData(void);
void UpdateLCM();
//void UpdateDDS(void);

uchar code table1[]={"Please enter the    "};
uchar code table2[]={"Frequency and Phase "};
uchar code num1[] = {".KM0123456789Hz"};
uchar code num2[] = {"abcdefghijklmnopqrstuvwxyz"};
uchar disp_freq[16];
uchar disp_freq_1[16];
uchar disp_freq_2[16];

uchar IntNum = 0; //中断次数计数
uchar KeyV; //键值
uchar BF=0; //标识是否有字符被收到
uchar fale=0;
ulong freq=0;
ulong word=0;

uint i,j,k=0,a=0;

/*----------------------------------主程序-------------------------------*/

void main()
{
    
	uchar c,q,d;
	Delay400Ms(); //启动等待,等LCM讲入工作状态
	LCMInit(); //LCM初始化
	LCMInit();
	LCMInit();
    
    IT1 = 0; //设外部中断1为低电平触发
	EX1 = 1; //开中断
	EA=1;
	i=0;
	
    
	
	//while(1);
	//DisplayListChar(0,0,"zhang xiao guang");
	 
	//Delay5Ms(); //延时

	// InitDDS();    //向DDS送入初设值

  if(!fale)
	{
	  while(!fale)
		{
			WriteCommandLCM(0x80);
			Delay5Ms();
			for(c=0;c<20;c++)
			{
			WriteDataLCM(table1[c]);
			Delay5Ms();		
			}
		
			WriteCommandLCM(0xc0);
			Delay5Ms();
			for(c=0;c<20;c++)
			{
			WriteDataLCM(table2[c]);
			Delay5Ms();		
			}
    	
	        for(c=0;c<20;c++)
			{
				WriteCommandLCM(0x18);
			  	//Delay5Ms();	
				Delay400Ms();	
			}	
		}
	}    
 		
	                    
              
	while(1)
	{
		
		do
		{
			if (BF)
			{
				if (i==0)
				{
					WriteCommandLCM(0x01); //清屏
					break;
				}
				else break;
			}
		}while(1);
			
		EA=0;
	    UpdateData();
		if (KeyV==0x5A)    //按下"Enter"更新频率
		{
			WriteCommandLCM(0x01);
		    Delay5Ms();
			a=0;
          
			for(d=0;d<q;d++)
            {DisplayOneChar(16-q+d,0,disp_freq_1[d]);
			;
            }
			for(d=0;d<j;d++)
            {
			 DisplayOneChar(16-j+d,1,disp_freq_2[d]);
            }
             
            if(k)              //计算频率控制字
		    
			{
              word=predefine*freq/10^(q-k);
             }
            word=predefine*freq;                        
			//UpdateDDS();             //更新DDS function to be completed
		    freq=0;     //清空数据缓冲区
			i=0;
            k=0;
         
		}
		else
		{
			i++;
   			UpdateLCM();      //更新LCD显示
			if ((KeyV==0x42) || (KeyV==0x3A) || (KeyV==0x33))
            {
				   if(!a)
					{
						q=i;
						a=1;
						i=0;
				    }
			}
	
        } 

		BF=0;       //按键标志归零 
		EA=1;       //重新开中断
	}
        

}



/*---------------------------------函数-----------------------------------*/

//写数据
void WriteDataLCM(unsigned char WDLCM) 
{
	LCM_Data = WDLCM;
	LCM_RS=1;
	
	LCM_E=0; //若晶振速度太高可以在这后加小的延时
	Delay5Ms();
	LCM_E=0; //延时
	LCM_E=1;
}

//写指令
void WriteCommandLCM(unsigned char WCLCM)
{
	LCM_Data = WCLCM;
	LCM_RS = 0;
	
	LCM_E = 0;
	Delay5Ms();
	LCM_E = 0;
	LCM_E = 1; 
}

void LCMInit(void) //LCM初始化
{
	LCM_Data=0;
	WriteCommandLCM(0x38); //三次显示模式设置,不检测忙信号
	Delay5Ms(); 
	WriteCommandLCM(0x38);
	Delay5Ms(); 
	WriteCommandLCM(0x38);
	Delay5Ms(); 

	WriteCommandLCM(0x38); //显示模式设置,开始要求每次检测忙信号
	Delay5Ms();
	WriteCommandLCM(0x08); //关闭显示
	Delay5Ms();
	WriteCommandLCM(0x01); //显示清屏 
	Delay5Ms();
	WriteCommandLCM(0x06); // 显示光标移动设置
	Delay5Ms();
	WriteCommandLCM(0x0C); // 显示开及光标设置
	Delay5Ms();
}

//按指定位置显示一个字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{

     Y&=0x1;
	 X&=0xF; //限制X不能大于15,Y不能大于1
	 if (Y) X|=0x40; //当要显示第二行时地址码+0x40;
	 X|=0x80; //算出指令码
	 WriteCommandLCM(X); //发命令字
	 WriteDataLCM(DData); //发数据
     

}

void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{
	unsigned char ListLength;

	ListLength = 0;
	Y &= 0x1;
	X &= 0xF; //限制X不能大于15,Y不能大于1
	while (DData[ListLength]>0x19) //若到达字串尾则退出
	{
		if (X <= 0xF) //X坐标应小于0xF
		{
			DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
			ListLength++;
			X++;
		}
	}
}

//5ms延时
void Delay5Ms(void)
{
	unsigned int TempCyc = 5552;

	while(TempCyc--);
}

//400ms延时
void Delay400Ms(void)
{
	unsigned char TempCycA = 3;
	unsigned int TempCycB;

	while(TempCycA--)
	{
		TempCycB=7269;
		while(TempCycB--);
	}
}
void Keyboard_out(void) interrupt 2
{
	if ((IntNum > 0) && (IntNum < 9))
	{ 
		KeyV = KeyV >> 1; //因键盘数据是低>>高,结合上一句所以右移一位
		if (Key_Data) KeyV = KeyV | 0x80; //当键盘数据线为1时为1到最高位
	}
	IntNum++;
	while (!Key_CLK); //等待PS/2CLK拉高

	if (IntNum > 10)
	{
		IntNum = 0; //当中断11次后表示一帧数据收完,清变量准备下一次接收
		BF = 1; //标识有字符输入完了
		fale=1;
		EA = 0; //关中断等显示完后再开中断
	}
}

void UpdateData(void)
{
	switch (KeyV)
	{
		case 0x45:   // 按下"0"
		freq=freq*10+0;
		disp_freq[i]='0';
		break;
		case 0x16:   // 按下"1"
		freq=freq*10+1;
		disp_freq[i]='1';
		break;
		case 0x1E:   // 按下"2"
		freq=freq*10+2;
		disp_freq[i]='2';
		break;
		case 0x26:   // 按下"3"
		freq=freq*10+3;
		disp_freq[i]='3';
		break;
		case 0x25:   // 按下"4"
		freq=freq*10+4;
		disp_freq[i]='4';
		break;
		case 0x2E:   // 按下"5"
		freq=freq*10+5;
		disp_freq[i]='5';
		break;
		case 0x36:   // 按下"6"
		freq=freq*10+6;
		disp_freq[i]='6';
		break;
		case 0x3D:   // 按下"7"
		freq=freq*10+7;
		disp_freq[i]='7';
		break;
		case 0x3E:   // 按下"8"
		freq=freq*10+8;
		disp_freq[i]='8';
		break;
		case 0x46:   // 按下"9"
		freq=freq*10+9;
		disp_freq[i]='9';
		break;
		case 0x49:   // 按下"."
		disp_freq[i]='.';
		k=i;
		break;
		case 0x33:   //按下"h"
		freq=freq*1;
		disp_freq[i]='H';
		disp_freq[i=i+1]='z';
        break;
		case 0x42:   // 按下"k"
		freq=freq*1000;
		disp_freq[i]='K';
		disp_freq[i=i+1]='H';
		disp_freq[i=i+1]='z';
		break;
		case 0x3A:   // 按下"m"
		freq=freq*1000000;
		disp_freq[i]='M';
	    disp_freq[i=i+1]='H';
        disp_freq[i=i+1]='z';	
		break;
		case 0x1c: disp_freq[i]='a';
		break;
		case 0x32: disp_freq[i]='b';
		break;
		case 0x21: disp_freq[i]='c';
		break;
		case 0x23: disp_freq[i]='d';
		break;
		case 0x24: disp_freq[i]='e';
		break;
		case 0x2b: disp_freq[i]='f';
		break;
		case 0x34: disp_freq[i]='g';
		break;
		//case 0x33: disp_freq[i]='h';
		//break;
		case 0x43: disp_freq[i]='i';
		break;
		case 0x3b: disp_freq[i]='j';
		break;
		//case 0x42: disp_freq[i]='k';
		//break;
		case 0x4b: disp_freq[i]='l';
		break;
		//case 0x3a: disp_freq[i]='m';
		//break;
		case 0x31: disp_freq[i]='n';
		break;
		case 0x44: disp_freq[i]='o';
		break;
		case 0x4d: disp_freq[i]='p';
		break;
		case 0x15: disp_freq[i]='q';
		break;
		case 0x2d: disp_freq[i]='r';
		break;
		case 0x1b: disp_freq[i]='s';
		break;
		case 0x2c: disp_freq[i]='t';
		break;
		case 0x3c: disp_freq[i]='u';
		break;
		case 0x2a: disp_freq[i]='v';
		break;
		case 0x1d: disp_freq[i]='w';
		break;
		case 0x22: disp_freq[i]='x';
		break;
		case 0x35: disp_freq[i]='w';
		break;
		case 0x1a: disp_freq[i]='z';
		break;
		
	}
}

void UpdateLCM()
{
	int b,c,number1,number2;
     
   
       if(!a)
		 {
			for(b=0;b<i;b++)
		     {		
	          disp_freq_1[number1]=disp_freq[b];
			  DisplayOneChar(number1,0,disp_freq_1[number1]);
	          number1++;
		      }
				number1=0;
		  }
       else	
	      {  
					
			  for(c=0;c<i;c++)
			   { 
		         
		            disp_freq_2[number2]=disp_freq[c]; 		
		            DisplayOneChar(c,1,disp_freq[c]);		
                    number2++;
		        
			    }
                 number2=0;
		         j=i;
		   }
	
}

/*void UpdateDDS(void)
{
	int j;
    unsigned char CON[5];

	RESET_9852=0;
	RESET_9852=1;
	RESET_9852=0;

	FQ_UD=0;
	CON[0]=0x00;
	for(j=4;j>0;j--)
	{
		CON[j]=word;
		word=word>>8;
	}
	for(j=0;j<5;j++)
	{
		W_CLK=0;
		DDS_Word=CON[j];
		W_CLK=1;
	}
	FQ_UD=1;
}*/

⌨️ 快捷键说明

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