大家看见这个标题时候可不要误认为我这有什么所见只所得的小工具。
我是有次在网上看见人这样使用的,也由于自己经常会用单片机编写界面,但是每次都要编译下载。这个过程很浪费时间。
那我们能不能在VC++里编写一个仿真液晶屏界面在上面把界面和按键动作都调好,然后移植到单片机里,这样会加快开发速度。
在这里我要说下我一般使用的是点阵屏,像什么12864或者19264之类的。对于这种液晶屏我一般都先在单片机里定义一个显示缓存,修改完缓存后写入到液晶屏里,这样绘图速度会很快很快,缺点是有点浪费内存,12864需要128*64/8=1024B,这对于STM32来说不是什么问题,对于51单片机这种方法貌似也行的,因为STC扩展内存有1KB,可以拿来做显存。
我们再来说说用上位机来开发时候上位机除了不能仿真单片机外设外,像什么定时器、按键、显示都可以仿真的,因此你主需要把外设驱动写好,在上位机端把输入输出部分实现了,接下来工作就很简单了,而且你还会发现在上位机上开发很快。
上位机这边的开发的大体思路是编写绘制矩形的函数,液晶屏上每个点就是一个小方块。根据显存里的存的是1还是0来决定点亮或者熄灭。
如果你们编写过程中重绘窗口时候发现闪烁,可以使用双缓冲来绘图。
//#define LCD_XSIZE 128
//#define LCD_YSIZE 64
//#define SIZE 3 //像素块大小
//#define ITV 1 //像素块间距
//u8 DispRAM[LCD_YSIZE][LCD_XSIZE/8]; //点矩阵对应数组
//const u8 DotTable[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
//#define BkColor RGB(220,220,220)
//#define FrColor RGB(255,50,30)
void CDrawView::RefreshDisp()
{
CDC *pDC=CDrawView::GetDC();
if(!pDC) return;
CDC MemDC; //首先定义一个显示设备对象
CBitmap MemBitmap; //定义一个位图对象
MemDC.CreateCompatibleDC(NULL); //随后建立一个与屏幕显示兼容的位图,至于位图的大小可以用窗口的大小.
MemBitmap.CreateCompatibleBitmap(pDC,LCD_XSIZE*(SIZE+ITV),LCD_YSIZE*(SIZE+ITV));
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
MemDC.FillSolidRect(0,0,LCD_XSIZE*(SIZE+ITV),LCD_YSIZE*(SIZE+ITV),RGB(255,255,255));
CPoint point,m_ptOrigin;
CBrush brush(FrColor);
CBrush brush_bk(BkColor); //背景 {MOD}
for(int j=0;jBitBlt(XBASE,YBASE,LCD_XSIZE*(SIZE+ITV),LCD_YSIZE*(SIZE+ITV),&MemDC,0,0,SRCCOPY);
MemBitmap.DeleteObject();
MemDC.DeleteDC();
}
下面给出打点函数
#define POINT DispRAM[y][x/8] //(x,y)在数组里对应的表示方式
#define PMASK DotTable[x&0x07]
void GUI_Point(short x,short y,u8 color) //打点函数
{
if(color)
POINT |= PMASK;
else
POINT &= ~PMASK;
}
有了底层画点函数,什么线、面、我相信你们肯定会了。
所有核心代码都给出来了,如果你说我不会MFC,那我推荐你看孙鑫老师的视频,我就是看了他的视频把这个程序写出来的,相信你看了你也会:)