本帖最后由 colin2135 于 2016-1-20 11:44 编辑
非常感谢21ic,又给予我一次试用的机会。这次是以资深大牛的身份得到F469 DISCOVERY,所以,接下来,我会尽我最大的努力,写一些能帮助大家的 东西。
收藏了将近10块STM32开发板,F469 DISCOVERY无疑是我最喜欢的一块了。
我将会大家带来几期关于在mbed上开发的经验帖,帮助大家去尝试使用mbed的开发平台。 为什么选择在mbed上开发,原因有几下几点: 1. mbed上的开发跟ardunio非常相似,对于从没接触stm32,只会51单片机或者ardunio又准备学习stm32的新手们来说,这是非常快速,并且容易上手的方法。 2. mbed在近一年来,不断的更新,不断的优化,不断的加入更多的设备支持,我相信在以后,会有越来越多的人加入这个社区,而我愿意走在大家前面,帮大家比比看与传统的STM32开发对比,mbed能取代它? 3. 有时间的话,多学习一种技术,何乐而不为呢。 所以,如果大家认为我的教程有帮助,希望在小跑堂的投票中给我投上一票。 https://bbs.21ic.com/forum.html?mod=viewthread&tid=1277786 在这里就不给大家开箱什么的了,直接上干货。
今天,给大家演示的是在mbed上使用LCD,所以,我们先写一个简单的Demo,再讲解LCD里面所有的函数。 1、首先新建一个工程。 2.插入两个需要用到的库文件,BSP_DISCO_F469NI和LCD_DISCO_F469NI.插入库的过程如下。右键刚才所新建的程序。点击Import Library->From Import Wizard
3.步骤(1):在seach输入“mbed”。(2):双击Author为mbed offcial的mbed。这样就成功添加 BSP_DISCO_F469NI。
4.步骤(1):在seach输入“lcd_disco”。(2):双击Name为LCD_DISCO_F469NI。这样就成功添加 BSP_DISCO_F469NI。 5.再右键Import file,加入main.cpp。我们给main.cpp添加一段代码: http://#include "mbed.h"
#include "LCD_DISCO_F469NI.h"
LCD_DISCO_F469NI lcd;
int main()
{
lcd.DisplayStringAt(0, LINE(1), (uint8_t *)"welcome to 21ic", CENTER_MODE);
while(1){
}
return 0;
}
6.点击compile后,网页提示下载一个bin文件 ,把它放到F469所在的盘,RESET重启。恭喜我们的第一个Demo顺利完成。 下面,开始对一些函数进行讲解。如果有误,请帮忙指出,多多指教。 LCD_DISCO_F469NI lcd; 在声明lcd对象后,做了些什么呢,我们看LCD_DISCO_F469NI的构造函数 LCD_DISCO_F469NI::LCD_DISCO_F469NI()
{
BSP_LCD_Init();//BSP层的一些初始化,时钟,SDRAM,字体大小,屏幕方向等的一些默认设置
BSP_LCD_InitEx(LCD_ORIENTATION_LANDSCAPE);//也是对BSP层的初始化,但多了自定义屏幕方向的参数
//对layout的初始化,像素的格式,frame的缓存地址,字体颜色等等
BSP_LCD_LayerDefaultInit(LTDC_ACTIVE_LAYER_BACKGROUND, LCD_FB_START_ADDRESS);
//设置字字大小
BSP_LCD_SetFont(&Font20);
//把当前显示清除成白色
BSP_LCD_Clear(LCD_COLOR_WHITE);
}
做完这初始化后,就可以调用LCD_DISCO_F469NI.h的函数了。
首先讲void Clear(uint32_t Color)函数,这个函数是对当前LCD区域进行颜色填充,起到清屏的作用。 我们对上面的那段进行小修改, int main()
{
//lcd.DisplayStringAt(0, LINE(1), (uint8_t *)"welcome to 21ic", CENTER_MODE);
lcd.Clear(LCD_COLOR_BLUE);
while(1){
}
return 0;
}
编译下载到板子上,可以看到整个LCD屏幕都被填充成蓝色。 下面4个函数是读取当前LCD设置的大小,和设置当前LCD大小 uint32_t GetXSize(void); uint32_t GetYSize(void); void SetXSize(uint32_t imageWidthPixels); void SetYSize(uint32_t imageHeightPixels);
下面这个函数是对前景或者背景进行初始化设置,像素的格式,frame的缓存地址,字体颜色等等 LayerDefaultInit(uint16_t LayerIndex, uint32_t FB_Address)
这个函数是选择默认的layout是哪个 void SelectLayer(uint32_t LayerIndex)
这个函数是设置前景或背景是否可见。 void SetLayerVisible(uint32_t LayerIndex, FunctionalState State);
这个函数是设置前景或背景的透明度。 void SetTransparency(uint32_t LayerIndex, uint8_t Transparency);
这个函数是设置前景或背景的图片缓存地址。 void SetLayerAddress(uint32_t LayerIndex, uint32_t Address);
这个函数是设置前景或背景的显示区域。 void SetLayerWindow(uint16_t LayerIndex, uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height);
使用一个表面的时候将其背景色去掉 void SetColorKeying(uint32_t LayerIndex, uint32_t RGBValue); void ResetColorKeying(uint32_t LayerIndex); 举个例子: 使用SetColorKeying和不使用的效果分别如下图: 拍照的效果有偏差,其实是跟上面一样的蓝色,SetColorKeying就是抠图,去掉背景。 大家可以尝试以下代码: lcd.Clear(LCD_COLOR_GREEN);
lcd.SetTextColor(LCD_COLOR_BLUE);
lcd.FillRect(10, 20, 50, 50);
lcd.SetColorKeying(0,LCD_COLOR_GREEN);
下面两个函数是设置和读取字体的颜色 void SetTextColor(uint32_t Color); uint32_t GetTextColor(void);
下面两个函数是设置和读取字体背景颜色 void SetBackColor(uint32_t Color); uint32_t GetBackColor(void); 设置和读取字体大小 void SetFont(sFONT *fonts); sFONT *GetFont(void); 读取当前(X,Y)坐标的RGB像素值 uint32_t ReadPixel(uint16_t Xpos, uint16_t Ypos);
清除所在行的字符串 void ClearStringLine(uint32_t Line);
显示字符串在(X,Y)坐标开始,Mode是对齐模式,有三种,靠左LEFT_MODE,靠右RIGHT_MODE,居中CENTER_MODE void DisplayStringAt(uint16_t Xpos, uint16_t Ypos, uint8_t *Text, Text_AlignModeTypdef Mode);
在某行显示字符串 void DisplayStringAtLine(uint16_t Line, uint8_t *ptr);
显示单个字母 void DisplayChar(uint16_t Xpos, uint16_t Ypos, uint8_t Ascii);
从(X,Y)坐标开始,画长度为Length的直线 void DrawHLine(uint16_t Xpos, uint16_t Ypos, uint16_t Length); 从(X,Y)坐标开始,画长度为Length的坚线 void DrawVLine(uint16_t Xpos, uint16_t Ypos, uint16_t Length);
从一个点画一条线到另外一个点 void DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);
下面分别是画矩形,圆形,椭圆型的,中间为空的。 void DrawRect(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height); void DrawCircle(uint16_t Xpos, uint16_t Ypos, uint16_t Radius); void DrawEllipse(int Xpos, int Ypos, int XRadius, int YRadius);
下面这个是画多边形 void DrawPolygon(pPoint Points, uint16_t PointCount); 举例:画一个三角形 Point point[3];
point[0].X=20;
point[0].Y=20;
point[1].X=50;
point[1].Y=50;
point[2].X=20;
point[2].Y=90;
lcd.Clear(LCD_COLOR_GREEN);
lcd.DrawPolygon(point,3);
用法与上面一样,但是中间是覆盖的。 void FillRect(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height); void FillCircle(uint16_t Xpos, uint16_t Ypos, uint16_t Radius); void FillPolygon(pPoint Points, uint16_t PointCount); void FillEllipse(int Xpos, int Ypos, int XRadius, int YRadius);
LCD显示和打开的开关。 void DisplayOn(void); void DisplayOff(void);
下面带来难度比较大的,显示图片。 mbed库文件显示图片有两种方式,一种是通过ARGB显示,一种是BMP图像 今天给大家使用ARBG模式,大家回去自己试一下显示BMP图像。
ARGB的方式转为繁琐,需要先将图片转为数组文件,然后通过以下函数进行像素填充。大家可以网上下载把图像转成ARGB的数组文件软件。 void DrawPixel(uint16_t Xpos, uint16_t Ypos, uint32_t RGB_Code); 填充函数 #include "mbed.h"
#include "LCD_DISCO_F469NI.h"
#include "picture.h"
LCD_DISCO_F469NI lcd;
uint16_t picture_width=800;
uint16_t picture_height=480;
int main()
{
int i,j;
uint32_t ARGB=0;
lcd.SetLayerWindow(0,0,0,picture_width,picture_height);
for(j=0;j<picture_height;j++){
for(i=0;i<picture_width;i++)
{
ARGB=*((uint32_t*)(gImage_picture+j*picture_width*4+i*4));
ARGB|=0Xff000000;//<span style="color: rgb(0, 0, 10); font-family: 'Droid Sans'; font-size: 10.5pt; line-height: 1.5;">ARGB</span><font face="Droid Sans" style="color: rgb(0, 0, 10); font-family: 'Droid Sans'; font-size: 10.5pt; line-height: 1.5;">中的</font><font face="Calibri" style="color: rgb(0, 0, 10); font-size: 10.5pt; line-height: 1.5;">A</font><font face="Droid Sans" style="color: rgb(0, 0, 10); font-family: 'Droid Sans'; font-size: 10.5pt; line-height: 1.5;">代表透明度,我们设置为</font><font face="Calibri" style="color: rgb(0, 0, 10); font-size: 10.5pt; line-height: 1.5;">FF</font><font face="Droid Sans" style="color: rgb(0, 0, 10); font-family: 'Droid Sans'; font-size: 10.5pt; line-height: 1.5;">,不透明。</font>
|