📄 ocm4x12c串.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 + -