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

📄 main.c

📁 PIC单片机驱动1602液晶屏的C程序。
💻 C
字号:
#include  <pic16f877A.h>
/*单片机与LCD1602连接数据线定义*/
#define Uchar         unsigned char
#define Uint          unsigned int
#define LCD_DATA      PORTD
#define TRIS_LCD_DATA TRISD
#define LCD_BUSY     RD7
#define BZ           RC3
#define TRISBZ       TRISC3
#define NOP()		asm("nop")



#define LCD_RS         RC0   		/* PORT for RS */
#define TRIS_LCD_RS    TRISC0   	/* TRIS for RS */

#define LCD_RW         RC1   		/* PORT for RW */
#define TRIS_LCD_RW    TRISC1    	/* TRIS for RW */

#define LCD_EN         RC2   		/* PORT for EN */
#define TRIS_LCD_EN    TRISC2    	/* TRIS for EN */


/*-------------------1602液晶命令定义-------------------*/

/*初始化命令*/
#define DISP_CLR			0x01	/*清显示,光标复位到第一行首(地址00H)*/
#define CUR_HOME			0x02	/*光标复位,光标返回到第一行首*/

/*光标和显示模式设置*/
#define CUR_AUTO_R			0b00000110	/*设置光标在文字插入后自动右移*/
#define CUR_AUTO_L			0b00000100	/*设置光标在文字插入后自动左移*/
#define DISP_AUTO_R		    0b00000111 	/*设置显示在文字插入后自动右移*/
#define DISP_AUTO_L		    0x00000101 	/*设置显示在文字插入后自动左移*/

/*显示开关控制*/
#define DISP_ON			    0b00001111	/*显示开*/
#define DISP_OFF			0b00001011	/*显示关*/
#define CUR_ON			    0b00001111	/*光标开*/
#define CUR_OFF			    0b00001101	/*光标关*/
#define BLINK_ON			0b00001111	/*光标闪烁开*/
#define BLINK_OFF			0b00001110	/*光标闪烁关*/

/*光标或显示移位*/
#define CUR_SHIFT_L		    0b00010000	/*光标左移*/
#define CUR_SHIFT_R		    0b00010100	/*光标右移*/
#define DISP_SHIFT_L		0b00011000	/*显示左移*/
#define DISP_SHIFT_R		0b00011100	/*显示右移*/


/*工作模式设置*/
#define LCD_MODE_STD		    0x38		/*1602标准工作模式:8位数据传送,2行显示,字符点阵5*7*/


/*字符发生器RAM地址设置*/
#define SET_ADDR_CGRAM			0x40	/*设置CGRAM地址*/

/*数据存储器地址设置*/
#define SET_ADDR_DDRAM			0x80	/*设置DDRAM地址*/

/*自定义字符*/
#define USER_CHAR1				0x00/*自定义字符1:年*/
#define USER_CHAR2				0x01/*自定义字符2:月*/
#define USER_CHAR3				0x02/*自定义字符3:日*/
#define USER_CHAR4				0x03/*自定义字符4:¥*/
#define USER_CHAR5				0x04/*自定义字符5:元*/
#define USER_CHAR6				0x05/*自定义字符6:℃*/
#define USER_CHAR7				0x06/*自定义字符7:↑*/
#define USER_CHAR8				0x07/*自定义字符8:小喇叭图标*/
Uchar  cdis1[ ] = {"Key Number:     "};
Uchar  cdis2[ ] = {"In Dc:         v"};
Uint  ADData=0x00;
/********************************************************/
/*                                                  
/* 延时t毫秒 
/* 11.0592MHz时钟,延时约1ms                                     
/*                                                      
/********************************************************/
void Delay(Uint t)
{                           
   Uchar k;
   while(t--)
   {
     for(k=0; k<125; k++)
     {
     NOP();
     }
   }
}

/********************************************************/
void DelayB(Uchar x)    //x*0.14MS
 {
   Uchar i;
   while(x--)
   {
     for (i=0; i<6; i++)
     {
     NOP();
     }
   }
 }
/*蜂名器*/
void Beep()
{
Uint i;
TRISBZ=0;
for(i=0;i<1000;i++)
{
BZ=!BZ;
DelayB(1);
}

}
void wait_until_LCDready() /*检测忙标志,忙则等待*/
{  
   TRIS_LCD_RS=0;
   TRIS_LCD_RW=0;
   TRIS_LCD_EN=0;	/*单片机的LCD数据口设置为全输出*/
   LCD_EN=0;/*此句必须加,否则后面RS RW输出电平后,液晶屏出现光标复位的现象*/
   LCD_RS=0;
   LCD_RW=1;
   LCD_EN=1;/*读状态的时候,E始终保持高电平即可*/
   NOP();
   NOP();
   NOP();
   NOP();
   TRIS_LCD_DATA=0x0ff;/*设置单片机LCD数据引脚全为输入*/
    	while(LCD_BUSY==1);/*LCD忙,则原地等待*/
        LCD_EN=0;
} 
void LCD_wrcmd(Uchar cmd)/*写入控制命令*/
{
   NOP();/****/
   wait_until_LCDready();
   NOP();/****/
   TRIS_LCD_RS=0;
   TRIS_LCD_RW=0;
   TRIS_LCD_EN=0;/*单片机的LCD数据口设置为全输出*/
   NOP();/****/
   LCD_EN=0;
   NOP();/****/
   LCD_RS=0;
   NOP();/****/
   LCD_RW=0;
   NOP();/****/
   TRIS_LCD_DATA=0x00;/*设置单片机LCD数据引脚全为输出*/
   NOP();/****/
   NOP();/****/
   NOP();/****/
   LCD_DATA=cmd;
   NOP();/****/
   LCD_EN=1;
   NOP();;/****/
   NOP();
   LCD_EN=0;
   NOP();/****/
}

void LCD_wrchar(Uchar data)/*写入要显示的字符*/
{
   NOP();/****/
   wait_until_LCDready();
   NOP();/****/
   TRIS_LCD_RS=0;
   TRIS_LCD_RW=0;
   TRIS_LCD_EN=0;	/*单片机的LCD数据口设置为全输出*/
   NOP();/****/
   LCD_RS=1;
   LCD_RW=0;
   LCD_EN=0;
   NOP();/****/
   TRIS_LCD_DATA=0x00;/*设置单片机LCD数据引脚全为输出*/
   NOP();/****/
   NOP();/****/
   NOP();/****/
   LCD_DATA=data;
   NOP();/****/
   NOP();/****/
   NOP();/****/
   NOP();/****/
   LCD_EN=1;
   NOP();/****/
   NOP();
   NOP();/****/
   NOP();/****/
   LCD_EN=0;
   NOP();/****/
}

void LCD_setxy(char x,char y) /*设定显示位置,行x=1/2,列y=1~16的任意整数*/
{
    	char temp;
    	if(x==1)
  	{
	  	temp=0x80+y-1;
  		LCD_wrcmd(temp);
  	}
 	else
  	{
	  	temp=0xC0+y-1;
  		LCD_wrcmd(temp);
  	}
}

void LCD_Init()
{   
   	TRIS_LCD_RW=0;/*设置单片机LCD控制引脚全为输出*/
	TRIS_LCD_RS=0;
	TRIS_LCD_EN=0;
   	LCD_wrcmd(0x38);/*LCD标准工作模式:8位数据传送,2行显示,字符点阵5*7*/
    Delay(5);/*延时5ms*/
    LCD_wrcmd(0x0c);/*显示开,关光标 */
	Delay(5);
   	LCD_wrcmd(0x06);/*移动光标 */
	Delay(5);
   	LCD_wrcmd(0x01);/*清除LCD的显示内容*/
	Delay(50);

}
void AD_Init()
{
ADCON0=0x41;      /*  选择A/D通道为RA0,打开A/D转换器,在工作状态,A/D转换时间为8Tosc*/
ADCON1=0x82;      /*   转换结果右移,及ADRESH的寄存器的高6位为0,RA0为模拟输入,vdd为Vref+*/
//PIE1=0x00;
//PIE2=0x00;
ADIE=1;          /* A/D转换中断允许*/
PEIE=1;          /* 外围中断允许*/
GIE=1 ;           /* 允许全局中断*/
TRISA0=1;        /* 允许RA0输入*/
 ADGO=1;            //启动A/D转换
}
void DIS_AD(Uint advalues)
{
Uchar m;
Uint n;
advalues=(advalues*50)/1023;
m=advalues/10;
n=advalues%10;
LCD_setxy(2,8); 
LCD_wrchar(0x30+m);
LCD_wrchar(0x2e);
LCD_wrchar(0x30+n);
if(advalues>=25)
{
Beep();
}
}
void main()
{   
    Uchar m;
    LCD_Init();
    AD_Init();
    LCD_setxy(1,1);                //设置显示位置为第一行的第1个字符
     m =0;
   while(cdis1[m] != '\0')
    {                         //显示字符
    LCD_wrchar(cdis1[m]);
     m++;
    }
    LCD_setxy(2,1);                //设置显示位置为第二行的第1个字符
     m =0;
   while(cdis2[m] != '\0')
    {                         //显示字符
    LCD_wrchar(cdis2[m]);
     m++;
    }
m=0;
Beep();
while(1)
{

 LCD_setxy(1,13);                //设置显示位置为第一行的第1个字符
     m ++;
if(m>=10)
{
m=0;
}
    LCD_wrchar(0x30+m);
    DIS_AD(ADData);
    Delay(100);
}
}
void interrupt    adint(void)
{
 ADIF=0;            //清除中断标志
 ADData=ADRESH;
 ADData<<=8;
 ADData|=ADRESL;
 ADGO=1;            //启动下一次A/D转换
  
}

⌨️ 快捷键说明

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