文章目录

  • 学前小故事
  • 一、Hello Digispark
    • 1.硬件介绍
    • 2.实现原理
    • 3.配置环境
    • 4.第一个USB开发板程序
  • 二、结构介绍以及C语言美化
    • 1.#difine定义常量
    • 2.函数封装调用
  • 三、强化学习
    • 1.源码阅读
    • 2.源码总结
  • 四、效果展示
  • C语言其实很厉害
  • 认真学C的你真的很帅/美

学前小故事

大一上学期,学校完成了半本《C++黑皮书》的教学。我学会了打HelloWorld!!!

#include <stdio.h>
int main() { printf("Hello World!\n"); return 0;}

寒假,乘着对计算机的热情,我在家花了三天的时间,啃完了后半册《类和对象》。我学会了!!!
用结构体打HelloWorld…

#include <stdio.h>
struct { char *str = "Hello World!"; } test;
int main() { printf(test.str); return 0;}

这个黑不拉几的命令行是用来解小学奥数题的吗?这和炫酷好像差了亿点点啊?

后来,我就去学HTML画网页去了…
我在一堂讲座上听到了BadUSB。由于Bad这一单词太帅。
出于对计算机的强烈热爱。我在淘宝上斥20元巨资,买了两个最便宜的USB开发板。
最终,完成了一次C语言的实际应用,并对次项目的完成过程和出现的问题进行记录和完善。


一、Hello Digispark

1.硬件介绍

硬件:Attiny85 Digispark开发板,某宝10元上下浮动。

2.实现原理

Attiny85 Digispark开发板可以模拟成日常使用的USB键盘进行模拟输入。
利用Win系统,按下WIN+R打开并锁定到CMD的特性,能够用cmd命令行代码做到诸如
在命令行打HELLO WORLD、打开一个网页、关闭电脑等事情。
所有操作只要事先编写好代码,在插入USB后会自动执行。

3.配置环境

软件下载

百度网盘链接(失效请联系我补链):https://pan.baidu.com/s/1_dSDderH-UtY0XozLq3WhQ?pwd=nbut

操作系统:Win7、10、11
驱动安装:DigisparkWindowsDriver
编译器:Arduino

软件安装

(1) 解压DigisparkWindowsDriver,根据操作系统位数双击某个exe,安装相应的安装包。


(2) 解压Arduino,进入目录运行arduino.exe

(3)此步骤已在我的ZIP中封装好,可能可以省略,建议检查一遍。

打开左上方文件->首选项,在附加开发板管理网址中输入
http://digistump.com/package_digistump_index.json

科学上网后,打开工具->开发板->开发板管理,下载相应开发包。

4.第一个USB开发板程序

工具->开发板中选择Digispark(Defult - 16.5mhz)

在页面中输入以下代码。

#include "DigiKeyboard.h"void setup() {//第一步操作,打开cmd命令DigiKeyboard.delay(2000);DigiKeyboard.sendKeyStroke(0);DigiKeyboard.sendKeyStroke(KEY_R, MOD_GUI_LEFT);//按R和win键,打开运行//*****第二步操作,输入代码,多次实验得出的解决方案//***此步骤适配系统为WIN10标准输入法,在中英文下皆可成功输入正确代码//*输入字符请用print,切勿使用println,因为println会在输入完字符后在后面追加回车,括号中内容最好全用大写DigiKeyboard.delay(200);DigiKeyboard.sendKeyPress(MOD_SHIFT_LEFT);//按住shiftDigiKeyboard.print("HELLO");DigiKeyboard.sendKeyPress(0);//松开shiftDigiKeyboard.sendKeyStroke(KEY_SPACE);DigiKeyboard.sendKeyStroke(KEY_SPACE);//按两次空格,确保正确输入并有空行DigiKeyboard.delay(200);DigiKeyboard.sendKeyPress(MOD_SHIFT_LEFT);//按住shiftDigiKeyboard.print("DIGISPART");DigiKeyboard.sendKeyPress(0);//松开shiftDigiKeyboard.sendKeyStroke(KEY_SPACE);DigiKeyboard.sendKeyStroke(KEY_SPACE);//按两次空格,确保正确输入并有空行//第三步操作,按下回车,此次作为测试盘不建议使用(也可以增加等待时间来测试)
//  DigiKeyboard.delay(200);
//  DigiKeyboard.sendKeyStroke(KEY_ENTER);//按回车
}
void loop() {}

代码输入完成后,点击左上方的勾勾,会出现下方信息。

再点击勾勾旁边的箭头,并关闭奇怪的框框,会在下方出现黄色的,请在60s内插入开发板的提示。

立刻插入开发板,就会进行烧录并稍后执行相应命令。在电脑左下角出现下面情况即为完成第一个项目。


二、结构介绍以及C语言美化

相信学过C的都会想到,上面的HELLO WORLD程序虽然在格式上完全正确,但是好像差了点什么?
没错,就是重复代码太多了。要修改起来过于麻烦,下面1,2两步处理后也许会好看很多。

1.#difine定义常量

对于常用的重复变量,我们可以给它改个名字,让它变得好看又方便修改。

  DigiKeyboard.delay(2000);DigiKeyboard.sendKeyStroke(0);DigiKeyboard.sendKeyStroke(KEY_R, MOD_GUI_LEFT);//按R和win键,打开运行DigiKeyboard.delay(200);DigiKeyboard.sendKeyPress(MOD_SHIFT_LEFT);//按住shiftDigiKeyboard.print("HELLO");DigiKeyboard.sendKeyPress(0);//松开shiftDigiKeyboard.sendKeyStroke(KEY_SPACE);DigiKeyboard.sendKeyStroke(KEY_SPACE);//按两次空格,确保正确输入并有空行DigiKeyboard.delay(200);DigiKeyboard.sendKeyPress(MOD_SHIFT_LEFT);//按住shiftDigiKeyboard.print("DIGISPART");DigiKeyboard.sendKeyPress(0);//松开shiftDigiKeyboard.sendKeyStroke(KEY_SPACE);DigiKeyboard.sendKeyStroke(KEY_SPACE);//按两次空格,确保正确输入并有空行

HELLO WORLD代码中,我们不难发现,2000,200这两个变量时常出现,那么就可以用#define重新定义一下。在引用头文件下打上如下两行代码,将2000命名为LONG_TIME,代表长停顿时间,短停顿时间则命名为SHORT_TIME,这里我将SHORT_TIME改为100,代表0.1s。

#include "DigiKeyboard.h"
#define LONG_TIME 2000
#define SHORT_TIME 100

2.函数封装调用

再次观察HELLO WORLD代码,还可以发现,在输入单词阶段,有大量重复代码,那我们就可以创建一个新的函数,将它封装起来。下面是我封装完后的HELLO WORLD代码。

#include "DigiKeyboard.h"
#define LONG_TIME 2000
#define SHORT_TIME 100void run_begin() {DigiKeyboard.delay(LONG_TIME);//开机延迟两秒钟,用于系统识别DigisparkDigiKeyboard.sendKeyStroke(0);//适应老旧系统DigiKeyboard.sendKeyStroke(KEY_R, MOD_GUI_LEFT);//按R和win键,打开运行
}
void str_print(char* str) {DigiKeyboard.delay(SHORT_TIME);//停滞一段时间DigiKeyboard.sendKeyPress(MOD_SHIFT_LEFT);//按住shiftDigiKeyboard.print(str);//*输出字符,内容大写DigiKeyboard.sendKeyPress(0);//松开shiftDigiKeyboard.sendKeyStroke(KEY_SPACE);DigiKeyboard.sendKeyStroke(KEY_SPACE);//按两次空格,确保正确输入并有空行
}
void run_end() {DigiKeyboard.delay(SHORT_TIME);//停滞一段时间DigiKeyboard.sendKeyStroke(KEY_ENTER);//按回车
}void setup() {run_begin();str_print("HELLO");str_print("-WORLD");
//  run_end();
}
void loop() {}

三、强化学习

1.源码阅读

读懂别人写的代码也是团队协作和成神的必要技能点。
已经被官方开发承认的头文件理所应当是阅读的首要材料。
欢迎来到<走进源码>栏目。一起剖析<DigiKeyboard.h>
此文件我复制了一个,放在了example文件夹中。
下面是部分源码:

这部分源码定义了常用键盘按键。
#define MOD_CONTROL_LEFT    (1<<0)
#define MOD_SHIFT_LEFT      (1<<1)
#define MOD_ALT_LEFT        (1<<2)
#define MOD_GUI_LEFT        (1<<3)
#define MOD_CONTROL_RIGHT   (1<<4)
#define MOD_SHIFT_RIGHT     (1<<5)
#define MOD_ALT_RIGHT       (1<<6)
#define MOD_GUI_RIGHT       (1<<7)#define KEY_A       4
#define KEY_B       5
#define KEY_C       6
#define KEY_D       7
#define KEY_E       8
#define KEY_F       9
#define KEY_G       10
#define KEY_H       11
#define KEY_I       12
#define KEY_J       13
#define KEY_K       14
#define KEY_L       15
#define KEY_M       16
#define KEY_N       17
#define KEY_O       18
#define KEY_P       19
#define KEY_Q       20
#define KEY_R       21
#define KEY_S       22
#define KEY_T       23
#define KEY_U       24
#define KEY_V       25
#define KEY_W       26
#define KEY_X       27
#define KEY_Y       28
#define KEY_Z       29
#define KEY_1       30
#define KEY_2       31
#define KEY_3       32
#define KEY_4       33
#define KEY_5       34
#define KEY_6       35
#define KEY_7       36
#define KEY_8       37
#define KEY_9       38
#define KEY_0       39#define KEY_ENTER   40#define KEY_SPACE   44
这部分源码定义了可以调用的函数。
class DigiKeyboardDevice : public Print {public:DigiKeyboardDevice () {cli();usbDeviceDisconnect();_delay_ms(250);usbDeviceConnect();usbInit();sei();// TODO: Remove the next two lines once we fix//       missing first keystroke bug properly.memset(reportBuffer, 0, sizeof(reportBuffer));     usbSetInterrupt(reportBuffer, sizeof(reportBuffer));}void update() {usbPoll();}// delay while updating until we are finished delayingvoid delay(long milli) {unsigned long last = millis();while (milli > 0) {unsigned long now = millis();milli -= now - last;last = now;update();}}//sendKeyStroke: sends a key press AND releasevoid sendKeyStroke(byte keyStroke) {sendKeyStroke(keyStroke, 0);}//sendKeyStroke: sends a key press AND release with modifiersvoid sendKeyStroke(byte keyStroke, byte modifiers) {sendKeyPress(keyStroke, modifiers);// This stops endlessly repeating keystrokes:sendKeyPress(0,0);}//sendKeyPress: sends a key press only - no release//to release the key, send again with keyPress=0void sendKeyPress(byte keyPress) {sendKeyPress(keyPress, 0);}//sendKeyPress: sends a key press only, with modifiers - no release//to release the key, send again with keyPress=0void sendKeyPress(byte keyPress, byte modifiers) {while (!usbInterruptIsReady()) {// Note: We wait until we can send keyPress//       so we know the previous keyPress was//       sent.usbPoll();_delay_ms(5);}memset(reportBuffer, 0, sizeof(reportBuffer));reportBuffer[0] = modifiers;reportBuffer[1] = keyPress;usbSetInterrupt(reportBuffer, sizeof(reportBuffer));}size_t write(uint8_t chr) {uint8_t data = pgm_read_byte_near(ascii_to_scan_code_table + (chr - 8));sendKeyStroke(data & 0b01111111, data >> 7 ? MOD_SHIFT_RIGHT : 0);return 1;}//private: TODO: Make friend?uchar    reportBuffer[2];    // buffer for HID reports [ 1 modifier byte + (len-1) key strokes]using Print::write;
};

2.源码总结

看懂了源码,可以对此进行归纳总结。下面是我的总结


四、效果展示

这是example文件夹中`Shutdown-H`代码的运行效果

Shutdown-H代码运行效果


C语言其实很厉害

C语言从出生开始基本没遇到过什么挑战。
对于C的具体语法。人们实在想不出整数类型除了用按字节数归类为char、short、int、long,还能怎么分类。
结构体好似恰到好处,往struct加什么都像是画蛇添足。
它的指针更为精妙,能完美地和数组配合起来。
基本的malloc和free似乎是内存管理的唯一方式。
函数调用和递归还是用调用栈实现。

虽然它没有现在的Python,Java,C#那么简单易学,但它依旧是游戏内核,硬件领域的龙头语言。
应为他的效率比它们都高!!!

认真学C的你真的很帅/美

黑乎乎的命令行有时真的很让人感到疲倦,但是它有时就像黑夜中的刺客,让人摸不着脑袋,又让人浮想联翩。不管你学C的目的是什么。
做游戏内核?成为算法大牛?做硬件工程师?写驱动程序进行多端适配?当一名坏坏的黑客?
祝你不忘初心,一路成神,这真的很帅,很美…

加油,陌生人。

Digispark USB开发板的应用_写给刚学完C的你相关推荐

  1. Digispark USB开发板把玩笔记(一):认识这块小巧、便宜、多功能的Arduino兼容板

    0x01:前言 Digispark USB Development Board是一块基于ATTiny85微控制器的开发板.2012年底主创团队在kickstar上发起了众筹,并且成功筹集到了30万美元 ...

  2. ​​​​​​​迅为iTOP-2K1000龙芯开发板Loongnix 系统烧写

    loongnix 操是国产操作系统,带有非常友好的人机交互界面,可以运行在 LS2K1000 上,我们就一 起来看下如何给迅为iTOP-2K1000开发板安装 loongnix 国产操作系统. 需要的 ...

  3. 基于cepark usb开发板 VS2010使用libusb-win32开发应用程序

    软件使用环境: MFC程序开发: VS2010 操作系统:WIN7 开发板:cepark usb 1.    编写好下位机程序,这里直接使用圈圈的MyUsbHid,将USB设备连接到电脑: 2.    ...

  4. 安富莱v6开发板网口通讯_【STM32-V6】STM32F429BIT6开发板开源, 丰富软件资源, 强劲硬件配置, 配套600多实例, 17套手册持续更新中2020-12-14...

    STM32-V6 开发板HAL版教程 ********************************************************************************* ...

  5. 安富莱v6开发板网口通讯_安富莱嵌入式周报第170期:2020.07.202020.07.26

    说明: 谢谢大家的关注,继续为大家盘点上周精彩内容. 1.沁恒推出带USB3.0,千兆以太网,光纤接口的RISC内核单片机CH569     CH569/565 微控制器使用 RISC-V3A 内核, ...

  6. 野火的DSP28335开发板吧代码烧写到Flash中

    说明是针对野火的DSP28335开发板里的例程进行实验的,环境是CCS5.5,已经验证.开发板里的例程都是在RAM里运行的,每次开机都是祝你生日快乐的音乐,经过一周的努力终于不用再受音乐的困扰.可以随 ...

  7. 迅为龙芯开发板Loongnix系统烧写-loognix图形化安装

    1 开始安装 Loognix 图形化安装这里需要用到屏幕,如果您购买了我们的触摸屏,使用触摸屏即可(注意,烧写的引导系统是没有触摸的),如果您没有购买触摸屏,可以连接 hdmi 屏幕.屏幕连接好以后, ...

  8. 开发板 时间 同步_近万字试用报告!RISCV开发板GD32VF103

    作者:yinwuqing 来源:EEPW论坛 01开箱测评 周六继续上班,明天调班接着上,今天来给大家秀一下开箱靓照.开发板是昨天下班收到的,顺丰快递包装还是挺周到的,里面装好了空气袋,防止运输中撞坏 ...

  9. 烧写linux系统到开发板中,Mini2440烧写Linux系统

    按照国嵌课程在Linux系统下使用dnw软件烧写系统失败,开机白屏. 烧写步骤: 1.保持S2开关拨至nor flash开关处,连接串口线打开串口工具以便观察运行情况,打开电源开关. 2.使用jlin ...

最新文章

  1. 浅显易懂 Makefile 入门 (10)— 嵌套执行 make、export 的使用
  2. 黑客必知的SQL语句 黑客知道,程序员必知
  3. Asp.net 2.0 C#实现压缩/解压功能
  4. 辽师836c语言真题,2018年武汉科技大学考研真题硕士研究生入学考试试题
  5. AJAX+JQUERRY实现分页
  6. 【福利】有道云笔记免费送30天VIP会员,有道云笔记功能优缺点汇总
  7. android 文件删除命令大全,Android中删除sdcard里文件的命令
  8. 阿里 20 年,逍遥子宣告「全面迈入数字经济时代」
  9. 【转】python开发大全、系列文章、精品教程
  10. 匹马行天下之思维决定高度篇——教你如何爱上“编程妹子”
  11. 两张图让你快速读懂JVM字节码指令
  12. linux 搜狗输入法变繁体字,搜狗输入法变成繁体字怎么办
  13. Win10将用户名修改为英文
  14. 微信连WiFi(sign有误)
  15. getch方法_C语言 getch()用法及代码示例
  16. 基于惯性动捕的动画应用解决方案——3DMAX篇
  17. 一个主机可以接几个php,一台主机如何连接两个显示器
  18. 如何打造城市夜游景点文化IP
  19. 如何打开使用的mdw的access数据库文件
  20. Ruby on Rails - 使用puma部署Rails项目

热门文章

  1. 50w字+的Android技术类校招面试题汇总(附答案
  2. 从全球看,中国企业面临双重困境
  3. 玲珑杯round#11 ----A
  4. BUCK电路控制方式
  5. 怎样把电脑图片粘贴到准考证上
  6. 《算法导论》学习分享——11. 散列表(哈希表)
  7. 循环冗余校验(CRC)的计算
  8. mybatis入门基础(六)----高级映射(一对一,一对多,多对多)
  9. HTML5开发基础培训(完整)
  10. 解决安装Oracle时检查监视器不通过的问题