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

📄 lcd.c

📁 c8051f020中使用液晶lcd的程序
💻 C
字号:
 
////////////////////////////////////////////////////



#include <c8051f020.h>    // SFR声明
#include <stdio.h>

#define SYSCLK   22118400   //定义系统时钟22.1184MHz
typedef unsigned int uint;
typedef unsigned char uchar;
typedef unsigned long ulong;



//接口定义////////////////////////////////////
sbit  LCDRS = P0^0;  //  H---DATA,    L---INSTRUCT
sbit  LCDRW = P0^1;  //  H---READ,    L---WRITE
sbit  LCDE = P0^2;   //  下降沿---写数据,  高---读数据, 低或上升沿无动作
sbit  LCDPSB = P0^3;   //  1--并行,0--串行
#define  LCDDB = P7;			//  DATA


//LCD寄存器定义//////////////////////////////
data LCD_DAT;  
data LCD_COM;


//外部晶振初始化/////////////////////////////
void SYSCLK_Init ()
{
    int i;                    // 延时计数器
    OSCXCN = 0x67;            // 开启外部振荡器22.1184MHz晶体
    for (i=0; i < 256; i++) ; // 等待振荡器启振
    while (!(OSCXCN & 0x80)); // 等待晶体振荡器稳定
    OSCICN = 0x88;            // 选择外部振荡器为系统时钟源并允许丢失时钟检测器
}


//  交叉开关配置,管脚输入输出配置
void XBR_Init()
{
	XBR0 = 0x00;	//不配置特殊功能
	XBR1 = 0x00;	
	XBR2 = 0x40;	//使能交叉开关,并且总体弱上拉

}	


//发送控制命令到LCD
void LCDWRT_COM(unsigned char COM)
{
   
	unsigned char temp;
	unsigned int i;
	LCDPSB=1;
	//读取并判断busy
		
re:	for(i=0;i<100;i++);
	LCDRS=0;
	LCDRW=1;
    
	LCDE=1;
		for (i=0;i<25;i++);
    temp=P7;
	LCDE=0;
	
	while(temp>=0x80) goto re;//忙则延时再判断
	
	LCDRW=0; 
	P7=COM;
		 
	LCDE=1;
	    for (i=0;i<25;i++);
	
	LCDE=0;
}



//发送数据到LCD
void LCDWRT_DAT(unsigned char DAT)
{

	unsigned int i;
	unsigned char temp;
	LCDPSB=1;
	//读取并判断busy
re:	for(i=0;i<100;i++);		
	LCDRS=0;

	LCDRW=1;
	 
	LCDE=1;
    for (i=0;i<25;i++);
	temp=P7;
	 
	LCDE=0;
	
	while(temp>=0x80) goto re ;//忙则延时再判断
	 
	 LCDRS=1;
	 LCDRW=0;
     P7=DAT;
	 
	LCDE=1;
	for (i=0;i<25;i++);
	LCDE=0;
     
	
}

void main()
{
	unsigned int i;
	xdata unsigned int LN1[16]={0xa1,0xa0,  0xb5,0xe7,  0xd7,0xd3,  0xbf,0xc6,  0xbc,0xbc,  0xb4,0xf3,  0xd1,0xa7,  0xa1,0xa0};
	xdata unsigned int LN2[16]={0x65,0x43,  0x01,0x27,  0x45,0x36,  0x64,0x24,  0x78,0x54,  0x34,0x57,  0x00,0x31,  0x91,0x00};
	xdata unsigned int LN3[16]={0xb5,0xb1,  0xc7,0xb0,  0xce,0xc2,  0xb6,0xc8,  0xcf,0xd4,  0xa1,0x4f,  0xb7,0xb6,  0xc0,0xfd};  
	xdata unsigned int LN4[16]={0x41,0x61,  0x65,0xa0,  0xa1,0xa0,  0xa1,0xa0,  0xb1,0xa0,  0xca,0xae,  0xce,0xe5,  0xd7,0xe9};
				  
	SYSCLK_Init ();
	XBR_Init();
	WDTCN=0xde;
	WDTCN=0xad;
		
	 
	//------液晶初始化--------
	LCDPSB=1;	//并行方式
	
   
	LCDWRT_COM(0x30); //8bit控制界面,基本指令集
	//LCDWRT_COM(0x07); //反白	

   
	LCDWRT_COM(0x0f); //显示打开,光标关,闪烁关
	LCDWRT_COM(0x06); //光标右移,AC以1增加
	LCDWRT_COM(0x01); //清屏 ,DDRAM地址计数器归零
	

	//第一行显示
	for (i=0;i<16;i+=2)
	{
		LCDWRT_COM(0x80+(i/2));
		LCDWRT_DAT(LN1[i]);
		LCDWRT_DAT(LN1[i+1]);
	}
	
	//第二行显示
	for (i=0;i<16;i+=2)
	{
		LCDWRT_COM(0x90+(i/2));
		LCDWRT_DAT(LN2[i]);
		LCDWRT_DAT(LN2[i+1]);
	}

	//第三行显示
	for (i=0;i<16;i+=2)
	{
		LCDWRT_COM(0x88+(i/2));
		LCDWRT_DAT(LN3[i]);
		LCDWRT_DAT(LN3[i+1]);
	}

	//第四行显示
	for (i=0;i<16;i+=2)
	{
		LCDWRT_COM(0x98+(i/2));
		LCDWRT_DAT(LN4[i]);
		LCDWRT_DAT(LN4[i+1]);
	}

while(1);

}

⌨️ 快捷键说明

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