单片机串口接收数据并显示

发布 2019-07-23 03:51:57 阅读 8597

#include <

#include <

#define uchar unsigned char

#define uint unsigned int

*ts12864a-3 端口定义*/

#define lcd_data p0数据口。

sbit lcd_rs = p3^5寄存器选择输入

sbit lcd_rw = p3^6液晶读/写控制。

sbit lcd_en = p3^4液晶使能控制。

/sbit lcd_psb = p3^7串/并方式控制。

sbit wela = p2^6;

sbit dula = p2^7;

/ uchar table[6];

/uchar flag;

*uchar code dis1

uchar code dis2

uchar code dis3

static int begin=0;//当为0时表示对于接收到的数据丢弃,1表示接收的数据放到数组array中。

int flags;//标志位,用到测试用。

char array[10];/数组。

char temp;

static int count=0;//数组计数。

uchar code dis1

uchar code dis2

uchar code dis3

uchar code dis4

uchar irdis[2];

uchar ircom[4];

void delay0(uchar x); x*0.14ms

void beep();

void dataconv();

void lcd_pos(uchar x,uchar y); 确定显示位置。

* 延时函数 */

void delay(int ms)

while(ms--)

uchar i;

for(i=0;i<250;i++)

nopnop_()

nop_()

nop_()

*检查lcd忙状态 */

*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 *

bit lcd_busy()

bit result;

lcd_rs = 0;

lcd_rw = 1;

lcd_en = 1;

delaynop();

result = bit)(p0&0x80);

lcd_en = 0;

return(result);

*写指令数据到lcd */

*rs=l,rw=l,e=高脉冲,d0-d7=指令码。

void lcd_wcmd(uchar cmd)

while(lcd_busy()

lcd_rs = 0;

lcd_rw = 0;

lcd_en = 0;

nop_()

nop_()

p0 = cmd;

delaynop();

lcd_en = 1;

delaynop();

lcd_en = 0写显示数据到lcd */

*rs=h,rw=l,e=高脉冲,d0-d7=数据void lcd_wdat(uchar datwhile(lcd_busy())

lcd_rs = 1;

lcd_rw = 0;

lcd_en = 0;

p0 = dat;

delaynop();

lcd_en = 1;

delaynop();

lcd_en = 0lcd初始化设定void lcd_initlcd_psb = 1并口方式。

wela=0;

dula=0;

lcd_wcmd(0x34扩充指令操作。

delay(5);

lcd_wcmd(0x30基本指令操作。

delay(5);

lcd_wcmd(0x0c显示开,关光标。

delay(5);

lcd_wcmd(0x01清除lcd的显示内容。

delay(5);

void lcd_init2()

uchar i;

delay(10延时。

/lcd_init初始化lcdlcd_pos(0,0设置显示位置为第一行的第1个字符。

i = 0;

while(dis1[i] !0显示字符。

lcd_wdat(dis1[i]);

i++;lcd_pos(1,0设置显示位置为第二行的第1个字符。

i = 0;

while(dis2[i] !0')

lcd_wdat(dis2[i显示字符。

i++;lcd_pos(2,0设置显示位置为第三行的第1个字符。

i = 0;

while(dis3[i] !0')

lcd_wdat(dis3[i显示字符。

i++;lcd_pos(3,0设置显示位置为第四行的第1个字符。

i = 0;

while(dis4[i] !0')

lcd_wdat(dis4[i显示字符。

ivoid lcd_init3()

lcd_pos(0,2);

lcd_wdat(0x3a);

lcd_pos(0,6);

lcd_wdat(0x3a);

lcd_pos(1,2);

lcd_wdat(0x3a);

lcd_pos(1,6);

lcd_wdat(0x3a);

lcd_pos(2,2);

lcd_wdat(0x3a);

lcd_pos(2,6);

lcd_wdat(0x3a);

lcd_pos(3,3);

lcd_wdat(0x3a主程序。

main()

lcd_init();

lcd_init2();

lcd_init3();

tmod=0x20;//设置定时器1为工作方式2

th1=0xfd;

tl1=0xfd;

tr1=1;

ren=1;

sm0=0;

sm1=1;

ea=1;es=1;

while(1)

p1=array[5延时x*0.14ms子程序void delay0(uchar x) /x*0.14ms

uchar i;

while(x--)

for (i = 0; i<13; i设定显示位置void lcd_pos(uchar x,uchar y) /设定在第x+1行第y+1列显示uchar pos;

if (x==0)

x=0x80;}

else if (x==1)

x=0x90;}

else if (x==2)

x=0x88;}

else if (x==3)

x=0x98;}

pos = x+y ;

lcd_wcmd(pos); 显示地址。

void serial() interrupt 4

ri = 0;

temp=sbuf;

if(temp=='begin==1)//如果是@,则接下来的数据都是要接收的,如果begin是1也表示是要接收的。

begin=1;

if(temp!='因为@是标致位,所以我们是要丢弃的。

if(temparray[count]=temp;

countelse if(temp=='#')/停止位。

begin=0;

count=0;

flags=1