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

📄 2007620133251.c

📁 基于C8051F020的程序,实现LCD的简单显示
💻 C
字号:
/*
功能描述:本文件可以实现LCD的简单显示,包括十进制数字、字母、汉字、16进制数据
*/
#include <c8051f020.h>

#define uchar unsigned char
#define uint unsigned int 

sbit		CS	=	P3^6 ;	//PIN4		片选高有效		 P33
sbit		SID	=	P3^3;	//PIN5		串行输入		 P34
sbit		CLK	=	P3^2;	//PIN6		串行时钟,上升沿有效 	 P32
sbit		PSB	=	P3^1;	//PIN15		工作方式,低为串行	 P31
sbit 		RESET=	P3^0; 		//PIN17	    	复位,低有效

void delay1us(uchar t);//延时1us
void config(void);//配置单片机
void lcdini();					//初始化LCD
void sendbyte(bit RS,bit RW,short data8);		//发送一个字节的数据,可以是指令,可以是8位数据
void sendword(short place,int word);		//显示一个汉字
void sendnumber(short place,int number);		//显示一个十进制的数字
void dishex(uchar hexnum);//显示一个16进制的数据
void single(uchar addr,uchar num);//显示单个字符
void strings(uchar addr,uchar *str,uchar x);//显示字符串

 
//配置时要把相应的P口置为推挽


uchar num[16]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46};//0-f

void delay1us(uchar t)
{	uchar i,j;
	for(i=0;i<t;i++)
		for(j=0;j<200;j++);
}

void lcdini()								//初始化LCD
{
	unsigned int delay;	
	delay1us(40000);
	sendbyte(0,0,0x30);						//8位扩展指令
	delay1us(100);	
	sendbyte(0,0,0x30);						//8位扩展指令
	delay1us(37);	
	sendbyte(0,0,0x0C);						//整体显示
	delay1us(100);	
	sendbyte(0,0,0x01);							//清屏			
	delay1us(10000);	
	sendbyte(0,0,0x07);
	delay1us(40000);	
}

void sendbyte(bit RS,bit RW,short data8)		//向LCD输出指令
{
	short n;
	
	CLK=0;									//Init
	CS=1;

	for(n=0;n<5;n++)
	{										//Syn 5bit
		SID=1;
		CLK=1;
		CLK=0;
	}
											//RW 1bit
	SID=RW;
	CLK=1;
	CLK=0;

	SID=RS;									//RS 1bit
	CLK=1;
	CLK=0;

	SID=0;									//0  1bit
	CLK=1;
	CLK=0;

	for(n=7;n>3;n--)					    //DH4 8bit
	{
		SID=(data8>>n)&1;
		CLK=1;
		CLK=0;
	}
	for(n=0;n<4;n++)
	{
		SID=0;
		CLK=1;
		CLK=0;
	}

	for(n=3;n>-1;n--)						//DL4 8bit
	{
		SID=(data8>>n)&1;
		CLK=1;
		CLK=0;
	}
	for(n=0;n<4;n++)
	{
		SID=0;
		CLK=1;
		CLK=0;
	}
	CS=0;
}

/*
void sendword(short place,int word)			//输出一个字
{
//	short delay;

	sendbyte(0,0,place);					//位置
//	for(delay=0;delay<100;delay++);
	sendbyte(1,0,word>>8);					//高半字
//	for(delay=0;delay<100;delay++);
	sendbyte(1,0,word&0xFF);				//低半字
//	for(delay=0;delay<100;delay++);	
}
 */
 
 
/*
void sendnumber(short place,int number)	//显示数字结果
{
	short buffer1,buffer2,on=0;
	buffer1=(number/10000+0x30)*0x100;
	
	if(0x3000==buffer1) 
		buffer1=0x2000;
	else 
		on=1;
	buffer2=number%10000/1000+0x30;
	 
	if(0x30==buffer2&&0==on) 
		buffer1=0x2020;
	else
		{
			on=1;
			buffer1+=buffer2;
		}
		
	sendword(place,buffer1);
	place++;

	buffer1=(number%1000/100+0x30)*0x100;
	if(0x3000==buffer1&&0==on) 
		buffer1=0x2000;
	else 
		on=1;
	buffer2=number%100/10+0x30; 
	if(0x30==buffer2&&0==on) 
		buffer1=0x2020;
	else 
		buffer1+=buffer2;
	sendword(place,buffer1);
	place++;

	buffer1=(number%10+0x30)*0x100+0x20;
	sendword(place,buffer1);
}
*/

 
void single(uchar addr,uchar num)
{	sendbyte(0,0,addr);
	sendbyte(1,0,num);	
}

   
void strings(uchar addr,uchar *str,uchar x)
{	uchar i;
	sendbyte(0,0,addr);	
	for(i=0;i<x;i++) 
	{
		sendbyte(1,0,str[i]);	  
	}
}


void dishex(uchar hexnum)			//显示一位16进制
{	uchar hex[2];
	hex[1]=num[hexnum&0x0F];
	hex[0]=num[(hexnum&0xF0)>>4];
	strings(0x80,hex,2);
}



void config(void)
{	WDTCN=0xDE;
	WDTCN=0xAD;//禁止看门狗
	XBR0=0x00;
	XBR1=0x00;
	XBR2=0x40;//使能交叉开关
	P74OUT=0xFF;//P4—-P7设置为推挽方式
	OSCXCN=0x00;//禁止外部振荡器
	OSCICN=0x07;//使用内部时钟16Mz
}

void main()
{
	number[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
	letter[7]={0x41,0x42,0x43,0x44,0x45,0x46,0x47};
	chinese[8]={0xc5,0xf4,0xb8,0xe7,0xbb,0xb5,0xb5,0xb0};
	delay1us(10000);
	config();
	delay1us(10000);
	lcdini();															//显示初始化
	delay1us(10000);
	strings(0x80,number,10);													
//	strings(0x90,letter,7);
//	strings(0x88,chinese,8);
//	single(0x80,0x48);
//	sendword(0x80,0xced0);
//	sendnumber(0x80,12345);
//	dishex(0xced0);
	while(1);	
}


	

⌨️ 快捷键说明

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