在步进电机的控制中,离不开人机交互,以OLED屏为显示器件可以满足此类需求。这里选用I2C接口双色屏,它可以比SPI接口的OLED屏更节省I/O引脚,且在显示时可以色彩来区分功能标识和工作参数。
由于CH554的程序存储空间并不是很大,因此不便在程序中来存放中文字库,所以其提示信息宜采用英文提示或汉语拼音。该制作中,其工作界面如下图所示。在界面中看设置电机转动的方向及转动圈数。
为避开引脚的重叠,这里为OLED屏分配的引脚是P1.0和P1.1,其中P1.0与时钟引脚连接,P1.1与数据端连接。
对引脚的相关定义如下:
sbit scl = P1^0;
sbit sda = P1^1;
#define OLED_SCLK_Clr() scl =0
#define OLED_SCLK_Set() scl =1
#define OLED_SDIN_Clr() sda =0
#define OLED_SDIN_Set() sda =1
为节省存储空间,所用的显示字模为6*8的点阵,相应的字符显示函数如下:
- void OLED_ShowChar(unsigned char x,unsigned char y,unsigned char chr,unsigned char Char_Size)
- {
- unsigned char c=0,i=0;
- c=chr-' ';
- if(x>Max_Column-1){x=0;y=y+2;}
- if(Char_Size ==6)
- {
- OLED_Set_Pos(x,y);
- for(i=0;i<6;i++)
- OLED_WR_Byte(F6x8[c][i],OLED_DATA);
- }
- }
对应的数值显示函数为:
- void OLED_ShowNum(unsigned char x,unsigned char y,unsigned int num,unsigned char len,unsigned char size2)
- {
- unsigned char t,temp;
- unsigned char enshow=0;
- for(t=0;t<len;t++)
- {
- temp=(num/oled_pow(10,len-t-1))%10;
- if(enshow==0&&t<(len-1))
- {
- if(temp==0)
- {
- OLED_ShowChar(x+6*t,y,' ',size2);
- continue;
- }else enshow=1;
-
- }
- OLED_ShowChar(x+6*t,y,temp+'0',size2);
- }
- }
对应的字符串显示函数为:
- void OLED_ShowString(unsigned char x,unsigned char y,unsigned char *chr,unsigned char Char_Size)
- {
- unsigned char j=0;
- while (chr[j]!='\0')
- { OLED_ShowChar(x,y,chr[j],Char_Size);
- x+=8;
- if(x>120){x=0;y+=2;}
- j++;
- }
- }
对应的界面显示程序如下:
- [/i][i]OLED_Init();
- OLED_Clear();
- OLED_ShowString(0,0,"MOTOR CONTROL",6);
- OLED_ShowString(0,2,"Direction: +",6);
- OLED_ShowString(0,4,"Number of turns:",6);
- k=0;
- // 模拟转动圈数显示
- while(k<100)
- {
- k=k+1;
- OLED_ShowNum(0,10,k,3,6);
- mDelaymS(200);
- }
当然为了进行参数的设置,还需配置对应的触摸键处理程序。
此内容由EEWORLD论坛网友jinglixixi原创,如需转载或用于商业用途需征得作者同意并注明出处
本帖最后由 jinglixixi 于 2018-4-23 15:16 编辑