这里介绍一种在没有<math.h>头文件的情况下在lcd屏幕上画一个指针时钟的方法,这个方法基本可以不涉及数学知识,却能画出精确是时钟。

我们要画一个指针时钟,需要画出那些内容呢?1.时钟的背景;2.指针;明确了这两点我们就可以开始一个一个地完成了。

1.首先是时钟的背景,这个可以根据自己的喜欢选定一个比较漂亮的背景,然后经过转换软件将其输出为C语言数组类型,这里选用的软件是:Image2Lcd,其他的参数设置要根据实际情况来设,案例中是基于s5pv210的核心板和AT070TN92的lcd屏幕,选用的显示模式是24bpp,选用RGB接口,lcd的分辨率为800*480。

在设置好各个参数之后就可以选定保存,文件名的后缀为.h,于是就可以得到以下的数组:

在得到数组后,我们就可以把它存到video buffer中去,但是在存数据时需要注意一点,在这里我们先了解一下lcd的一些基础知识,首先是我们这里选用的显示模式是24bpp,也就是说R/G/B各占8bits的内容,每一个像素点都是由Red/Green/Blue颜色的搭配构成的,所以要确定一个像素点就需要RGB的值,而从软件中转换得来的数组就是RGB的值,在数组中每三个为一组,例如:gImage_color[0](R)、gImage_color[1](G)、gImage_color[2](B)为第一个像素点的RGB的值,在本案例中,设置s5pv210的显示控制器在把数据转换成对应一个像素点的RGB值时以字转换模式进行,也就说控制器的源数据需要是一个32位的数,而我们用软件转换出的是3个char类型为一小组的数据,这里就需要我们在存数据进video buffer时进行转换,一个32位的数据我们只需要以以下的方式进行存进去,fimd(s5pv210的显示控制器)就可以得到正确的32位的转换数据源了:

采用以下的函数将数据存到video buffer中:

2、接下来我们来看看怎么画时钟的指针:

我们都知道,要画指针,简单地说就是需要一个画线函数,画线函数也是通过循环调用换点函数实现的,网上有很多画线的算法,我们需要的只是从中选择一种算法,调用网上提供的的接口函数,然后根据自己的实际情况作细微修改成在自己平台能实现的画线函数,以下是一个根据本案例修改过的基于bresenham画线算法函数:

void draw_line(int x1,int y1,int x2,int y2,int color)

{

int dx = (x2 - x1)>=0?(x2-x1):(x1-x2);

int dy = (y2 - y1)>=0?(y2-y1):(y1-y2);

int yy = 0;

if (dx < dy) {

yy = 1;

swap_value(&x1, &y1);

swap_value(&x2, &y2);

swap_value(&dx, &dy);

}

int ix = (x2 - x1) > 0 ? 1 : -1;

int iy = (y2 - y1) > 0 ? 1 : -1;

int cx = x1;

int cy = y1;

int n2dy = dy * 2;

int n2dydx = (dy - dx) * 2;

int d = dy * 2 - dx;

if (yy) { // 如果直线与 x 轴的夹角大于 45 度

while (cx != x2) {

if (d < 0) {

d += n2dy;

} else {

cy += iy;

d += n2dydx;

}

draw_point(cy,cx,color);

cx += ix;

}

}

else { // 如果直线与 x 轴的夹角小于 45 度

while (cx != x2) {

if (d < 0) {

d += n2dy;

} else {

cy += iy;

d += n2dydx;

}

draw_point(cx,cy,color);

cx += ix;

}

}

}

画点函数(这个根据自己的实际情况写就可以了):

void draw_point(int i,int j,int color)

{ unsigned int *fbuf =(unsigned int *)0x42D2F000;

*(fbuf+800*j+i)=color;

}

有了画线函数,我们需要给两个点的坐标传给这个函数就可以做出相应的线即指针了,当然第一个点就是时钟的圆点(固定的),还有一个点的坐标就是指针的另外一个端点(随着时间变化的),常规来说,我们想要得到指针另外一个点需要涉及三角函数的计算,而当我们使用<math.h>和浮点数受到限制的时候怎么办呢?以下介绍一个比较原始的方法确定指针另外一个点的坐标,基本思想是精确地测出所有的时针、分针、秒针另一端会经过的坐标:

1.首先这是时钟背景图:

2.用电脑自带的画图软件,作出30根经过时钟圆点的直线:

3.换出大小不同的三个圆,表示3根指针另外一个端点的轨迹,然后移动鼠标就可以得到对应精确的坐标了(显示在左下角):

注意画图时一定要设为800*480像素

以下是我测出的数据:

int table_secx[60]={400,413,429,443,457,471,482,493,504,513,522,528,533,537,539,541,

539,537,533,528,522,513,504,493,482,471,457,443,429,414,400,

386,371,357,344,329,318,307,296,288,277,272,267,263,261,258,

261,263,267,272,277,288,296,307,318,329,344,357,371,386};

int table_secy[60]={98,101,103,107,112,117,127,135,146,157,170,182,196,210,225,240,

255,270,284,297,311,322,334,344,354,363,368,373,376,378,380,

378,376,373,368,363,354,344,334,322,311,297,284,270,255,240,

225,212,198,184,170,157,146,135,127,117,112,107,103,101};

int table_minx[60]={400,410,419,429,439,448,456,464,471,477,483,486,490,492,494,494,

494,492,490,486,483,477,471,464,456,448,439,429,419,410,400,

391,382,374,366,357,349,342,336,329,324,320,316,313,312,311,

311,312,314,316,321,325,331,337,345,353,362,370,380,390};

int table_miny[60]={145,145,147,149,153,157,162,169,176,184,192,200,210,219,229,239,

250,259,266,276,286,294,301,306,312,317,320,324,326,327,327,

327,326,324,320,317,312,306,301,294,286,276,266,259,250,239,

229,219,210,200,192,184,176,169,162,157,153,149,147,145};

int table_houx[60]={400,405,412,419,425,431,436,441,445,450,453,455,457,459,460,460,

460,459,457,455,453,450,445,441,436,431,425,419,412,405,400,

394,388,383,378,372,367,363,358,354,352,348,346,344,343,342,

343,344,346,348,352,354,358,363,367,372,378,383,388,394,};

int table_houy[60]={179,179,180,182,184,187,190,194,198,204,210,214,221,227,233,239,

246,252,257,263,269,274,279,283,286,288,291,293,294,295,295,

295,294,293,291,288,286,283,279,274,269,263,257,252,246,239,

233,227,221,214,210,204,198,194,190,187,184,182,180,179};

数组中的60个数据按顺序对应时钟中刻画的60格,所以当我们知道秒数的时候就可以得到对应指针的端点,然后送给画线坐标就可以做出对应的指针了,一下是实现的语句:

secx=table_secx[sec];

secy=table_secy[sec];

draw_line(400,240,secx,secy,0x0000ff);

minx=table_minx[min];

miny=table_miny[min];

draw_line(400,240,minx,miny,0x0000ff);

houx=table_houx[hou];

houy=table_houy[hou];

draw_line(400,240,houx,houy,0x0000ff);

最后我们还需要关注一个问题:指针每走过一个位置就需要消除上一次的痕迹,也就是说我们每重新画一次线就现将上一次线擦掉再画,由于这个时钟里面是一个白色的区域,也就是所我们只需要在上一次的位置画一根白线就可以擦掉原来的痕迹了。

到此,我们终于画好一个时钟,附上一个效果图:

lcd屏指针时钟画法相关推荐

  1. linux spi屏驱动程序,65 linux spi设备驱动之spi LCD屏驱动

    SPI的控制器驱动由平台设备与平台驱动来实现. 驱动后用spi_master对象来描述.在设备驱动中就可以通过函数spi_write, spi_read, spi_w8r16, spi_w8r8等函数 ...

  2. mipi接口 1280(RGB)*720 LCD屏开发驱动笔记帖

    ps:创业开发产品,自学笔记,不一定适合教材性的阅读,零碎整理,自我总结用 材料:4.1寸lcd屏两块,屏自带触控,屏幕资料具备,rk3399和MK8788开发版上分别开发. 开发环境: 1]rk33 ...

  3. STM32使用DHT11传感器读取温湿度,显示在LCD屏上

    文章目录 1. 温湿度传感器 DHT11/12 1.1 DHT1x应用电路图 1.2 温湿度模块引脚 1.3 连接到STM32上的引脚 1.4 STM32CubeMX属性配置 1.5 调用函数 2. ...

  4. STM32----电容触摸屏,OLED屏和LCD屏

    目录 电容触摸屏 OLED屏 LCD屏 电容触摸屏 充放电电路原理: 电路充放电公式: 电容触摸按键原理: R:外接电容充放电电阻. Cs:TPAD和PCB间的杂散电容. Cx:手指按下时,手指和TP ...

  5. LCD屏参:手把手教你计算LCD屏参(proch值)

    LCD屏参(proch值)解释和计算 Linux内核的lcd控制器使用clcd_panel结构体表示一个LCD屏的硬件参数: /* include/linux/fb.h */   struct fb_ ...

  6. LCD RGB 控制技术 时钟篇(上)

    LCD RGB 控制技术讲解 - 时钟篇(上) 个人笔记,欢迎转载,请注明出处,共同分享 共同进步 LCD RGB 控制技术 时钟篇(上)_人有三样东西是无法隐瞒的,咳嗽,穷困和爱,你想隐瞒越欲盖弥彰 ...

  7. 【解决方案】STM32L152单片机驱动段码LCD屏,执行HAL_LCD_Init函数失败返回HAL_TIMEOUT,长时间卡在LCD_FLAG_RDY的while循环里面的解决办法

    STM32L152单片机驱动段码LCD屏,HAL_LCD_Init函数执行失败,卡在LCD_FLAG_RDY里面,函数返回HAL_TIMEOUT /*!< Wait Until the LCD ...

  8. QSPI驱动带NV3030B的LCD屏

    (说明:本文没有详细描写有关QSPI通信时的细节,只是作为一个简要记录,说明一下QSPI驱动屏幕时的一些要点) 1.引脚说明: (1)LED_K:LCD屏背光负极 (2)LED_A:LCD屏背光正极 ...

  9. STM32 FSMC接口驱动4.3寸TFT LCD屏

    STM32 FSMC接口驱动4.3寸TFT LCD屏 STM32的FSMC接口是并行总线接口,可以用于驱动存储芯片如FLASH/SRAM等,也可以用于驱动并口LCD屏. 这里以STM32F103VET ...

  10. 屏幕篇—如何最快速驱动LCD屏

    屏幕篇-如何最快速驱动LCD屏 前言 LCD屏的驱动对于新手来说,这是一个很大的拦路虎.学完基础外设后,在这里就不知道怎么下手了.一个完整的LCD驱动包含的内容是非常多的,最基础的描点,画线,显示字符 ...

最新文章

  1. MYSQL中LIMIT用法_后台分页
  2. java 日期计算类_java日期计算工具类【包含常用的日期计算方法】
  3. JavaWeb学习总结(五十三)——Web应用中使用JavaMail发送邮件
  4. 微信浏览器的html5页面显示配置等问题汇集 1,禁止微信浏览器分享页面链接 (定点更新)...
  5. (6)<a>标签如何实现点击既不刷新也不跳转的功能
  6. ascii码二进制十进制十六进制对照表
  7. pycharm搜索不到安装包
  8. linux打开dwg文件怎么打开方式,dwg文件扩展名,dwg文件怎么打开?
  9. matlab图像放大程序,图像放大并进行BiCubic插值 Matlab/C++代码
  10. telegram bot : 自动下载youtube视频 发送到电报客户端
  11. 智能电子秤方案测脂肪模块设计
  12. 消化系统疾病病人的护理
  13. 关于项目采购管理,这些你需要知道
  14. java image 内存_Java BufferedImage内存消耗
  15. 软件测试 - Linux的常用命令
  16. MySQL数据库(安装配置 语句语法使用 项目中操作MySQL)
  17. 计算机网络基础(2)
  18. PyTorch源码浅析(2):THC
  19. Python科研数据分析专题之缺失值填补
  20. CCNA1:网路基础、TCP/IP、OSI、IPv4、子网划分、数据封装

热门文章

  1. safari遮罩无效
  2. php输出一个直角三角形,php hypot()直角三角形斜边长度 is_infinite()是否为无限值...
  3. Mysql-explain-Impossible WHERE noticed after reading const tables
  4. 【第三方互联】15、百度(baidu)授权第三方登录
  5. 在苹果Mac上怎样使用鼠标来放大图像?
  6. PMI-ACP敏捷项目认证练习题(四)
  7. Python3判断字符中英文数字符号
  8. IDEA左侧,按照文件夹排序
  9. sqlplus 执行脚本经验总结
  10. 华为WLAN基本概述