📄 51
字号:
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define disp_off 0x3e //关显示
#define disp_on 0x3f //开显示
#define disp_x 0xb8 //页地址
#define disp_z 0xc0 //行地址
#define disp_y 0x40 //列地址
#define comm 0 //命令标志
#define dat 1 //数据标志
#define data_ora P0 //MCU P0<------> LCM
sbit cs1=P2^0; //cs1=L,选择左半屏
sbit cs2=P2^1; //cs2=L,选择右半屏
sbit rs =P2^2; //H:写数据,L:写指令
sbit rw =P2^3; //H:读,L:写
sbit e =P2^4; //读写使能
sbit bf =P0^7; //执行操作标志
sbit res=P0^4; //复位初始化标志
uchar uart_data,temp,baud_set=0x00;
uchar dispnum[90];
uchar baud[5]={0x00,0x09,0x06,0x00,0x00};
uchar r_dat[4]={0x00,0x10,0x00,0x00};
uchar code baudrate[7][5]={
{0x00,0x00,0x03,0x00,0x00},
{0x00,0x00,0x06,0x00,0x00},
{0x00,0x01,0x02,0x00,0x00},
{0x00,0x02,0x04,0x00,0x00},
{0x00,0x04,0x08,0x00,0x00},
{0x00,0x09,0x06,0x00,0x00},
{0x01,0x04,0x04,0x00,0x00},
}; //波特率大小
uchar code hz11[]={
/*-- 隶书12; 此字体下对应的点阵为:宽x高=16x16 --*/
/*-- 文字: 发 --*/
0x00,0x00,0x00,0xE0,0xA0,0x80,0x80,0xF0,
0x80,0xA0,0xB0,0x80,0x00,0x00,0x00,0x00,
0x00,0x08,0x08,0x08,0x1C,0x14,0x13,0x1B,
0x0D,0x07,0x0B,0x18,0x18,0x30,0x10,0x00,
/*-- 文字: 送 --*/
0x00,0x80,0xD0,0xB0,0xA0,0x80,0x80,0x70,
0x40,0xC0,0x60,0x50,0x40,0x00,0x00,0x00,
0x08,0x08,0x08,0x0C,0x0B,0x08,0x09,0x0D,
0x1B,0x13,0x13,0x35,0x3D,0x30,0x10,0x08,
/*-- 文字: 数 --*/
0x00,0x00,0x40,0xE0,0x40,0xF0,0xE0,0x70,
0x00,0xF0,0x50,0xC0,0x40,0x40,0x00,0x00,
0x00,0x02,0x13,0x16,0x1E,0x0B,0x16,0x13,
0x11,0x0B,0x06,0x0F,0x18,0x18,0x10,0x00,
/*-- 文字: 据 --*/
0x00,0x00,0x40,0x40,0xF0,0x40,0x40,0xF0,
0x60,0x50,0xD0,0x50,0x70,0x60,0x00,0x00,
0x00,0x12,0x13,0x31,0x1F,0x11,0x0D,0x07,
0x3D,0x15,0x17,0x15,0x3D,0x1D,0x03,0x00,
};
uchar code hz12[]={
/*-- 隶书12; 此字体下对应的点阵为:宽x高=16x16 --*/
/*-- 文字: 波 --*/
0x00,0x80,0x20,0x20,0x40,0x40,0xE0,0x20,
0x20,0xF0,0x30,0x20,0x20,0xC0,0x00,0x00,
0x00,0x19,0x09,0x0D,0x14,0x18,0x27,0x31,
0x13,0x0D,0x0D,0x1B,0x18,0x30,0x30,0x10,
/*-- 文字: 特 --*/
0x00,0xC0,0x60,0x40,0xF0,0x60,0x40,0xA0,
0xA0,0xF0,0xF0,0xA0,0xA0,0x80,0x80,0x00,
0x00,0x02,0x02,0x02,0x3F,0x01,0x01,0x12,
0x26,0x2E,0x2A,0x3F,0x1A,0x02,0x00,0x00,
/*-- 文字: 率 --*/
0x00,0x00,0x20,0x60,0x60,0xA0,0x60,0xB0,
0x70,0xA0,0xA0,0x60,0x20,0x20,0x00,0x00,
0x00,0x04,0x04,0x07,0x05,0x04,0x05,0x3F,
0x1F,0x05,0x05,0x05,0x0C,0x0C,0x04,0x00,
/*-- 文字: 为 --*/
0x00,0x00,0x00,0x80,0x80,0xB0,0xA0,0x80,
0x80,0xC0,0xE0,0xB0,0x80,0x80,0x00,0x00,
0x00,0x10,0x18,0x18,0x0C,0x04,0x02,0x01,
0x13,0x36,0x34,0x30,0x1E,0x07,0x00,0x00,
};
uchar code num[]={
/*-- 隶书12; 此字体下对应的点阵为:宽x高=8x16 --*/
/*-- 文字: 0 --*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,
0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,
/*-- 文字: 1 --*/
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,
0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,
/*-- 文字: 2 --*/
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,
0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,
/*-- 文字: 3 --*/
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,
0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,
/*-- 文字: 4 --*/
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,
0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,
/*-- 文字: 5 --*/
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,
0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,
/*-- 文字: 6 --*/
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,
0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,
/*-- 文字: 7 --*/
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,
0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,
/*-- 文字: 8 --*/
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,
0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,
/*-- 文字: 9 --*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,
0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,
/*-- 文字: a --*/
0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,
0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,
/*-- 文字: b --*/
0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,
0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00,
/*-- 文字: c --*/
0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,
0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,
/*-- 文字: d --*/
0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,
0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,
/*-- 文字: e --*/
0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,
0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00,
/*-- 文字: f --*/
0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,
0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,
/*-- 文字: x --*/
0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,
0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20,};
uchar code dispunit[]={
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
/*-- 文字: b --*/
0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,
0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00,
/*-- 文字: p --*/
0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,
0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00,
/*-- 文字: s --*/
0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,
0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,
};
uchar code hz13[]={
/*-- 隶书12; 此字体下对应的点阵为:宽x高=16x16 --*/
/*-- 文字: 发 --*/
0x00,0x00,0x00,0xE0,0xA0,0x80,0x80,0xF0,
0x80,0xA0,0xB0,0x80,0x00,0x00,0x00,0x00,
0x00,0x08,0x08,0x08,0x1C,0x14,0x13,0x1B,
0x0D,0x07,0x0B,0x18,0x18,0x30,0x10,0x00,
/*-- 文字: 送 --*/
0x00,0x80,0xD0,0xB0,0xA0,0x80,0x80,0x70,
0x40,0xC0,0x60,0x50,0x40,0x00,0x00,0x00,
0x08,0x08,0x08,0x0C,0x0B,0x08,0x09,0x0D,
0x1B,0x13,0x13,0x35,0x3D,0x30,0x10,0x08,
/*-- 文字: 数 --*/
0x00,0x00,0x40,0xE0,0x40,0xF0,0xE0,0x70,
0x00,0xF0,0x50,0xC0,0x40,0x40,0x00,0x00,
0x00,0x02,0x13,0x16,0x1E,0x0B,0x16,0x13,
0x11,0x0B,0x06,0x0F,0x18,0x18,0x10,0x00,
/*-- 文字: 据 --*/
0x00,0x00,0x40,0x40,0xF0,0x40,0x40,0xF0,
0x60,0x50,0xD0,0x50,0x70,0x60,0x00,0x00,
0x00,0x12,0x13,0x31,0x1F,0x11,0x0D,0x07,
0x3D,0x15,0x17,0x15,0x3D,0x1D,0x03,0x00,
};
uchar code hz14[]={
/*-- 隶书12; 此字体下对应的点阵为:宽x高=16x16 --*/
/*-- 文字: 为 --*/
0x00,0x00,0x00,0x80,0x80,0xB0,0xA0,0x80,
0x80,0xC0,0xE0,0xB0,0x80,0x80,0x00,0x00,
0x00,0x10,0x18,0x18,0x0C,0x04,0x02,0x01,
0x13,0x36,0x34,0x30,0x1E,0x07,0x00,0x00,};
/************************函数声明***********************/
void chk_busy (void); //判断LCD工作状态
void delay (uint us); //us延时函数
void init_uart(void); //初始化串口程序
void wr_lcd (uchar dat_comm,uchar content);//写数据或命令到LCD
void init_lcd (void); //初始化LCD程序
void lat_disp (uchar data1,uchar data2);//LCD写点阵程序
void chn_disp (uchar x,uchar y,uchar xl,uchar yl,uchar row_xl,uchar row_yl,uchar *chn);//写字符函数
void change(void); //调整波特率显示码程序
void change_dat(void); //调整接收到的数据为显示码程序
void disp (void); //LCD显示程序
void measure(void); //1bit数据发送时间测量程序
void search(void); //查询发送数据波特率程序
void init_T0 (void); //T0初始化程序
void disp_dat(void); //数据显示程序
/**********************主程序***********************/
void main ()
{
init_T0 (); //初始化T0
init_lcd (); //初始化LCD
measure (); //检测主机发送波特率
init_uart(); //初始化串口
disp(); //调用显示
while (1)
{
disp_dat(); //修改接收数据
}
}
/***********************us延时函数**********************/
void delay (uint us)
{
while(us--);
}
/**********************T0初始化程序***********************/
void init_T0 (void)
{
TMOD=0x01; //工作方式1
TH0=0x00; //初始化定时器内部寄存器
TL0=0x00;
}
/***************1bit数据发送时间测量程序*************/
void measure(void)
{
while(RXD); //等待主机发送起始位0
TR0=1; //启动定时器计时
while(!RXD); //等待主机发送最高位1
TR0=0; //定时器停止计时
baud_set=TH0; //将1bit的发送时间存入baud_SET
}
/**********************初始化串口程序********************/
void init_uart(void)
{
SCON=0x50; //工作方式1,允许接收
TMOD=TMOD|0x20; //T1为工作方式2
TH1=255-baud_set; //设置T1
TL1=255-baud_set;
ES=1; //允许串行中断
EA=1; //开总中断
TR1=1; //启动定时器T1
SBUF=0x0d; //向主机发送确认码
}
/********************判断LCD工作状态********************/
void chk_busy (void)
{
data_ora=0xff;
rs=0; //命令标志
rw=1; //读数据
e=1;
while(bf||res==1);
e=0;
}
/*******************写数据或命令到LCD******************/
void wr_lcd (uchar dat_comm,uchar content)
{
chk_busy (); //查看LCD是否处于忙状态
rs=dat_comm; //写入命令/数据
rw=0; //写数据
data_ora=content; //送命令/数据
e=1;
e=0;
}
/*********************初始化LCD程序********************/
void init_lcd (void)
{
delay(50);
cs1=0;
cs2=0;
wr_lcd (comm,disp_off);
wr_lcd (comm,disp_on); //开显示
lat_disp(0x00,0x00); //清屏
}
/********************LCD写点阵程序*********************/
void lat_disp (uchar data1,uchar data2)
{
uchar i,j;
cs1=0;
cs2=0;
wr_lcd (comm,disp_on);
for(j=0;j<8;j++)
{
wr_lcd (comm,disp_x+j); //设置页地址
wr_lcd (comm,disp_z); //设置起始行
wr_lcd (comm,disp_y); //设置列地址
for(i=0;i<32;i++)
{
wr_lcd (dat,data1);
wr_lcd (dat,data2);
}
}
}
/**********************写字符函数**********************/
void chn_disp (uchar x,uchar y,uchar xl,uchar yl,uchar row_xl,uchar row_yl,uchar *chn)
{
uchar i,j,k,l,a;
wr_lcd (comm,disp_on); //开显示
for(l=0;l<row_xl;l++) //行数循环
{
for(k=0;k<row_yl;k++) //字数循环
{
for(j=0;j<xl;j++)
{
wr_lcd (comm,disp_x+x+l*xl+j); //行数调整
wr_lcd (comm,disp_z); //列数调整
wr_lcd (comm,disp_y+y+k*yl); //字数调整
a=l*xl*yl*row_yl+k*xl*yl+j*yl;
for(i=0;i<yl;i++) //写数据
wr_lcd (dat,chn[a+i]);
}
}
}
}
/****************调整波特率显示码程序******************/
void change(void)
{
uchar temp,i,j,n=0;
for(j=0;j<5;j++)
{
temp=baud[j];
if((j==0&baud[0]==0x00)|((j==1&baud[1]==0x00)))
{
for(i=0;i<16;i++)
dispnum[n++]=0x00;
}
else
{
for(i=0;i<16;i++)
dispnum[n++]=num[i+temp*16];
}
}
}
/*************调整接收到的数据为显示码程序*************/
void change_dat(void)
{
uchar temp,i,j,n=0;
r_dat[2]=uart_data/16; //将高四位存入r_dat[2]
r_dat[3]=uart_data%16; //将低四位存入r_dat[3]
for(j=0;j<4;j++)
{
temp=r_dat[j];
for(i=0;i<16;i++)
dispnum[n++]=num[i+temp*16];//转换显示码
}
}
/*********************LCD显示程序*********************/
void disp (void)
{
lat_disp(0x00,0x00); //清屏
search(); //查询波特率显示码
change(); //调整显示码
cs1=0;
cs2=1; //显示LCD屏幕左侧前三行信息
chn_disp (0,0,2,16,1,4,hz11);
chn_disp (2,24,2,8,1,5,dispnum);
chn_disp (4,0,2,16,1,4,hz13);
cs1=1;
cs2=0; //显示LCD屏幕右侧前三行信息
chn_disp (0,0,2,16,1,4,hz12);
chn_disp (2,8,2,8,1,3,dispunit);
chn_disp (4,0,2,16,1,1,hz14);
}
/*********************数据显示程序*********************/
void disp_dat(void)
{
change_dat(); //调整显示
cs1=0;
cs2=1;
chn_disp (6,24,2,8,1,4,dispnum); //将接收到得数据显示在屏幕左侧第四行
}
/********************串口中断程序********************/
void serial_TI(void) interrupt 4
{
if(RI==1)
{
RI=0; //接收中断,清零RI
uart_data=SBUF; //将接收数据存入temp,并将接收数据发送至上位机
SBUF=uart_data;
temp=uart_data;
}
else //发送中断,清零RI
TI=0;
}
/**************查询发送数据波特率程序***************/
void search(void)
{
uchar i;
switch(baud_set)
{
case 0x5f:
for(i=0;i<5;i++)
baud[i]=baudrate[0][i]; //波特率为300
break;
case 0x2f:
for(i=0;i<5;i++)
baud[i]=baudrate[1][i]; //波特率为600
break;
case 0x17:
for(i=0;i<5;i++)
baud[i]=baudrate[2][i]; //波特率为1200
break;
case 0x0b:
for(i=0;i<5;i++)
baud[i]=baudrate[3][i]; //波特率为2400
break;
case 0x05:
for(i=0;i<5;i++)
baud[i]=baudrate[4][i]; //波特率为4800
break;
case 0x02:
for(i=0;i<5;i++)
baud[i]=baudrate[5][i]; //波特率为9600
break;
case 0x01:
for(i=0;i<5;i++)
baud[i]=baudrate[6][i]; //波特率为14400
break;
default:
for(i=0;i<5;i++)
baud[i]=0x0e; //超出测量范围,显示EEEEE
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -