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

📄 lcd_test1.c

📁 本程序使用c8051F020单片机及北京青云公司的128*32LCD
💻 C
字号:
/////////////LCD测试程序//////////////
////////////lcd_test1.c//////////////
#include "C8051F040.h"	// Register definition file.
typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ulong;
#define toup sendc(0x14)  //lcd光标右移
#define todown sendc(0x10)//lcd光标左移
#define curshow sendc(0x0f)//显示光标
#define home sendc(0x02)//移到首行
#define cls sendc(0x01)//清屏
sbit lcdrs=P5^2;//硬件控制接口
sbit lcdrw=P5^1;
sbit lcdcs=P5^0;
void delay1ms(uint time){//延迟1ms*time,这不是一个精确值
	uint i;
	uint j;
	for (i=0;i<time;i++){
		for(j=0;j<300;j++);
	}
}	
void sendc(uchar c){//给lcd送命令
	SFRPAGE = 0x0f;//以下实际上是对lcd发送命令的时序图进行操作的
	P4=c;
	lcdrs=0;
	lcdrw=0;
	EA=0;
	lcdcs=1;
	lcdcs=0;
	lcdcs=1;
	lcdrw=1;
	P4=0xff;//先置1,后读取
	lcdrs=0;
	while(P4>=0x80);
	lcdcs=0;
	lcdcs=1;
	EA=1;
	if(c==1)
		delay1ms(2);
                
}
void dispini(){	//lcd显示初始化
	delay1ms(100);
	SFRPAGE=0xf;
	lcdcs=0;         
	lcdrs=1;
	lcdrw=1;
	delay1ms(30);
	sendc(0x38);//8位,2行,5*7字体
	delay1ms(100);
	sendc(0x0c);//显示开,光标关;不闪
	delay1ms(100);
	sendc(0x06);//增量方式,现不移动
	delay1ms(100);
	sendc(0x01);//清屏
	delay1ms(100);
}
void sendd(uchar c){//给lcd送数据
	SFRPAGE = 0x0f;
	EA=0;
	P4=c;
	lcdrs=1;
	lcdrw=0;
	lcdcs=1;
	lcdcs=0;
	lcdcs=1;
	lcdrw=1;
	P4=0xff;//先置1,后读取
	lcdrs=0;
	while(P4>=0x80);
	lcdcs=0;
	lcdcs=1;
	EA=1;
}	
void config (void) {
//看门狗禁止
    WDTCN = 0x07;	
    WDTCN = 0xDE;   
    WDTCN = 0xAD;
    SFRPAGE = 0x0F;
    XBR0 = 0x00;	
    XBR1 = 0x00;	
    XBR2 = 0x40;	//交叉开关使能,使得P0-P3口能输出
    XBR3 = 0x00;    
    SFRPAGE = 0x0F;
    P0MDOUT = 0x00; //端口配置,P0-P3,P6-P7口为开漏输出
    P1MDOUT = 0x00; 
    P2MDOUT = 0x00; 
    P3MDOUT = 0x00; 
    P4MDOUT = 0x00; //P4口为开漏
    P5MDOUT = 0x07; 
    P6MDOUT = 0x00; 
    P7MDOUT = 0x00; 
    P1MDIN = 0xFF;  //所有端口为数字输入,没有模拟输入端口
    P2MDIN = 0xFF;  
    P3MDIN = 0xFF; 
    SFRPAGE = 0x0F;
    CLKSEL = 0x00;  
    OSCXCN = 0x00;	
    OSCICN = 0x84;	
    //采用内部晶振,为24.5MHZ8分频
}   
void dispmoveauto(){//自动移位显示
	xdata uchar i;
	sendc(0x01);//清屏
	delay1ms(2);
	sendc(0x80);
	for(i=0;i<16;i++){
		sendd('a'+i);//第一行显示
		}
	delay1ms(1000);
	sendc(0x07);//设置为移动显示模式,AC自增
	for(i=0;i<26;i++){
		sendd('A'+i);//当CG RAM地址自增超过第一行地址时,自动跳到第二行地址
		delay1ms(500);
		}
	for(i=0;i<26;i++){
		sendd('a'+i);
		delay1ms(500);
		}


}
void makelogo1(){
	sendc(0x48);//CG RAM 地址设定指令,写地址0x08,即定义代码0x01的点阵数据
	sendd(0x04);//给CG RAM写数据,定义点阵数据,为一片叶子的点阵,一共8行
	sendd(0x0e);
	sendd(0x1f);
	sendd(0x1f);
	sendd(0x1f);
	sendd(0x0e);
	sendd(0x04);
	sendd(0x0e);
}
uchar readd(){//给显示lcd送显示字符
	uchar k;
	SFRPAGE = 0x0f;
	EA=0;
	lcdrw=1;
	P4=0xff;
	lcdrs=1;
	k=P4;
	lcdcs=0;
	lcdcs=1;
	P4=0xff;//先置1,后读取,否则所读数据可能有误
	lcdrs=0;
	while(P4>=0x80);//读LCD是否为忙
	lcdcs=0;
	lcdcs=1;
	EA=1;
	return k;
}	
void dispmovemanual(){
	xdata uchar i;
	sendc(0x80);
	for(i=0;i<26;i++){
		sendd('a'+i);//一次性将‘a’至‘z’数据写入第一行内存中
	}
	delay1ms(100);
	for(i=0;i<40;i++){
		sendc(0x18);
		delay1ms(300);//每隔三十毫秒移动一次数据
	}
	for(i=0;i<12;i++){
		sendd('0'+i);//操作完移位指令后继续在第一行中写入‘0’-‘9’和‘:’,‘;’
	}
	delay1ms(300);
	sendc(0xc0);
	for(i=0;i<26;i++){//一次性将‘A’至‘Z’写入第二行的内存中
		sendd('A'+i);
	}
	for(i=0;i<12;i++){//继续在第二行中写入‘0’-‘9’和‘:’,‘;’
		sendd('0'+i);
	}
	delay1ms(1000);
	for(i=0;i<40;i++){//移位指令,整屏移动
		sendc(0x18);
		delay1ms(600);
	}
}
main(){
	xdata uchar readdata[6];
	uchar t;
	config();
	dispini();
	dispmovemanual();//手动移位显示
	cls;//清零
	makelogo1();//设置自定义点阵
	delay1ms(1000);
	sendc(0x80);//连续写入5个数据,以供读取值比较
	sendd(0x01);//显示自定义点阵
	sendd(0x31);
	sendd(0x32);
	sendd(0x61);
	sendd(0x62);
	sendd(0x71);
	sendc(0x80);
	for(t=0;t<6;t++)
		readdata[t]=readd();
	delay1ms(1000);
	dispmoveauto();//自动移位显示,每写一个数据,自动移位一次
	while(1);
}

⌨️ 快捷键说明

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