C51汇编典型代码&一些org-mode技巧

文档存放

具体内容可见存放的数据。

下面主要介绍关键代码。

ASM 部分

 1;; LCD数据发送=============================================================
 2OUT_DATA:
 3    PUSH    01H
 4    PUSH    02H
 5    PUSH    03H
 6    MOV     R2, #32             ;32行,(双屏结构中上半屏)
 7    MOV     R3, #80H            ;Y地址寄存器
 8LCD_ADDR_UP:
 9    MOV     SONG, R3            ;设置绘图区的Y地址坐标
10    INC     R3                  ;Y地址加1
11    LCALL   SEND_ML
12    MOV     SONG, #80H          ;设置绘图区的X地址坐标
13    LCALL   SEND_ML
14    MOV     R1, #16              ;16*8列
15LCD_DISP_UP:
16    CLR     A
17    MOVC    A, @A+DPTR
18    MOV     SONG, A
19    LCALL   SEND_SJ
20    INC     DPTR
21    DJNZ    R1, LCD_DISP_UP
22    DJNZ    R2, LCD_ADDR_UP      ;写满全屏的16*8字节X64
23    MOV     R2, #32             ;32行,(双屏结构的下半屏)
24    MOV     R3, #80H            ;Y地址寄存器
25LCD_ADDR_DOWN:
26    MOV     SONG, R3            ;设置绘图区的Y地址坐标
27    INC     R3                  ;Y地址加1
28    LCALL   SEND_ML
29    MOV     SONG, #88H          ;设置绘图区的X地址坐标
30    LCALL   SEND_ML
31    MOV     R1, #16             ;16*8列
32LCD_DISP_DOWN:
33    CLR A
34    MOVC    A, @A+DPTR
35    MOV     SONG, A
36    LCALL   SEND_SJ
37    INC     DPTR
38    DJNZ    R1, LCD_DISP_DOWN
39    DJNZ    R2, LCD_ADDR_DOWN        ;写满全屏的16*8字节X64
40    POP     03H
41    POP     02H
42    POP     01H
43    RET

这部分介绍了如何在 LCD12864 上进行绘图操作。

值得纪念的是,这部分代码是我自己摸索,对比着网上找来的资料,不断地调整,最后终于搞定的。

开心的是,分享给了其他人,表现顽强

LCD12864 GDRAM存储结构

目前还没学会如何在 org-mode 中直接插入网络图片,并且可以直接显示。。

python 部分

 1import binascii
 2import serial
 3from time import sleep
 4import matplotlib.pyplot as plt
 5import matplotlib.animation as animation
 6
 7
 8#初始数据绘图
 9def update(frame):
10    #读入模拟
11    read_string = binascii.hexlify(ser.read()).decode('ascii')
12    a = (int(read_string[0], 16) * 16 + int(read_string[1], 16))
13    print(a)
14    sleep(0.1)
15    #绘图数据生成
16    del(data_read[0])
17    data_read.append(a)
18    #绘图
19    line.set_ydata(data_read)
20    #颜色设置
21    if abs(a) >= 40:
22        plt.setp(line, 'color', 'r', 'linewidth', 2.0)
23    else:
24        plt.setp(line, 'color', 'b', 'linewidth', 2.0)
25    return line
26
27if __name__ == '__main__':
28    data_read = list(range(100))
29    fig, ax = plt.subplots()
30    line, = ax.plot(data_read)
31    ax.set_ylim(0, 100)
32    plt.grid(True)
33    ax.set_ylabel("Temperature: ℃")
34    ax.set_xlabel("Relative Time: s")
35
36    ser = serial.Serial(port='COM3', baudrate=1200)
37    ani = animation.FuncAnimation(fig, update, frames=None, interval=100)
38    plt.show()
39ser.close()

这段代码中使用了 matplotlib.animation 这个特殊的子模块,用来绘制动态图。

最开始用的是 Tkinter 来配合 matplotlib 显示串口数据的状态,但是不适合大量数据连续的绘制。会出现卡死的状态。

直到最后,还是放弃了自定义界面的想法,干脆只是单纯的做图,于是有了这个版本。

但是还是要记录下之前的努力,下面的是原来的基于 Tkinter 和 matplotlib 的代码。

  1#  coding:utf-8
  2"""
  3实现读取端口数据实现绘图
  42018年5月30日23:39:32
  5"""
  6import binascii
  7import time
  8from tkinter import *
  9
 10import matplotlib
 11import serial
 12from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
 13from matplotlib.backend_bases import key_press_handler
 14from matplotlib.figure import Figure
 15
 16
 17def drawPic():
 18    """
 19    获取GUI界面设置的参数,利用该参数绘制图片
 20    """
 21    # 清空图像,以使得前后两次绘制的图像不会重叠
 22    screen_draw.clf()
 23    add_plot = screen_draw.add_subplot(111)
 24    add_plot.axis([0, 100, 00, 100])
 25
 26    x = list(range(100))
 27    y = data_read
 28    add_plot.plot(x, y, 'r', label='Temperature')
 29    add_plot.set_title('DRAW')
 30    canvas_draw.draw()
 31
 32
 33def serial_data():
 34    """处理串口数据"""
 35    # 打开端口
 36    try:
 37        port = input_port.get()
 38        baudrate = int(input_baudrate.get())
 39    except:
 40        port = 'COM3'
 41        baudrate = 9600
 42        input_port.delete(0)
 43        input_baudrate.delete(0)
 44        input_port.insert(0, 'COM3')
 45        input_baudrate.insert(0, '9600')
 46
 47    ser = serial.Serial(port, baudrate)
 48    list_index = list(range(50))
 49    data_read[0: 50] = data_read[50: 100]
 50    for x in list_index:
 51        read_string = binascii.hexlify(ser.read()).decode('ascii')
 52        data_read[x + 50] = int(read_string[0], 16) * \
 53            16 + int(read_string[1], 16)
 54        print(data_read[x])
 55    print("Over")
 56    ser.close()
 57
 58
 59def now_draw():
 60    """实时绘制图像"""
 61    try:
 62        port = input_port.get()
 63        baudrate = int(input_baudrate.get())
 64        delay = int(input_delay.get())
 65    except:
 66        port = 'COM3'
 67        baudrate = 9600
 68        delay = 10
 69        input_port.delete(0)
 70        input_baudrate.delete(0)
 71        input_delay.delete(0)
 72        input_port.insert(0, 'COM3')
 73        input_baudrate.insert(0, '9600')
 74        input_delay.insert(0, '10')
 75
 76    list_index_draw = list(range(100))
 77    ser = serial.Serial(port, baudrate)
 78
 79    start = time.clock()
 80
 81    while True:
 82        read_string = binascii.hexlify(ser.read()).decode('ascii')
 83        data_read[99] = int(read_string[0], 16) * 16 + int(read_string[1], 16)
 84        data_read[0: 99] = data_read[1: 100]
 85
 86        drawPic()
 87
 88        # 指定退出死循环方式
 89        if(data_read[99] == 85):    # 温度采集模块关闭后,串口传回来的值就是 55H = 85
 90            break
 91        elif(delay > 0):
 92            if(time.clock() - start >= delay):
 93                break
 94
 95    ser.close()
 96
 97
 98def on_key_event(event):
 99    print('推出程序 %s' % event.key)
100    root.quit()
101    root.destroy()
102
103
104if __name__ == '__main__':
105    matplotlib.use('TkAgg')
106
107    # 用于接受数据的存储
108    data_read = list(range(100))
109    root = Tk()
110
111    # 在Tk的GUI上放置一个画布,并用.grid()来调整布局
112    screen_draw = Figure(figsize=(5, 4), dpi=100)
113    canvas_draw = FigureCanvasTkAgg(screen_draw, master=root)
114    # 绑定任意键退出
115    canvas_draw.mpl_connect('key_press_event', on_key_event)
116
117    canvas_draw.get_tk_widget().grid(row=0, columnspan=3)
118    canvas_draw.draw()
119
120    # 放置标签、文本框和按钮等部件,并设置文本框的默认值和按钮的事件函数
121    Label(root, text='请输入监测时长(s),0则无限,关闭测温即可停止:').grid(row=1, column=0)
122    input_delay = Entry(root)
123    input_delay.grid(row=1, column=1)
124    input_delay.insert(0, '50')
125
126    Label(root, text='请输入端口号:').grid(row=2, column=0)
127    input_port = Entry(root)
128    input_port.grid(row=2, column=1)
129    input_port.insert(0, 'COM3')
130
131    Label(root, text='请输入波特率:').grid(row=3, column=0)
132    input_baudrate = Entry(root)
133    input_baudrate.grid(row=3, column=1)
134    input_baudrate.insert(0, '9600')
135
136    Button(
137        root, text='实时监控', command=now_draw).grid(
138            row=1, column=2, columnspan=1)
139    Button(
140        root, text='开始画图', command=drawPic).grid(
141            row=2, column=2, columnspan=1)
142    Button(
143        root, text='打开端口', command=serial_data).grid(
144            row=3, column=2, columnspan=1)
145
146    # 启动事件循环
147    root.mainloop()

这里倒是学习了下 Tkinter 的相关操作,还是不错的。自定义的能力更强。不过很可惜。

并不是很适合处理动态数据显示。

ORG-MODE 部分

org-mode-babel

 1简单模板对应快捷输入的首字母
 2
 3输入 < 后面跟一个字母,然后按 TAB 键,就可以生成对应的模板。(eg: <e + TAB )
 4
 5s    #+BEGIN_SRC ... #+END_SRC
 6e    #+BEGIN_EXAMPLE ... #+END_EXAMPLE
 7q    #+BEGIN_QUOTE ... #+END_QUOTE
 8v    #+BEGIN_VERSE ... #+END_VERSE
 9c    #+BEGIN_CENTER ... #+END_CENTER
10l    #+BEGIN_LaTeX ... #+END_LaTeX
11L    #+LaTeX:
12h    #+BEGIN_HTML ... #+END_HTML
13H    #+HTML:
14a    #+BEGIN_ASCII ... #+END_ASCII
15A    #+ASCII:
16i    #+INDEX: line
17I    #+INCLUDE: line
18#+END_EXAMPLE
19
20#+BEGIN_EXAMPLE
21(7) 文档元数据
22
23#+TITLE:       the title to be shown (default is the buffer name)
24#+AUTHOR:      the author (default taken from user-full-name)
25#+DATE:        a date, an Org timestamp1, or a format string for format-time-string
26#+EMAIL:       his/her email address (default from user-mail-address)
27#+DESCRIPTION: the page description, e.g. for the XHTML meta tag
28#+KEYWORDS:    the page keywords, e.g. for the XHTML meta tag
29#+LANGUAGE:    language for HTML, e.g. ‘en’ (org-export-default-language)
30#+TEXT:        Some descriptive text to be inserted at the beginning.
31#+TEXT:        Several lines may be given.
32#+OPTIONS:     H:2 num:t toc:t \n:nil @:t ::t |:t ^:t f:t TeX:t ...
33#+BIND:        lisp-var lisp-val, e.g.: org-export-latex-low-levels itemize
34               You need to confirm using these, or configure org-export-allow-BIND
35#+LINK_UP:     the ``up'' link of an exported page
36#+LINK_HOME:   the ``home'' link of an exported page
37#+LATEX_HEADER: extra line(s) for the LaTeX header, like \usepackage{xyz}
38#+EXPORT_SELECT_TAGS:   Tags that select a tree for export
39#+EXPORT_EXCLUDE_TAGS:  Tags that exclude a tree from export
40#+XSLT:        the XSLT stylesheet used by DocBook exporter to generate FO file
41
42其中#+OPTIONS是复合的选项,包括:
43
44H:         set the number of headline levels for export
45num:       turn on/off section-numbers
46toc:       turn on/off table of contents, or set level limit (integer)
47\n:        turn on/off line-break-preservation (DOES NOT WORK)
48@:         turn on/off quoted HTML tags
49::         turn on/off fixed-width sections
50|:         turn on/off tables
51^:         turn on/off TeX-like syntax for sub- and superscripts.  If
52           you write "^:{}", a_{b} will be interpreted, but
53           the simple a_b will be left as it is.
54-:         turn on/off conversion of special strings.
55f:         turn on/off footnotes like this[1].
56todo:      turn on/off inclusion of TODO keywords into exported text
57tasks:     turn on/off inclusion of tasks (TODO items), can be nil to remove
58           all tasks, todo to remove DONE tasks, or list of kwds to keep
59pri:       turn on/off priority cookies
60tags:      turn on/off inclusion of tags, may also be not-in-toc
61<:         turn on/off inclusion of any time/date stamps like DEADLINES
62*:         turn on/off emphasized text (bold, italic, underlined)
63TeX:       turn on/off simple TeX macros in plain text
64LaTeX:     configure export of LaTeX fragments.  Default auto
65skip:      turn on/off skipping the text before the first heading
66author:    turn on/off inclusion of author name/email into exported file
67email:     turn on/off inclusion of author email into exported file
68creator:   turn on/off inclusion of creator info into exported file
69timestamp: turn on/off inclusion creation time into exported file
70d:         turn on/off inclusion of drawers

C51汇编典型代码&一些org-mode技巧的更多相关文章

  1. R语言︱情感分析—词典型代码实践(最基础)(一)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:词典型情感分析对词典要求极高,词典中 ...

  2. Java 性能优化手册 — 提高 Java 代码性能的各种技巧

    转载: Java 性能优化手册 - 提高 Java 代码性能的各种技巧 Java 6,7,8 中的 String.intern - 字符串池 这篇文章将要讨论 Java 6 中是如何实现 String ...

  3. 改进你的c#代码的5个技巧(三)

    本文完全独立于前两篇文章.如果你喜欢它们,我希望你也会喜欢这个.在上一篇文章中,我展示了哪种方法更快,并比较了代码的执行速度.在本文中,我将展示不同代码片段的内存消耗情况.为了显示内存映射和分配图,我 ...

  4. angular源码分析:angular中各种常用函数,比较省代码的各种小技巧

    angular的工具函数 在angular的API文档中,在最前面就是讲的就是angular的工具函数,下面列出来 angular.bind //用户将函数和对象绑定在一起,返回一个新的函数 angu ...

  5. PHP代码20个实用技巧(转)

    这些技巧特别是封装的,相对路径的还是挺好的,本身来自微信公众号,但是我担心以后删除,所以在我的博客上备份一下(微信公众号为:菜鸟教程) 在这篇文章中我们将看看一些关于PHP开发有用的提示和技巧,可以用 ...

  6. C51汇编伪指令

    1.DS ---预留存储区命令格式: [标号:] DS   表达式值其功能是从指定地址开始,定义一个存储区,以备源程序使用.存储区预留的存储单元数由表达式的值决定. ;从标号TEP地址处开始保留1个存 ...

  7. keil or c51 汇编调用c语言函数 容易忽视的问题

    最近,在用keil 写一个小程序时,想实践一下从汇编调用 C语言函数,我们都知道C语言调用汇编函数讨论得较多,但反过来,从汇编中调用C语言的函数未见深入分析:在开始的时候,还是忽视了一个问题,就是对现 ...

  8. php代码20个实用技巧 ------ 转发自菜鸟教程

    1.不要实用相对路径 常常会看到: require_once('../../lib/some_class.php'); 该方法有很多缺点:它首先查找指定的php包含路径,然后查找当前目录,因此会检查过 ...

  9. R语言︱词典型情感分析文本操作技巧汇总(打标签、词典与数据匹配等)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:情感分析中对文本处理的数据的小技巧要 ...

随机推荐

  1. Cache-control使用Cache-control:private学习笔记【转载】

    网页缓存由 HTTP消息头中的Cache-control控制,常见取值有private.no-cache.max-age.must- revalidate等,默认为private 其作用根据不同的重新 ...

  2. C#创建windows服务并发布

    创建window 服务 新建一个window 服务项目MyService,如下图 切换到代码视图修改. using System; using System.Collections.Generic; ...

  3. 转载:深入浅出Zookeeper(一) Zookeeper架构及FastLeaderElection机制

    转载至 http://www.jasongj.com/zookeeper/fastleaderelection/: 原创文章,转载请务必将下面这段话置于文章开头处.本文转发自技术世界,原文链接 htt ...

  4. Mac安装Python3后,如何将默认执行的Python2改为Pyhton3

    Mac 笔记本电脑系统自带的Python版本一般是Python 2.7,如果安装了Python 3.x,在终端中输入python命令后,输出的信息还是Python 2.7,问题就是如何将Mac系统默认 ...

  5. Zabbix11.3 Zabbix SNMP 常用OID列表

    点击获取CISCO设备OID 系统参数(1.3.6.1.2.1.1) OID 描述 备注 请求方式 .1.3.6.1.2.1.1.1.0 获取系统基本信息 SysDesc GET .1.3.6.1.2 ...

  6. Python科学计算结果的存储与读取

    Python科学计算结果的存储与读取 总结于2019年3月17日  荆楚理工学院 计算机工程学院 一.前言 显然,作为一名工科僧,执行科学计算,需用Python.PS:快忘记Matlab吧.我用了二十 ...

  7. spring配置文件注入到静态变量

    spring配置注入到静态文件代码如下: package com.test.oss; import org.springframework.beans.factory.annotation.Value ...

  8. 第五篇、Python之迭代器与生成器

    1.迭代和递归等概念 循环(loop):指的是在满足条件的情况下,重复执行同一段代码.比如,while语句,for循环. 迭代(iterate):指的是按照某种顺序逐个访问列表中的每一项.比如,for ...

  9. Ajax需要带头信息跨域问题的解决

    $.ajax({ type:"get", url:"http://localhost:8082/index/getMsg", dataType:'json', ...

  10. 发布python包

    写python程序时常常要导入各种包,使用其中的模块或功能.我们如果有可以复用的功能或模块也可以发布成包,并安装在自己或他人电脑上,以供自己或别人使用.python发布包的步骤如下: 一.首先为模块创 ...