程序要实现的目的:上位机发送的3个字符能在1602上显示。 程序如下: 顶层文件: #include "reg52.h" #include "string.h" #include"lcd1602.h"
//#include "mscom.h"
#define uint unsigned int #define uchar unsigned char
uchar code LCD1[]={"StepMotorContorl:"}; uchar code LCD2[]={"Speed:"}; unsigned int LCD3[]; unsigned int re_dat[3];
unsigned int count; unsigned char temp0,temp1,temp2; unsigned int speed; //***************************************** // 电机初始化 //***************************************** /* void init() { RE=0; HA=1; // 整部 CW=1; // 正传 EN=1; // 电机使能 CON=0; // 电机绕组限流控制 CL=1; RE=1; } */ //***************************************** // 串口初始化 //***************************************** void init_serialcomm(void) { SCON = 0x50; //确定串口控制:方式1(10位异步收发,波特率由定时器1控制),允许串口接收 TMOD = TMOD|0x20; //确定定时器1的工作方式:方式2(常数自动装如的8位T/C,TH寄存8位初值,TL进行8位计数) PCON = 0x80; //串口波特率加倍位SMOD=1 TH1 = 0xf3; //计算装入初始值使波特率=4800(fosc=12MHz ) TL1 = 0xf3; TR1 = 1; //启动定时器1 IE = 0x9A; //串口在中断方式工作时,开CPU和源中断
}
//***************************************** // LCD1602初始化 //***************************************** void LCD_Init(void) { WriteOrder(0X01); // clear display WriteOrder(0x38); //两行显示 WriteOrder(0x0C); // open display WriteOrder(0x06); //set the way of input :AC++
}
//***************************************** // 串口中断 //*****************************************
void serial () interrupt 4 {
if(RI) { re_dat[count]=SBUF; RI=0; count++; } }
//***************************************** // 主程序 //*****************************************
void main() { delayms(10); init_serialcomm(); LCD_Init(); WriteData(0,0,LCD1); WriteData(1,0,LCD2); WriteData(1,6,"0"); WriteData(1,10,"r/min"); while(1) { count=0; while(RI==0); //comm_re(); WriteDat(2,49);
} }
1602显示程序: #include"reg52.h" #include "string.h" #include"lcd1602.h" #define uint unsigned int #define uchar unsigned char
//************************************* // 延时程序 //************************************* void delayms(uint t) { uint i; while(t--) { for(i=0;i<100;i++); } } //************************************* // LCD1602 判忙函数 //************************************* Is_busy() { rs=1; rw=0; en=0; LCD_Data=0xff; rs=0; rw=1; en=0; delayms(10); en=1; while(busy);
} //************************************ // 写命令 //************************************ void WriteOrder(uchar Order) {
rs=0; rw=0; en=0; delayms(10); en=1; LCD_Data=Order;
} //************************************ // 写字符串 //************************************ void WriteData(uchar y,uchar x,unsigned char LcdData[]) { uchar j,len; len= strlen (LcdData); if(0==y) { WriteOrder(x+0x80); } else { WriteOrder(x+0xC0); } rs=0; rw=0; en=0; delayms(10); en=1; for(j=0;j<len;j++) { LCD_Data=LcdData[j]; Is_busy(); en=1; } }
//************************************** // 写数字 //************************************** void WriteDat(unsigned char x,unsigned char dat) { //LCD_Data=0x00; WriteOrder(x+0xC0); Is_busy(); rs=0; rw=0; en=0; delayms(10); en=1; LCD_Data=dat; en=1; delayms(10); en=0; rs=0; rw=1;
}
现在遇到的问题是:顶层文件有串口中断函数的嘛,1602初始化不显示,但是把中断函数给注释掉,1602初始化显示正常。 实在是显不出为什么,调了一星期了,没有进展。。。 |