謝謝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);
} |