昨晚疯狂的打了一夜的LOL,感觉L多了,今天一天精神萎靡.还是继续把显示字符给看了,可是在犹豫要不要写这篇文章

事实上写的东西也就是copy别人家的代码,不想写那么多,就记录下自己困惑的地方吧.也许改天回来看的时候能让自己高速的明确

也也许能帮助到有些朋友..

看了奋斗给的样例和偷偷去下了正点原子的样例,事实上都是差点儿相同的,仅仅要略微改下都能够通用的,原理就在那里,跑不了.

奋斗给的样例,都是人家的

  1. void lcd_wr_zf(u16 StartX, u16 StartY, u16 X, u16 Y, u16 Color, u8 Dir, u8 *chr)
  2. { unsigned int temp=0,num,R_dis_mem=0,Size=0,x=0,y=0,i=0;
  3.  
  4. if(Dir==2) LCD_WR_CMD(0x0003,0x1010); //图像显示方向为右下起 行递减 列递增 AM=0 I/D[1:0]=00 <--
  5. else if(Dir==3) LCD_WR_CMD(0x0003,0x1028); //图像显示方向为右上起 行递减 列递增 AM=1 I/D[1:0]=10 V
  6. if(Dir==0){
  7. LCD_WR_CMD(0x0003,0x1030); //图像显示方向为左上起 行递增 列递增 AM=0 I/D[1:0]=11 -->
  8. LCD_WR_CMD(0x0210, StartX); //水平显示区起始地址 0-239
  9. LCD_WR_CMD(0x0211, StartX+X-1); //水平显示区结束地址 0-239
  10. LCD_WR_CMD(0x0212, StartY); //垂直显示区起始地址 0-399
  11. LCD_WR_CMD(0x0213, StartY+Y-1); //垂直显示区结束地址 0-399
  12. LCD_WR_CMD(0x0200, StartX); //水平显示区地址
  13. LCD_WR_CMD(0x0201, StartY); //垂直显示区地址
  14. LCD_WR_REG(0x0202); //准备写数据显示区
  15. Size=X*Y; //字符串或字符占用的像素尺寸
  16. while(i<Size){
  17. temp=*chr++; //一个字节代表8个像素,因此加1代表索引到下8个像素
  18. for(num=0; num<8; num++){ //数组的每一个字节代表了8个像素
  19. if((temp&0x80)>0){ //对字节的各位进行推断,为1的用带入參数的16位颜色值标示,写入到像素位置。
  20.  
  21. LCD_WR_Data(Color);
  22. }
  23. else{
  24. LCD_WR_CMD(0x0200, StartX+x); //水平显示区地址
  25. LCD_WR_CMD(0x0201, StartY+y); //垂直显示区地址
  26. LCD_WR_REG(0x0202); //准备读数据显示区
  27. R_dis_mem=LCD_RD_data(); //读取背景色,为叠加产生透明效果作准备
  28. LCD_WR_Data(R_dis_mem); //对字节的各位进行推断。为0的用当前背景像素16位颜色值标示。
  29. }
  30. temp=temp<<1; //字节各位的移出
  31. x++;
  32. if(x>=X){x=0; y++;} //计算像素递增为当前的x和y,为当前像素读背景颜色做准备
  33. i++;
  34. }
  35.  
  36. }
  37. }
  38. else if(Dir==1){
  39. LCD_WR_CMD(0x0003,0x1018); //图像显示方向为左下起 行递增 列递减 AM=1 I/D[1:0]=01 A
  40. LCD_WR_CMD(0x0210, StartY); //水平显示区起始地址 0-239
  41. LCD_WR_CMD(0x0211, StartY+Y-1); //水平显示区结束地址 0-239
  42. LCD_WR_CMD(0x0212, 399-(StartX+X-1)); //垂直显示区起始地址 0-399
  43. LCD_WR_CMD(0x0213, 399-StartX); //垂直显示区结束地址 0-399
  44. LCD_WR_CMD(0x0200, StartY); //水平显示区地址
  45. LCD_WR_CMD(0x0201, 399-StartX); //垂直显示区地址
  46. LCD_WR_REG(0x0202); //准备写数据显示区
  47.  
  48. Size=X*Y; //字符串或字符占用的像素尺寸
  49. while(i<Size){
  50. temp=*chr++; //一个字节代表8个像素,因此加1代表索引到下8个像素
  51. for(num=0; num<8; num++){ //数组的每一个字节代表了8个像素
  52. if((temp&0x80)>0){ //对字节的各位进行推断。为1的用带入參数的16位颜色值标示。写入到像素位置。
  53.  
  54. LCD_WR_Data(Color);
  55. }
  56. else{
  57. LCD_WR_CMD(0x0200, StartY+y); //水平显示区地址
  58. LCD_WR_CMD(0x0201, 399-(StartX+x)); //垂直显示区地址
  59. LCD_WR_REG(0x0202); //准备读数据显示区
  60. R_dis_mem=LCD_RD_data(); //读取背景色。为叠加产生透明效果作准备
  61. LCD_WR_Data(R_dis_mem); //对字节的各位进行推断,为0的用当前背景像素16位颜色值标示。
  62. }
  63. temp=temp<<1; //字节各位的移出
  64. x++;
  65. if(x>=X){x=0; y++;} //计算像素递增为当前的x和y,为当前像素读背景颜色做准备
  66. i++;
  67. }
  68. }
  69. }
  70. }

程序没难么难理解的地方。慢慢看也就能懂了. 仅仅是感觉奋斗给的样例不够模块化,搞得一个函数要写这么行,事实上是能够分成几部分功能函数来实现的...

当然奋斗这个样例中的字符数组是直接用取模工具取得的,这种做是能够显示汉字,而经常使用的字符、数字、符号有个ASCII字符表,这里就截一部分图给看吧

这表百度一下都有的.

(仅仅是部分图)

大小16x8的

上面两幅图代表了两种表,都差点儿相同,就是大小不一样而已..

这里须要我们注意的是偏移量,上面是偏移量,按我自己的理解是一个字符真正開始的地方距离数组开头的长度,这里是32,为什么是32?

第0~32号及第127号(共34个)是控制字符或通讯专用字符,如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BEL(振铃)等;通讯专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;第33~126号(共94个)是字符,当中第48~57号为0~9十个阿拉伯数字;65~90号为26个大写英文字母。97~122号为26个小写英文字母,其余为一些标点符号、运算符号等

我没去下原始的ASCII表来看,但上面正点原子给的代码里的表应该是把前32个字符去掉了的..

所以正点原子给的代码中就有了num = num - ’ ‘这一行必须的代码,要不然就会出现乱码

  1. void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode)
  2. {
  3. #ifdef USE_HORIZONTAL
  4. #define MAX_CHAR_POSX 312
  5. #define MAX_CHAR_POSY 232
  6. #else
  7. #define MAX_CHAR_POSX 232
  8. #define MAX_CHAR_POSY 312
  9. #endif
  10. u8 temp;
  11. u8 pos,t;
  12. u16 x0=x;
  13. u16 colortemp=POINT_COLOR;
  14. if(x>MAX_CHAR_POSX||y>MAX_CHAR_POSY)return;
  15. //设置窗体
  16. num=num-' ';//得到偏移后的值
  17. if(!mode) //非叠加方式
  18. {
  19. for(pos=0;pos<size;pos++)
  20. {
  21. if(size==12)temp=asc2_1206[num][pos];//调用1206字体
  22. else temp=asc2_1608[num][pos]; //调用1608字体
  23. for(t=0;t<size/2;t++)
  24. {
  25. if(temp&0x01)POINT_COLOR=colortemp;
  26. else POINT_COLOR=BACK_COLOR;
  27. LCD_DrawPoint(x,y);
  28. temp>>=1;
  29. x++;
  30. }
  31. x=x0;
  32. y++;
  33. }
  34. }else//叠加方式
  35. {
  36. for(pos=0;pos<size;pos++)
  37. {
  38. if(size==12)temp=asc2_1206[num][pos];//调用1206字体
  39. else temp=asc2_1608[num][pos]; //调用1608字体
  40. for(t=0;t<size/2;t++)
  41. {
  42. if(temp&0x01)LCD_DrawPoint(x+t,y+pos);//画一个点
  43. temp>>=1;
  44. }
  45. }
  46. }
  47. POINT_COLOR=colortemp;
  48. }

測试:LCD_ShowString(30,50,"Mini STM32 ^_^");

好了~ LCD篇差点儿相同也要学完了, 就剩下FSMC的一些问题了.

STM32学习之路-LCD(4)&lt;显示字符&gt;的更多相关文章

  1. STM32学习之路-LCD(3)&lt;显示图片&gt;

    祝大家端午和六一快乐!原本今天是想歇息歇息的,可是实在无奈没什么事干.所以就来学习学习LCD显示图片的函数 函数是照搬奋斗的样例,算是些笔记吧.只是奋斗的样例凝视的不是非常具体.今天去看了正点原子的论 ...

  2. STM32学习之路-LCD(2)

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u011791262/article/details/27711881 这些天一直在研究LCD的初始化 ...

  3. STM32学习之路入门篇之指令集及cortex——m3的存储系统

    STM32学习之路入门篇之指令集及cortex——m3的存储系统 一.汇编语言基础 一).汇编语言:基本语法 1.汇编指令最典型的书写模式: 标号 操作码        操作数1, 操作数2,... ...

  4. (stm32学习总结)—LCD—液晶显示

    显示器简介 显示器属于计算机的 I/O 设备,即输入输出设备.它是一种将特定电子信息输出到屏幕上再反射到人眼的显示工具.常见的有 CRT 显示器.液晶显示器.LED 点阵显示器及OLED 显示器 本章 ...

  5. STM32学习之路之入门篇

    2006年ARM公司推出了基于ARMV7架构的cortex系列的标准体系结构,以满足各种技术得不同性能要求,包含了A,R,M三个分工明确的系列 其中A系列面向复杂的尖端应用程序,用于运行开放式的复杂操 ...

  6. STM32学习之路-感觉自己走到了一个天大的坑里了!

    先前兴致勃勃的来弄16位并口驱动LCD.本以为就须要改下LCD IC的初始化即可了,没想到弄了这么多天最终发现自己走进了一个深坑了 T T 原因是我的开发板是奋斗V5的, 它确实有MCU外扩IO口, ...

  7. STM32学习之路-SysTick的应用(时间延迟)

    开发板:奋斗V5 好~ 菜B要来搞实验了.. 前面已经说了SysTick的工作原理什么的了,这里就不说了.. 先来做第一个实验: 盗自奋斗的样例,嘿嘿, 用SysTick产生1ms的基准时间,产生中断 ...

  8. STM32学习之路之MDK安装篇

  9. Qt 学习之路 2(57):可视化显示数据库数据

    Qt 学习之路 2(57):可视化显示数据库数据(skip) 豆子 2013年6月26日 Qt 学习之路 2 26条评论 前面我们用了两个章节介绍了 Qt 提供的两种操作数据库的方法.显然,使用QSq ...

随机推荐

  1. 删除项目中的版本控制(SVN)

    使用svn进行版本控制,每个文件夹下都有.svn文件夹,有些项目在脱离svn版本控制之后,想删除项目中所有的.svn文件夹,可用下面的方法进行快速删除: 建立一个文本文件,取名为kill-svn-fo ...

  2. sqlserver导入数据到mysql的详细图解

    SQL Server 迁移数据到MySQL 一.背景 由于项目开始时候使用的数据库是SQL Server,后来把存储的数据库调整为MySQL,所以需要把SQL Server的数据转移到MySQL:由于 ...

  3. python 关于文件操作的一些理解

    在用python进行数据处理编程中,往往涉及到文件IO口读写,IO口的读写性能会极大的影响程序的运行时间.在进行文件写入时,一般会存在两种情况.第一种是数据到来马上进行数据写入,即来一条写一条,第二种 ...

  4. 安装DotnetCore-Vue项目模板

    dotnet new --install Microsoft.AspNetCore.SpaTemplates::*

  5. C - Anton and Danik

    Problem description Anton likes to play chess, and so does his friend Danik. Once they have played n ...

  6. Elasticsearch之更新(全部更新和局部更新)

    前面的基础, Elasticsearch之curl创建索引库 Elasticsearch之curl创建索引 Elasticsearch之curl创建索引库和索引时注意事项 Elasticsearch之 ...

  7. MessageDigest 加密和解密2

    package com.drawthink.platform.util; import java.security.MessageDigest; import java.security.NoSuch ...

  8. node函数buf.readDoubleBE详解

    offset {Number} 0 noAssert {Boolean} 默认:false 返回:{Number} 从该 Buffer 指定的带有特定尾数格式(readDoubleBE() 返回一个较 ...

  9. 【Oracle】redo与undo

    一 .redo(重做信息) 是Oracle在线(或归档)重做日志文件中记录的信息,万一出现失败时可以利用这些数据来“重放”(或重做)事务.Oracle中记录这些信息的文件叫做redo log file ...

  10. Caffe2:使用Caffe构建LSTM网络

    前言: 一般所称的LSTM网络全叫全了应该是使用LSTM单元的RNN网络. 原文:(Caffe)LSTM层分析 入门篇:理解LSTM网络 LSTM的官方简介: http://deeplearning. ...