📄 main-rec.c
字号:
//初始
#include <reg52.h>
//#include <ocm12864.h>
//#include <IO-URAT.h>
//OCM12864参考程序
#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_lcd P0 //MCU P0<------> LCM
sbit di =P2^5; //Data or Instrument Select,H:写数据,L:写指令
sbit rw =P2^4; //Write or Read,H:read,L:write
sbit e =P2^3; //读写使能
sbit cs2=P2^2; //cs1=H,选择左半屏
sbit cs1=P2^1; //cs2=H,选择右半屏
sbit rst=P2^0; //Lcm reset,低有效
sbit bf =P0^7;
sbit res=P0^4;
void chk_busy (void);
uchar code shuzi[]={ //数字
/*-- 文字: 0 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,
/*-- 文字: 1 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,
/*-- 文字: 2 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,
/*-- 文字: 3 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,
/*-- 文字: 4 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,
/*-- 文字: 5 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,
/*-- 文字: 6 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,
/*-- 文字: 7 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,
/*-- 文字: 8 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,
/*-- 文字: 9 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,
/*-- 文字: A --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,
/*-- 文字: B --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00,
/*-- 文字: C --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,
/*-- 文字: D --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,
/*-- 文字: E --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00,
/*-- 文字: F --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,
/*-- 文字: --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
/*---------------延时子程序----------------*/
void delay (uint us)
{
while(us--);
}
/*
void delay1 (uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<1000;j++)
;
} */
/*------------写数据或命令到LCD--------------*/
void wr_lcd (uchar dat_comm,uchar content)
{
chk_busy ();
di=dat_comm;
rw=0;
data_lcd=content;
e=1;
;
e=0;
}
/*--------------读LCD数据---------------
uchar rd_lcd ()
{
uchar rddata;
chk_busy ();
di=1;
rw=1;
e=1;
;
rddata=data_lcd;
e=0;
return rddata;
} */
void chk_busy (void)
{ unsigned char i=0;
data_lcd=0xff;
di=0;
rw=1;
;
e=1;
while((bf||res==1)&i<=0xc0){i++;};
e=0;
}
/*--------------写点阵------------------*/
void lat_disp (uchar data1,uchar data2)
{
uchar i,j;
cs1=1;cs2=1;
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 select_disp (uchar x,uchar y,uchar xl,uchar yl,uchar row_xl,uchar row_yl,const uchar *chn,uchar n)
{
uchar i,j,k,l;
uint a;
wr_lcd (0,disp_on);
for(l=0;l<row_xl;l++)
{
for(k=0;k<row_yl;k++)
{
for(j=0;j<xl;j++)
{
wr_lcd (0,disp_x+x+l*xl+j);
wr_lcd (0,disp_z);
wr_lcd (0,disp_y+y+k*yl);
a=l*xl*yl*row_yl+k*xl*yl+j*yl+0x10*n;
for(i=0;i<yl;i++)
wr_lcd (1,chn[a+i]);
}
}
}
}
/*------------------初始化-----------------*/
void init_lcd (void)
{
rst=0;
delay(50);
rst=1;
cs1=1;cs2=1;
wr_lcd (comm,disp_off);
wr_lcd (comm,disp_on);
lat_disp(0x00,0x00); //清屏
}
sbit BT_SND =P1^0;
sbit BT_REC =P1^1;
/**********************************************
IO 口模拟232通讯程序
使用两种方式的C程序 占用定时器0
**********************************************/
sbit ACC0= ACC^0;
sbit ACC1= ACC^1;
sbit ACC2= ACC^2;
sbit ACC3= ACC^3;
sbit ACC4= ACC^4;
sbit ACC5= ACC^5;
sbit ACC6= ACC^6;
sbit ACC7= ACC^7;
sbit SD = P1^2;
unsigned char rt=0;
unsigned char rt00=0x00;
unsigned char rt0=0x00;
/*
#define bound 96 //波特率
unsigned char last=((10000/bound)*13/32)-10;
unsigned char mid=(10000/bound)*3/16-10;
unsigned char first=((10000/bound)*13/32)-10;
unsigned char midd=(10000/bound)-3;
void sixty_three(bit pules)
{
if(pules)
{
BT_SND=0;
delay(midd);
}
else
{
BT_SND=0;
delay(first);
BT_SND=1;
delay(mid);
BT_SND=0;
delay(last);
}
}
bit three_sixty(bit pules)
{
if(pules)
{
return 0;
}
else
{
return 1;
}
}
*/
#define MODE_QUICK
#define F_TM F0
#define TIMER0_ENABLE TL0=TH0; TR0=1;
#define TIMER0_DISABLE TR0=0;
//发送一个字符
void PSendChar(unsigned char inch)
{
#ifdef MODE_QUICK
ACC=inch;
F_TM=0;
BT_SND=1; //start bit
TIMER0_ENABLE; //启动
while(!F_TM);
BT_SND=~ACC0; //先送出低位
F_TM=0;
while(!F_TM);
BT_SND=~ACC1;
F_TM=0;
while(!F_TM);
BT_SND=~ACC2;
F_TM=0;
while(!F_TM);
BT_SND=~ACC3;
F_TM=0;
while(!F_TM);
BT_SND=~ACC4;
F_TM=0;
while(!F_TM);
BT_SND=~ACC5;
F_TM=0;
while(!F_TM);
BT_SND=~ACC6;
F_TM=0;
while(!F_TM);
BT_SND=~ACC7;
F_TM=0;
while(!F_TM);
BT_SND=0;
F_TM=0;
while(!F_TM);
TIMER0_DISABLE; //停止timer
#else
unsigned char ii;
ii=0;
F_TM=0;
BT_SND=0; //start bit
TIMER0_ENABLE; //启动
while(!F_TM);
while(ii<8)
{
if(inch&1)
{
BT_SND=1;
}
else
{
BT_SND=0;
}
F_TM=0;
while(!F_TM);
ii++;
inch>>=1;
}
BT_SND=1;
F_TM=0;
while(!F_TM);
#endif
TIMER0_DISABLE; //停止timer
}
//接收一个字符
unsigned char PGetChar()
{
#ifdef MODE_QUICK
TIMER0_ENABLE;
F_TM=0;
while(!F_TM); //等过起始位
ACC0=~BT_REC;
TL0=TH0;
F_TM=0;
while(!F_TM);
ACC1=~BT_REC;
F_TM=0;
while(!F_TM);
ACC2=~BT_REC;
F_TM=0;
while(!F_TM);
ACC3=~BT_REC;
F_TM=0;
while(!F_TM);
ACC4=~BT_REC;
F_TM=0;
while(!F_TM);
ACC5=~BT_REC;
F_TM=0;
while(!F_TM);
ACC6=~BT_REC;
F_TM=0;
while(!F_TM);
ACC7=~BT_REC;
F_TM=0;
while(!F_TM)
{
if(BT_REC)
{
break;
}
}
TIMER0_DISABLE; //停止timer
return ACC;
#else
unsigned char rch,ii;
TIMER0_ENABLE;
F_TM=0;
ii=0;
rch=0;
while(!F_TM); //等过起始位
while(ii<8)
{
rch>>=1;
if(BT_REC)
{
rch|=0x80;
}
ii++;
F_TM=0;
while(!F_TM);
}
F_TM=0;
while(!F_TM)
{
if(BT_REC)
{
break;
}
}
TIMER0_DISABLE; //停止timer
return rch;
#endif
}
//定时器0中断
void IntTimer0() interrupt 1
{
F_TM=1;
}
//检查是不是有起始位
bit StartBitOn()
{
return (BT_REC==0);
}
void InT0() interrupt 0
{ delay(10000);
rt=0;
rt00++;
if(rt00>=0xf0)
rt00=0x00;
while(IE0);
}
void InT1() interrupt 2
{ delay(10000);
rt=1;
rt00++;
if(rt00>=0xf0)
rt00=0x00;
while(IE1);
}
void main()
{
unsigned char gch,gch1,i=0;
TMOD=0x22; /*定时器1为工作模式2(8位自动重装),0为模式2(8位自动重装) */
PCON=00;
TR0=0; //在发送或接收才开始使用
TF0=0;
TH0=(256-96); //9600bps 就是 1000000/9600=104.167微秒 执行的
// timer是 104.167*11.0592/12= 96
TL0=TH0;
ET0=1;
EX0=EX1=1; //int0/1中断
IT0=IT1=0; //int电平触发
// serial_init();
init_lcd ();
EA=1;
cs1=1;cs2=0;
select_disp(0,16,2,8,1,2,shuzi,1);
SD=0;
BT_SND=0;
BT_REC=1;
while(1)
{
if(StartBitOn())
{
gch=PGetChar();
// gch1=(gch>>4)&0x07;
select_disp(4,i+8,2,8,1,1,shuzi,16);
select_disp(4,i,2,8,1,1,shuzi,gch);
// putchar(gch);
i+=8;
if(i>56)
{
i=0;
cs1=~cs1;cs2=~cs2;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -