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

📄 lcd.c

📁 PC机通过串口向单片机传输数据
💻 C
字号:
/*------------------------------------------------------------------------------------------------------------
液晶模块OCM4X8C DB0-DB7连接至实验板DP0-DP7(4/8位并行接口方式)
  E(sclk)连接至实验板DL7;
  RS连接到DL6;
  R/W(SID)固定接地;
  外加一条连线:DK6,DK7接到VCC(+5V);
  本程序功能:实现自动换行,汉字不能正常显示出自动补空,及无乱码显示(单字节于双字节字符混合)
  实现方式:检测汉字前的字母(单字节)个数,若为奇数,字母后一位补以空字符,以后的字符全部往后退一个字符位
  测试字符串:3嵌G入1式C21工4作8式03届
  变量说明:
 			LCD_cn 字符写入地址或液晶要显示的数据
			line   对应于液晶的显示行数,从的0行开始																	
   																				3G1C embedded studio design
------------------------------------------------------------------------------------------------------------*/
#include <reg52.h> 
#include <absacc.h>				//片外地址定义

#define uchar unsigned char

#define led_data XBYTE[0xe000]    /*端口地址,对应实验板的DP0-DP7,数据*/
#define led_sel XBYTE[0xc000]   /*端口地址,对应实验板的DL*/

void changeAddr(uchar lin);			//地址转换子程序
void insert(uchar p);			//插入空字符子程序
void changeArr(void);			//数组调整子程序
void show(void);				//液晶显示子程序
void wcom(void);				//液晶写指令子程序
void wdat(void);				//液晶写数据子程序
void delayms(uchar ms);			//ms级延时子程序
void init(void);				//初始化子程序

uchar LCD_cn;
uchar buffer[100]={"3嵌G入1式C21工4作8式03届"};
/*---------------------------------------------------------------------------------------------
										主函数
---------------------------------------------------------------------------------------------*/
main(void)
{
	init();				//液晶模块初始化

	led_data=0;  
	led_sel=0xff; 
   	
	changeArr();		//调用字符数组排列子程序
	show();				//调用液晶显示子程序

	while(1)
	{
		
	}
		
}
/*-----------------------------------------------------------------------------------------------
										液晶初始化子程序
-----------------------------------------------------------------------------------------------*/
void init(void)
{ 
	LCD_cn=0x30;	//功能设定
	wcom();
				//delayms(2);

	LCD_cn=0x01;	//清除显示
	wcom();
				//delayms(2);

	LCD_cn=0x06;	//光标右移
	wcom();
				//delayms(2);

	LCD_cn=0x0c;	//开显示器
	wcom();
				//delayms(2);

	LCD_cn=0x01;	//清除显示
	wcom();
				//delayms(2);
	
}
/*----------------------------------------------------------------------------------------------
										延时子程序
确保上一指令/数据已经接受、处理完。
----------------------------------------------------------------------------------------------*/
void delayms(uchar ms)			
{
    uchar i;
    while(ms--)
    {
        for(i=0; i<125; i++);
    }
}

/*----------------------------------------------------------------------------------------------
										液晶写指令子程序										
----------------------------------------------------------------------------------------------*/
void wcom(void)		//写指令
{ 
	led_sel=0xbf;	//RW=0,RS=0,E=1 指令写
					//delayms(2);
	led_data=LCD_cn;
					//delayms(2);
 	led_sel=0x3f;	//RW=0,RS=0,E=0 恢复
	delayms(2);
}
/*-----------------------------------------------------------------------------------------------
										液晶写数据子程序
-----------------------------------------------------------------------------------------------*/
void wdat(void)		//写数据
{ 
	led_sel=0xff;	//RW=0,RS=1,E=1 写
  					//delayms(2);
	led_data=LCD_cn;
  					//delayms(2);
	led_sel=0x7f;	//写脉冲Rs=1,wr=0;e=0 恢复
  	//led_sel=0x3f;	//RW=0,RS=0,E=0 恢复  这句代替上句的话,RS=0,无法显示数据
  	delayms(2);
}
/*--------------------------------------------------------------------
						地址转换子程序
第一行: 80H ———87H ,第二行: 90H ———97H 第三行:88H ———8FH 第四行:9
--------------------------------------------------------------------*/
void changeAddr(uchar lin)
 { 
 	switch(lin)
	{
		case 0:
				LCD_cn=0x80;			//LINE 1
				break;
		case 1:
				LCD_cn=0x90;			//LINE 2
				break;
		case 2:
				LCD_cn=0x88;			//LINE 3
				break;
		case 3:
				LCD_cn=0x98;			//LINE 4
				break;	
	  }
}
/*------------------------------------------------------------------------------------------
									插入字符子程序
相应位插入空字符,同时该位以后的所有字符逐位往后退一位
------------------------------------------------------------------------------------------*/
void insert(uchar p)
{
	uchar p1;
	p1=p;
	while(buffer[p]!='\0')			//将数组指针移到数组末尾第一个\0处
	{
		p++;
	 }
	for(;p>p1;p--)					//从第p1+1位开始,逐位往后退一位
		buffer[p]=buffer[p-1];
	buffer[p1]=' ';					//p1位补空字符
}
/*----------------------------------------------------------------------------------------
								数组重排列子程序
----------------------------------------------------------------------------------------*/
void changeArr(void)
{
	uchar count;					//用于计算字母(单字符)个数
	uchar j=0;
	while(buffer[j]!='\0')
	{
		if(buffer[j]<127)			//判断是否位字母
		{
			count++;
			j++;
		 }
		 if(buffer[j]>127)			//判断是否位汉字
		 {
		 	if(count%2!=0)			//若汉字前字母个数为奇数则调用子函数insert(),作相应的处理
				{
					insert(j);
					j=j+2;			//跳到汉字后的字符(一个汉字占用2个字节位置)
					count=0;
				 }
		 	else
			{
				count=0;
				j++;
			 }
		  }
	 }
 }
/*---------------------------------------------------------------------------------------------------
										液晶显示子程序
---------------------------------------------------------------------------------------------------*/
 void show(void)
 {
 	uchar j=0;
	uchar line;
 	LCD_cn=0x80;
	wcom();
	while(buffer[j]!='\0')
	{
		if(j%16==0)					//每行智能显示16个字符,到达字符个数自动换行
		{
			line=j/16;
			if(line>4) break;
			changeAddr(line);			//改变地址
			wcom();
		 }
		 LCD_cn=buffer[j];
		 wdat();
		 j++;
	 }
 }

⌨️ 快捷键说明

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