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

📄 ocm4x12c串.c

📁 单片机应用系统(光盘内容)
💻 C
字号:
#include <reg51.h>
#include <intrins.h>

#define uint  unsigned int
#define uchar unsigned char

//引脚定义
sbit cs=P1^2;						//片选引脚 
sbit sda =P1^3;						//数据引脚
sbit up_clk=P1^4;					//上半屏时钟输入
sbit down_clk=P1^5;					//下半屏时钟输入
sbit rst=P1^6;						//复位低电平有效

uchar code tab[]={
	"计算机发送数据为:"
};
uchar code num[]={
	"0123456789ABCDEFx"
};
	
uchar k=0;
uchar buffer[6];	//接收数据缓冲区
uchar display[24];	//显示数据缓冲器

/*********************函数声明**********************/
void send_c (uchar Up_Lcd,uchar Down_Lcd,uchar comm);	//发送指令缓存函数
void send_d (uchar Up_Lcd,uchar Down_Lcd,uchar dat);	//发送显示数据函数
void init_lcd (void);									//LCD初始化函数
void chn_disp (uchar code *chn,uchar j);				//显示行汉字或字符函数
void disp(uchar *chn);									//显示接收字节函数
void send_up(uchar dat,uchar j);						//发送上半屏数据位函数
void send_down(uchar dat,uchar j);						//发送下半屏数据位函数
void chk_busy (uchar Up_Lcd, uchar Down_Lcd);			//忙检测函数
void init_serial(void);									//初始化串行中断
void convert(uchar *point);								//数据转换

/********************主程序*******************/
void main()
{
	init_serial();										//初始化串口
	init_lcd();											//初始化LCD
	chn_disp(tab,0);									//显示第1行"计算机发送数据为:"
	while(1)
	{
		if(k==6)										//6个数据已接收到
		{
			k=0;
			convert(buffer);							//转换接收数据缓冲区数据
			disp(display);								//显示发送数据
		}	
	}
}
/*******************LCD初始化函数********************/
void init_lcd (void)
{
	rst=0;
	rst=1;
	send_c(1,1,0x30);									//基本指令动作
	send_c(1,1,0x01);									//清屏
	send_c(1,1,0x06);									//光标的移动方向
	send_c(1,1,0x0c);									//开显示,关游标
}

/****************初始化串行中断****************/
void init_serial(void)
{
	SCON=0x50;											//8位串行口模式1,允许接收,REN=1
	TMOD|=0x20;											//定时器1工作在模式2
	TH1=0xfd;											//波特率位9600,晶振频率位11.0592MHz
	TL1=0xfd;
	ES=1;             									//使能串行口中断
	EA=1;												//使能全局中断
	TR1=1;												//启动定时器1
}

/****************串口中断服务程序****************/
void serial_IT(void) interrupt 4
{
	if(RI==1)
	{
		RI=0;
		buffer[k++]=SBUF;								//将串口接收数据送入接收数据缓冲区
	}
}
/****************发送上半屏数据位函数***************/
void send_up(uchar dat,uchar j)     //发数据,上半屏
{  
	do
	{
		if((dat&0x80)==0x80)
			sda=1;
		else
			sda=0;
		dat<<=1;
		up_clk=1;
		up_clk=0;  
	}
	while(--j);
}
/****************发送下半屏数据位函数***************/
void send_down(uchar dat,uchar j)     //发数据,下半屏
{
	do
	{
		if((dat&0x80)==0x80)
			sda=1;
		else
			sda=0;
		dat<<=1;
		down_clk=1;
		down_clk=0;
	}
	while(--j);      
}
/**********************忙检测函数*******************/
void chk_busy (uchar Up_Lcd, uchar Down_Lcd)
{ 
	bit busy=1;      //高电平为忙状态
	if(Up_Lcd==1)      //上半屏
	{
		while(busy)
		{
			cs=1;
			send_up(0xfc,8);   //发读缓存命令
			up_clk=1;
			_nop_();
			up_clk=0;
			busy=sda; 
			cs=0;	
		}
	}
	busy=1;           //下半屏
	if(Down_Lcd==1)      
	{
	while(busy)
	{
		cs=1;
		send_down(0xfc,8);   //发读缓存命令
		down_clk=1;
		_nop_();
		down_clk=0;
		busy=sda;  
		cs=0;	
		}
	}
} 
/******************发送指令缓存函数*****************/
void send_c(uchar Up_Lcd,uchar Down_Lcd,uchar comm)
{
	uchar temp;
	chk_busy (Up_Lcd,Down_Lcd);  
	if(Up_Lcd==1)									//上半屏
	{
		cs=1;
		temp=comm;
		send_up(0xf8,8);							//发写缓存命令
		send_up(temp,4);							//发高四位
		send_up(0x00,4); 

		temp<<=4;    
		send_up(temp,4);							//发低四位
		send_up(0x00,4); 
		cs=0;
	}
	if(Down_Lcd==1)									//下半屏
	{
		cs=1; 
		send_down(0xf8,8);							//发写缓存命令
		send_down(comm,4);							//发高四位
		send_down(0x00,4); 

		comm<<=4;
		send_down(comm,4);							//发低四位
		send_down(0x00,4); 
		cs=0; 
	}
}
/******************发送显示数据函数*****************/
void  send_d (uchar Up_Lcd,uchar Down_Lcd,uchar dat)
{
	uchar temp;
	chk_busy (Up_Lcd,Down_Lcd);
	if(Up_Lcd==1)									//上半屏
	{
		cs=1;
		temp=dat;
		send_up(0xfa,8);							//发写数据ram命令
		send_up(temp,4);							//发高四位
		send_up(0x00,4); 

		temp<<=4;    
		send_up(temp,4);							//发低四位
		send_up(0x00,4); 
		cs=0;
	}
	if(Down_Lcd==1)									//下半屏
	{
		cs=1; 
		send_down(0xfa,8);							//发写数据ram命令
		send_down(dat,4);							//发高四位
		send_down(0x00,4); 
	 
		dat<<=4;
		send_down(dat,4);							//发低四位
		send_down(0x00,4); 	   
		cs=0; 
	}
}
/******************数据转换*******************/
void convert(uchar *point)
{
	uchar i,j1,j2;
	for(i=0;i<6;i++)									//将接收数据缓冲区数据变为10进制数并存入显示数据缓冲区
	{
		j1=point[i]/16;	 								//高4位
		j2=point[i]%16;  								//低4位
		display[4*i]=num[0];							//换算成显示码
		display[4*i+1]=num[16];
		display[4*i+2]=num[j1];
		display[4*i+3]=num[j2];
	}
}
/*****************显示行汉字或字符函数***************/
void chn_disp (uchar code *chn,uchar j)
{
	uchar i;
	send_c (1,1,0x30);
	switch(j)
	{
		case 1:							
			send_c (1,0,0x80);
			for (i=0;i<24;i++)
				send_d (1,0,chn[i]);
			break;
		case 2:
			send_c (1,0,0x90);
			for (i=0;i<24;i++)
				send_d (1,0,chn[i]);
			break;
		case 3:
			send_c (0,1,0x80);
			for (i=0;i<24;i++)
				send_d (0,1,chn[i]);
			break;
		case 4:
			send_c (0,1,0x90);
			for (i=0;i<24;i++)
				send_d (0,1,chn[i]);
			break;
		default:break;
	}	
}
/*******************显示接收字节函数*****************/
void disp(uchar *chn)
{
	uchar i,j;
	uchar pos=0x91;
	send_c (1,1,0x30);
	for(j=0;j<3;j++)
	{
		send_c (1,0,pos);
		for(i=0;i<4;i++)
		{
			send_d (0,1,chn[i+j*4]);
			j++;
		}	
		pos=pos+8;
	}
	pos=0x81;
	for(j=0;j<3;j++)
	{
		send_c (1,0,pos);
		for(i=0;i<4;i++)
		{
			send_d (0,1,chn[i+j*4+12]);
			j++;
		}	
		pos=pos+8;
	}
}

⌨️ 快捷键说明

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