谢谢14楼!!
由于粗心,在发帖时漏掉了init(),一直没发现,你质疑了才发现,那是当时删除其他文字时误删的。
现将程序全部重发一下。
这个程序keil 上调试是顺利的。
我现在最想知道的是:如何在串口助手上让电脑发送一个 M ?
#include "reg52.h"
#define uchar unsigned char
#define uint16 unsigned int
void Init();
void delay_1ms(uint16);
void SetLcd12864();
void WriteDat(uchar dat);
void WriteIns(uchar ins);
void ShowAddr(uchar x,uchar y);
#define LcdValue P1 //定义数据口
sbit LCD_RS=P3^5; //定义工作指令性质设置口:指令、数据
sbit LCD_RW=P3^6; //定义工作模式设置口:写、读
sbit LCD_EN=P3^7; //定义使能口
sbit PSB=P3^2; //定义通讯方式口: =1:并口,8位 =0:串口
sbit RST=P3^3; //定义复位口
uchar message=0;
uchar code menuA[] ={" Hello ! "};
uchar code menuC[] ={" Over! "};
uchar code menuB[] ={" N "};
main()
{
Init();
while(1)
{
uchar i;
if(message != 0) //!=0:收到电脑发来的信息有效
{
delay_1ms(2000);
SBUF='N';
while(!TI);
TI=0;
ShowAddr(2,0);
for(i=0;i<16;i++) WriteDat(menuB[i]); //'N'
delay_1ms(2000);
message=0; //消息清0,等待新消息
ES=1;
} } }
void receive() interrupt 4 //串行接收服务程序
{
uchar i;
RI=0; //收到标志清0
ES=0;
message=SBUF; //从上位机收到的存入:
if(message=='M') //判断信息是 M吗?
{
ShowAddr(3,0);
for(i=0;i<16;i++) WriteDat(menuC[i]); //“ Over! ”
message=1;
}
else
message=0;
}
void Init()
{
uchar i;
SetLcd12864(); //初始化12864
delay_1ms(1000);
ShowAddr(1,0);
for(i=0;i<16;i++) WriteDat(menuA[i]); //“ Hello ! ”
TMOD=0x20; //定时器1,工作方式2
TH1=0xfd; //波特率9600,晶振11.0592
TL1=0xfd;
TR1=1; //开定时器1
SM0=0; //串行工作方式1
SM1=1; //SCON 设置:sm0,sm1,ren
REN=1; //允许串行接收
ES=1; //开串口中断
EA=1; //开总中断
}
void delay_1ms(uint16 n)
{
uchar m;
while(n--)
{
m=123;
while(m--);
}
}
//********** 初始化 ***********//
void SetLcd12864()
{
PSB=1; //p23 //工作方式:8位,并口
RST=1; //p25 //复位
LCD_EN=0; //p22 使能
WriteIns(0x30); //写入指令:采用基本指令系统
delay_1ms(5);
WriteIns(0x0c); //写入指令:开显示,关光标,不反白
delay_1ms(5);
WriteIns(0x01); //写入指令:清屏
delay_1ms(5);
}
//********* 写指令的接口操作 ************//
void WriteIns(uchar ins)
{
LCD_RS=0; //p20 =0:指令模式
LCD_RW=0; //p21 =0:写模式, =1:读模式
LCD_EN=1; //p22
LcdValue = ins; //发送指令数据
delay_1ms(1);
LCD_EN=0;
}
//********* 写数据的接口操作 ************//
void WriteDat(uchar dat)
{
LCD_RS=1; //p20 =1: 数据模式
LCD_RW=0; //p21 =0:写模式, =1:读模式模式
LCD_EN=1;
LcdValue = dat;
delay_1ms(1);
LCD_EN=0;
}
//********** 设置显示位置 **********//
void ShowAddr(uchar x,uchar y) //xy:显示地址,行位
{
if(x==0)
x=0x80;
else if(x==1)
x=0x90;
else if(x==2)
x=0x88;
else if(x==3)
x=0x98;
WriteIns(x+y);
} |