如何快速搭建单片机液晶屏界面开发速度

大家看见这个标题时候可不要误认为我这有什么所见只所得的小工具。

我是有次在网上看见人这样使用的,也由于自己经常会用单片机编写界面,但是每次都要编译下载。这个过程很浪费时间。

那我们能不能在VC++里编写一个仿真液晶屏界面在上面把界面和按键动作都调好,然后移植到单片机里,这样会加快开发速度。

在这里我要说下我一般使用的是点阵屏,像什么12864或者19264之类的。对于这种液晶屏我一般都先在单片机里定义一个显示缓存,修改完缓存后写入到液晶屏里,这样绘图速度会很快很快,缺点是有点浪费内存,12864需要128*64/8=1024B,这对于STM32来说不是什么问题,对于51单片机这种方法貌似也行的,因为STC扩展内存有1KB,可以拿来做显存。

我们再来说说用上位机来开发时候上位机除了不能仿真单片机外设外,像什么定时器、按键、显示都可以仿真的,因此你主需要把外设驱动写好,在上位机端把输入输出部分实现了,接下来工作就很简单了,而且你还会发现在上位机上开发很快。


上位机这边的开发的大体思路是编写绘制矩形的函数,液晶屏上每个点就是一个小方块。根据显存里的存的是1还是0来决定点亮或者熄灭。


如果你们编写过程中重绘窗口时候发现闪烁,可以使用双缓冲来绘图。

//#define LCD_XSIZE 128
//#define LCD_YSIZE 64
//#define SIZE<span style="white-space:pre">	</span>3<span style="white-space:pre">		</span>//像素块大小
//#define ITV<span style="white-space:pre">	</span>1<span style="white-space:pre">		</span>//像素块间距
//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);			//背景色

	for(int j=0;j<LCD_YSIZE;j++)
	{
		m_ptOrigin.y=j*(SIZE+ITV);
		point.y=m_ptOrigin.y+SIZE;
		for(int i=0;i<LCD_XSIZE;i++)
		{
			m_ptOrigin.x=i*(SIZE+ITV);
			point.x=m_ptOrigin.x+SIZE;

			if(DispRAM[j][i/8]&DotTable[i&0x07])
				MemDC.FillRect(CRect(m_ptOrigin,point),&brush);
			else
				MemDC.FillRect(CRect(m_ptOrigin,point),&brush_bk);
		}	
	}
	pDC->BitBlt(XBASE,YBASE,LCD_XSIZE*(SIZE+ITV),LCD_YSIZE*(SIZE+ITV),&MemDC,0,0,SRCCOPY);
	MemBitmap.DeleteObject();
	MemDC.DeleteDC();
}
下面给出打点函数

#define POINT DispRAM[y][x/8]<span style="white-space:pre">			</span>//(x,y)在数组里对应的表示方式
#define PMASK DotTable[x&0x07]
void GUI_Point(short x,short y,u8 color) <span style="white-space:pre">	</span>//打点函数
{	
	if(color)
	<span style="white-space:pre">	</span>POINT |= PMASK;
	else 
		POINT &= ~PMASK;
}

有了底层画点函数,什么线、面、我相信你们肯定会了。

所有核心代码都给出来了,如果你说我不会MFC,那我推荐你看孙鑫老师的视频,我就是看了他的视频把这个程序写出来的,相信你看了你也会:)

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值