基于单片机的PCB钻床控制系统设计 第12页
图4-3 读写波形图若图片无法显示请联系QQ752018766
编程如下:
首先,我们定义关于HD61202液晶控制器相关寄存器的宏(相关寄存器的定义可以查看芯片文档)。
#define LCD61202_BASE 0x20000000
#define WrDATA2(ch) (*(U8*)(LCD61202_BASE+1))=(U8)(ch)
#define RdSTUS2() (*(U8*)(LCD61202_BASE+2))
#define RdDATA2() (*(U8*)(LCD61202_BASE+3))
#define LCD1_ON() WrCMD1(0x
#define LCD1_OFF() WrCMD1(0x3E)
#define LCD1_STATRT_SET(n) WrCMD1(0xC0︱((char)n))
#define LCD2_STATRT_SET(n) WrCMD2(0xC0︱((char)n))
#define LCD2_ROW_SET(n) WrCMD2(0xB8︱((char)n))//page set
#define LCD2_COL_SET(n) WrCMD2(0x40︱((char)n))//y address set
#define LCD2_BUSY (RdSTUS2()&80)
#define LCD2_ONOFF (RdSTUS2()&20)
#define LCD2_RESET (RdSTUS2()&10)
首先需要对LCD所在的bank进行设置,对LCD进行初始化,代码如下。
void init_LCD(void){
设置系统bank
rBWCON&=0xfff0ffff;
rBANKCON4=0x7ff0;
//复位LCD
LCD_delay();
while(LCD1_RESET);LCD_delay();
while(LCD2_RESET);LCD_delay();
LCD2_START_SET(0);LCD_delay();
LCD1_START_SET(0);LCD_delay();
//使能LCD
LCD1_ON();LCD_delay;
LCD2_ON();LCD_delay;
}
LCD2_COL_SET(0);LCD_delay();
for(j=0;j<64;j++){
WrDATA1(0);LCD_delay;
WrDATA2(0);LCD_delay;
}
}
Void set_LCD(U8 index,U8*buf){
//将buf里的内容显示到第index行的显存中
for(j=0;j<64;j++){
WrDATA1(buf[j]);LCD_delay;//设置显示内容
}
LCD2_COL_SET(0);LCD_delay();
for(j=0;j<64;j++){
WrDATA2(buf[j]);LCD_delay;//设置显示内容
}
}
在数控钻床中,我们对工作台电机的控制主要是在人为移动工作台时和加工时系统自动的控制工作台的移动。在人为移动工作台时,我们可以分为两类:一类是点动,我们按住点动键电机就移动,这没有什么好讲。我们来讲一下,非点动时人为移动工作台。它是通过操作人员输入坐标值后,系统自动运行到目标位置。图4-2是非点动时人为移动工作台和加工时系统自动的控制工作台的移动的实现流程。其中X轴、Y轴的运行控制函数程序如下:
void motor(int *p,int counter)
//*p指向孔位置数组,其中数组元素为孔位置的x、y轴的坐标,counter为孔的数量
{
int *post;
int i=0;
int x;
int y;
post=p;
for(i=0;i<counter ; i++)
{
x=(*(post+1)).x-(*post).x ;
y=(*(post+1)).y-(*post).y ;
post++;
if(y<0)
{rPDATD &=(~0x20); }
else
if(x<0)
{rPDATD &=(~0x80); }
}
rPDATD &=(~0x88);
}
4.4 本章小结
PCB钻床控制系统的软件设计是本论文的重点。这一章详细介绍了PCB钻床控制系统几个重点模块的软件设计,包括键盘的软件设计、串口程序设计、LCD模块程序设计、电机控制功能的实现。
<< 上一页 [11] [12] [13] [14] 下一页