• 嵌入式MCU里也能实现类安卓高级UI开发

    AAGUI介绍 AAGUI是一个不依赖特定硬件、操作系统的跨平台通用型GUI。 链接:https://gitee.com/QQ1159465634/aagui 使用MIT开源许可协议 AAGUI采用C(兼容C89)与C++(兼容C++98)编写,兼容位置无关。面向对象、半声明式、等特性使得AAGUI的应用开发效率、可维护性都十分优秀! 优雅的页面管理机制使得AAGUI也能拥有开发出大型系统级多页面UI应用的能力! UI核心来源于对安卓的精简移植,以及超低的内存占用,终于在嵌入式MCU里也能实现类安卓的高级UI开发! 软件架构 文件夹 是否开源 AAGUI_app 应用层 ✅ AAGUI_core 核心层 ❎ libAAGUI 已编译的核心层静态库 ❇ 移植教程 ⑴ 将AAGUI相关代码、静态库全部加入到项目中。加上头文件路径。自定义一个预处理符号方便标记当前目标平台。 ⑵ AABase.c中实现相关抽象移植接口,如aa_malloc()...。 ⑶ 定义主GUI并配置其显示设备信息,对接框架接口。 详情请参阅 AAGUI文档.chm 及已移植好的项目文件。 更多说明 内存空间推荐:flash >= 256KB,RAM >= 32KB(6K栈+26K堆)。 框架重要优势:完整应用框架、多GUI实例(多屏)、json半声明式高级UI、完整中文输入法、支持Alpha、支持剪辑区。 帧缓冲区格式:原生支持0bit自控、1bit单色、8bit灰度、16、24、32bit彩色,支持动态修改。 部分帧缓冲区:支持PFB部分帧缓存,最低只需1行缓存。比如240x320分辨率,最低只需要240的内存。 复用支持简要:页面(面板)复用、UI布局复用、UI控件复用、自定义高级UI组件。 高级布局简要:帧布局、线性布局、绝对布局、垂直&水平滚动容器、文本、文本编辑、按钮、进度条。 字体支持简要:自由管理字体、支持绘制带边框文字、文本缩放绘制。 底层图形绘制:点、线、矩形、圆、圆角矩形、椭圆矩形、渐变矩形、多边形、圆弧(可实现扇形)。 底层图片绘制:1、8、16、24、32bit位图、qoi格式图片。位图支持缩放、旋转。 更多图片  

    11-22 91浏览
  • c 语言 char 类型变量的取值范围要注意的

    情况是这样的,我之前在开发一个物联网产品的时候,这款产品里面有涉及到温度数据的采集,需要把环境温度上报到服务器,然后同步到其他终端进行显示。  然后我心里面想,通常环境温度一般在负几十度到正几十度的区间,采用 char 类型的变量,其取值范围在 -127 ~ 127,一般都是足够的。 (原谅我的不严谨,对于整型值,一般建议用 int,为了省字节空间,所以用了char 类型) 于是,我通常会写出类似以下的代码: int update_temperature(void){ char temp_value = 0; temp_value = get_temperature_value(); //获取温度值 update_to_cloud(temp_value); //上传到云端} 上述代码,采集完温度之后用char类型的变量保存起来,然后上传到云端服务器里面。 在进行低温环境(-10℃)测试的时候,我发现了一种非常奇怪的现象,其他终端里面显示的温度值,居然是246摄氏度,好家伙,直接就收到了温度过高的告警信息。 百思不得其解,我明明用 char 类型的变量去定义一个温度值,并且也没有超过无符号数的取值范围,按理来说应该是正确的才对。 而且这现象有一个规律,当温度是-10时,显示246,当温度是-20时,显示236,这些现象的绝对值相加,等于256。 我突然意识到,关于 char 类型变量的取值范围,应该有一些知识点是我还没有了解清楚的。~ 网上一搜 “c 语言 char 类型变量的取值范围”,果然,答案马上就出来了。 对于 char 类型定义的变量是有符号数还是无符号数,其实是由编译器和平台来指定的,也就是说,当我们直接用 char 来定义变量的时候,它有可能是一个无符号数。 就是因为我当时用的编译器和平台,把 char 类型的变量指定为无符号类型了,当我对一个无符号类型的变量赋予一个负数值的时候,问题就出现了。 看了一下 MDK 编译器里面的选项,可以强制指定 char 类型的变量为有符号类型,对于 GCC编译器,可以使用 -fsigned-char 选项。 但是,为了代码有比较好的可移植性,一般建议我们对字符变量进行显式定义, 比如:有符号使用 signed char 进行定义,无符号使用 unsigned char 进行定义。 而对于其他数据类型,比如 int , short , long , float , double 等等,则不存在类似于 char 之类的情况,这些数据类型的符号位通常都是确定好的。 基础不牢,又浪费了一个下午。 

    11-22 72浏览
  • 简析嵌入式设备通信协议特点

    为嵌入式设备而设计的通信协议

    09-24 530浏览
  • C语言递归调用

    1.汉诺塔:请输入盘子数,输出盘子移动的操作步骤。 #include void move(char from, char to) { printf("%c to %c\n", from, to); } void hanoi(int n, char a, char b, char c) { if (n == 1) move(a, c); else { hanoi(n - 1, a, c, b); move(a, c); hanoi(n - 1, b, a, c); } } void main() { int n; scanf("%d", &n); hanoi(n, 'A', 'B', 'C'); } 2.爬楼梯:树老师爬楼梯,他可以每次走1级或者2级,输入楼梯的级数,求不同的走法数。 #include int stair(int n) { if (n == 1) return 1; if (n == 2) return 2; return stair(n - 1) + stair(n - 2); } void main() { int n; scanf("%d", &n); printf("%d", stair(n)); } 3.爬楼梯:树老师爬楼梯,他可以每次走1级、2级或者3级,输入楼梯的级数,求不同的走法数。 #include int stair(int n) { if (n == 1) return 1; if (n == 2) return 2; if (n == 3) return 4; return stair(n - 1) + stair(n - 2) + stair(n - 3); } void main() { int n; scanf("%d", &n); printf("%d", stair(n)); } 4.斐波那契数列:请输入项数,输出具体数列。 #include int fibonacci(int n) { if (n == 1 || n == 2) return 1; return fibonacci(n - 1) + fibonacci(n - 2); } void main() { int n, i; scanf("%d", &n); for (i = 1; i <= n; i++) printf("%d,", fibonacci(i)); } 5.求阶乘:请输入整数n,求1!+2!+3!+4!+5!+6!+7!+…+n!的和。 #include int factorial(int n) { if (n == 1) return 1; return n * factorial(n - 1); } void main() { int n, i, sum = 0; scanf("%d", &n); for (i = 1; i <= n; i++) sum += factorial(i); printf("sum=%d", sum); } 6.取球问题:在n个球中,任意取m个(不放回),求有多少种不同取法。 #include int ball(int n, int m) { if (n < m) return 0; if (n == m) return 1; if (m == 0) return 1; return ball(n - 1, m - 1) + ball(n - 1, m); } void main() { int n, m; scanf("%d%d", &n, &m); printf("%d", ball(n, m)); } 7.杨辉三角:输入要打印的层数,打印杨辉三角。 #include int triangle(int m, int n) { if (m == 0 || n == 0 || m == n) return 1; return triangle(m - 1, n) + triangle(m - 1, n - 1); } void main() { int n, i, j; scanf("%d", &n); for (i = 0; i < n; i++) { for (j = 0; j <= i; j++) { printf("%d ", triangle(i, j)); } printf("\n"); } } 8.求年龄:有5个人坐在一起,问第5个人多少岁,他说比第4个人大2岁。问第4个人多少岁,他说比第3个人大2岁。问第3个人多少岁,他说比第2个人大2岁。问第2个人多少岁,他说比第1个人大2岁。最后问第1个人,他说是10岁。请问第5个人多大? #include int age(int n) { if (n == 1) return 10; return age(n - 1) + 2; } void main() { printf("%d", age(5)); } 9.猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半多一个。到第十天早上想再吃时,见只剩下一个桃子了。问最初有多少个桃子。 递归: #include int peach(int n) { if (n == 10) return 1; return (peach(n + 1) + 1) * 2; } void main() { printf("%d", peach(1)); } 循环: #include void main() { int i, s = 1; for (i = 9; i >= 1; i--) { s = (s + 1) * 2; } printf("%d", s); } 10.猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半多一个。第十天同样是吃了前一天的一半加一个,最后剩下一个桃子。问最初有多少个桃子。 递归: #include int peach(int n) { if (n == 11) return 1; return (peach(n + 1) + 1) * 2; } void main() { printf("%d", peach(1)); } 循环: #include void main() { int i, s = 1; for (i = 10; i >= 1; i--) { s = (s + 1) * 2; } printf("%d", s); } 11.最大公约数:利用递归算法求两个数的最大公约数。 #include /* 最大公约数 */ int gcd(int a, int b) { int t; if (a < b) { t = a; a = b; b = t; } if (b == 0) { return a; } return gcd(b, a % b); } void main() { int a, b; scanf("%d%d", &a, &b); printf("gcd=%d", gcd(a, b)); } 12.逆序输出:输入一个正整数,将该正整数逆序输出。 #include void printDigit(int n) { printf("%d", n % 10); if (n > 10) { printDigit(n / 10); } } void main() { int n; scanf("%d", &n); printDigit(n); } 13.逆序输出:输入一个字符串,将该字符串逆序输出。 #include void printStr(char *str) { if (*str != '\0') printStr(str + 1); if (*str != '\0') printf("%c", *str); } void main() { char str[100]; gets(str); printStr(str); } 文章来源于网络,版权归原作者所有,如有侵权,请联系删除。

    09-13 473浏览
  • 数字滤波器在实际工程中的应用有哪些?

    数字滤波器可以分为两大部分:即经典滤波器和现代滤波器。经典滤波器就是假定输入信号x(n)中的有用成分和希望滤除成分分别位于不同的频带,因而我们通过一个线性系统就可以对噪声进行滤除,如果噪声和信号的频谱相...

    09-12 486浏览
  • 钽电解电容器在未来的发展方向是什么?

    继电器有很多具体的类型,比如干簧继电器、电磁继电器、计数继电器等等。为增进大家对继电器的认识,本文将对计数继电器、计数继电器的替代方法予以介绍。如果你对继电器或者对计数继电器具有兴趣,不妨和小编一起...

    09-12 461浏览
  • MCU芯片在智能设备中的应用

    芯片对于各个企业、各个国家的发展来说,都是非常重要的一环。目前,各个国家都在积极地发展芯片行业。为增进大家对芯片的认识,本文将对MCU芯片、MCU芯片技术原理以及MCU芯片的应用予以介绍。如果你对芯片具有兴趣...

    09-12 449浏览
  • 常用的嵌入式软件轻量级校验算法

    UART有一个奇偶校验,CAN通信有CRC校验。Modbus、MAVlink、USB等通信协议也有校验信息。 在自定义数据存储时,有经验的工程师都会添加一定校验信息。 你平时通信,或者数据存储时,你有用到校验信息吗?下面就介绍几种常见的校验算法。 1、校验和 校验和是最基本,也是嵌入式软件工程师最常用的一种校验算法,其实现方法很简单,简单到只有几行代码。 实现的方式方法很多,不同的编程语言,不同的应用有所不同,下面以C语言8位校验和为例: uint8_t CheckSum(uint8_t *Buf, uint8_t Len){ uint8_t i = 0; uint8_t sum = 0; uint8_t checksum = 0; for(i=0; i

    09-12 396浏览
  • 总结51单片机的汇编指令

    你会这些方法吗?

    09-06 324浏览
  • 轮式移动机器人控制系统的硬件设计要点

    1 引言 轮式移动机器人是机器人研究领域的一项重要内容,它集机械、电子、检测技术与智能控制于一体,是一个典型的智能控制系统。智能机器人比赛集高科技、娱乐、竞技于一体,已成为国际上广泛开展的高技术对抗活动...

    09-04 218浏览
正在努力加载更多...
广告