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

📄 lcd1602_刷新显示.c

📁 用keil 51平台编译通过 源代码里面含自建字库的创建和应用 文件里面有1602液晶的详细资料
💻 C
字号:
#include "reg51.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define nop _nop_()
#define  CYCLE 50000
#define DB0_DB7 P0
/*"(桃心)This is a demo for 51 controlling 1602LCD!"的代码表*/
static const uchar code table[]={0x00,
				 					0x54,0x68,0x69,0x73,
                                 	0x20,0x69,0x73,0x20,
			         			0x61,0x20,0x64,0x65,
			         			0x6d,0x6f,0x20,0x66,
			         			0x6f,0x72,0x20,0x35,
			         			0x31,0x40,0x63,0x6f,
			         			0x6e,0x74,0x72,0x6f,
			         			0x6c,0x6c,0x69};
static const uchar code table1[]={0x31,0x32,
									0x34,0x36};
static const uchar code CGRAM_ADD[]={0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47};	//造字地址
static const uchar code CGRAM[]={0x0a,0x15,0x11,0x06,0x04,0x00,0x00,0x00};	//造字数据	

sbit RS=P2^7;
sbit RW=P2^6;
sbit E=P2^5;
uchar Dataflag,Cmdflag;
uint counti,counti1;
void init();
void Write(uchar tempdata);               /*写命令函数*/
void WriteDDR(uchar tempdata);      	  /*写数据函数*/
void CheckBusy();                         /*查询1602状态函数*/
void Delay(uint N);                       /*延时程序*/
void main(void)
{
	TMOD=0x11;                       /*TIMER0工作在MODE1*/
    TH0=(65536-CYCLE)/256;            /*设定TIMER0每隔CYCLEμs中断一次*/
  	TL0=(65536-CYCLE)%256;
	TH1=(65536-CYCLE)/256;            /*设定TIMER0每隔CYCLEμs中断一次*/
  	TL1=(65536-CYCLE)%256;
	TR0=1;
	TR1=1;
    IE=0x8a;
	init();
	counti=0;
	counti1=0;
	while(1)
	nop;
}
void Delay(uint N)        	 	  /*延时子程序*/
{
	uint i;
	for(i=0;i<N;i++)
	{
		i=i;
	}
}
void init()                    		 /*1602初始化子程序*/
{
	RS=0;
	RW=0;
	E=1;
    	Write(0x38);
    	Delay(1000);
	Write(0x38);
    	Delay(1000);
	Write(0x38);
	Write(0x0C);
	Write(0x01);
	Write(0x0c);
	Write(0x06);
	Write(0x01);                          /*预清屏*/
}
void Write(uchar tempdata)      /*1602写命令子程序*/
{
	DB0_DB7=tempdata;
	RS=0;
	RW=0;
	E=0;
	nop;
	E=1;
	nop;
	CheckBusy();
}
void WriteDDR(uchar tempdata)     /*1602写数据子程序*/
{
	DB0_DB7=tempdata;
	RS=1;
	nop;
	RW=0;
	E=0;
	nop;
	E=1;
	nop;
	CheckBusy();
}
void CheckBusy()                            /*1602查忙状态子程序*/
{
 	uchar temp;
	DB0_DB7=0xff;
	RW=1;
	RS=0;
	E=0;
	nop;
	E=1;
	do
	{
		nop;
        	temp=DB0_DB7;
	}while((temp&0x80)==0x80);
	RW=0;
} 
void service_int0 () interrupt 1 using 2     /*Timer0中断子程序*/
{
	static uchar s_Counter;
	
	TR0=0;
	TF0=0;
	if(s_Counter<=7)			//写入CGRAM
	{
		Write(CGRAM_ADD[s_Counter]);
		WriteDDR(CGRAM[s_Counter]);
	}
	if(s_Counter==7)
		Write(0x80);
	s_Counter++;
	if(s_Counter>=8)                           /*判断一秒到否*/
    	{
        	if(counti<16)                                 /*未到屏幕第一行的末尾*/ 
			{
				WriteDDR(table[counti]);
	    		counti++;
			}
			else if(counti==16)
			{	
				Write(0xc0);
             	WriteDDR(table[counti]);
	        	counti++;
			}
			else if(counti>16 && counti<(sizeof(table)))      /*到达屏幕第一行的末尾,开始滚动显示直至字符串末尾*/
			{
	        	WriteDDR(table[counti]);
	        	counti++;
			}	
		}
	TH0=(65536-CYCLE)/256;        /*设定TIMER0每隔CYCLEμs中断一次*/
	TL0=(65536-CYCLE)%256;
	if(counti<(sizeof(table)))
		TR0=1;
}

void service_int1 () interrupt 3 using 3
{
	static uchar s_Counter1=0;
	
	TR1=0;
	TF1=0;
	s_Counter1++;
	if(s_Counter1>=20)                           /*判断一秒到否*/
    {
        if(s_Counter1%50==0)
   		{	
			Write(0xc4);
			WriteDDR(table1[counti1]);
			counti1++;
			WriteDDR(table1[counti1]);
			if(counti1>=(sizeof(table1)))
				counti1=0;
		}
	}
	TH1=(65536-CYCLE)/256;        /*设定TIMER0每隔CYCLEμs中断一次*/
	TL1=(65536-CYCLE)%256;
	TR1=1;
}

⌨️ 快捷键说明

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