分类:MCU

keil uvision4破解教程

1.安装好软件后,右键选中以管理员权限打开。

20150505124250

2.进入程序,点击File—License Management…,打开License Management窗口,复制右上角的CID

20150505124837

20150505124912

3.打开破解工具(强烈推荐先关闭电脑声音), 在CID窗口里填上刚刚复制的CID,其它设置不变,点击Generate生成许可号,并复制许可号。

20150505125301

4.将许可号复制到License Management窗口下部的New License ID Code,点击右侧的Add LIC,然后就可以看到上面胡框框提示可使用到2020年,到此破解就完成了,重启软件生效。

ps:破解完依旧报错可以参考我2013年写的  破解后KEIL软件依旧限制2k解决办法

20150505130037

 

如果有网友路过需要破解软件,请到下方留言,我会更新一个下载链接。

破解后KEIL软件依旧限制2k解决办法

今儿用keil写程序的时候,突然得到以下提示:

RESTRCIED VERSION WITH 0800H BYTE CODE SIZE LIMIT;USED: 083DH BYTE (102%)

FATAL ERROR L250: CODE SIZE LIMIT IN RESTRICTED VERSION EXCEEDED

MODULE: Text1.obj (—–)
LIMIT: 0800H BYTES

mcu1

这明显是使用未破解的Keil软件,最多只允许生成2kB代码的提示;

可是,我已经破解了,怀疑没有破解成功;于是重新打开注册机破解,but taget remain,

我又打开了之前写的一个程序,有20K大;编译,一次通过;

就纳闷了,遂不断摸索,终于找到解决办法,其实很简单;

解决办法是 Project->Rebuild all target files 解决。

估计原因吧,这个程序是在老师那里拷贝来的,他没有破解,而我逐渐写到了2K以上就出现了问题,

由keil自动删除受限制生成的工程。

用全部重新编译就完成了.

用scratch DIY一部手机

DIY手机就是自己制作一部能用的手机(虽然只有基本功能),它可以用来打电话,接电话以及发信息,存储姓名和电话号码,显示时间。它基于Arduino GSM Shield 硬件和软件打造,只不过是给它装一个完整的使用界面,包括显示屏、按钮、扬声器、麦克风等。手机硬件及软件的源文件可以在GitHub上的hardwaresoftware项目中找到,在GitHub上的还有一个问题列表,你可以提交bug报告或填写改进请求。.

手机屏

目前主要有两种DIY手机屏幕:一种采用旧的诺基亚手机那样的黑白LCD液晶屏,还有一种使用八字符的红色点阵LED。LCD液晶屏可以显示更多行内容,每行十四个字符,但随着时间的推移,显示的字符会出现断画的现象,LED点阵式的比较难用,但是显示效果还不错。

 

FTCZPTIHNQYA3DJ.LARGE_

 

FDSIIY7HNQYA4T3.LARGE_

 

打造自己的手机

DIY手机是一个需要投入相当多精力的工程,但它并不一定需要你具有特定的电子类专业知识。你需要订购电路板和电子器件(总共大约200美元),还需要一些其他的电子工具。有差不多60个器件需要手工完成精密焊接,主要是贴片式焊接。整个DIY过程需要1到5小时,甚至可能达到10个小时。这取决于你的经验。编程,特别是调试手机会花费较多时间,同样这也取决于你的经验以及中间的出的差错。外壳的制作需要一些胶合板、单板以及激光切割机(或者你可以用自己的方式去制作电路板)。总之这是一个困难但总体来说可行的项目。

订购线路板

FBC82DAHNQYA3R2.LARGE_

 

yoav1890

 

你可以从 OSH Park订购电路板。大约花费为60美元,总共会有三份电路板。

或者,你可以把Gerber文件传给一个制造商让他们来帮你制作,例如OSH ParkAdvanced CircuitsAP Circuits或许多其他制造商网站。每一次我订购电路板时,我会把我的Gerber文件保存到GitHub上,在其中建立一个目录且以日期命名。我最新的电路设计图可以在LCD variant和 LED matrix variant目录里找到。

目录中有几个不同的文件:

  • *.cmp文件:顶侧(器件侧)镀铜线路层(即板顶部用于实际的电子连接的铜的线路图)
  •  *.sol文件:底(焊锡)侧铜层(向上,线路板底部)
  • *.stc:顶层(器件侧)焊接掩模(绝缘)层(即铜线路板下面的绿色层)
  • *.sts:底层(焊接面)焊接掩模(绝缘)层
  •  *.plc:上(器件侧)丝网(刻字)层,加上整体板尺寸(即白色文本在顶部的板,加上一线指示整个板的形状并没有单独的文件)
  •  *.pls:底(焊接面)丝网(图例)层(白色文本的底部板)
  • *.drd:(excellon)钻孔文件(指定应该在电路板的哪个位置上钻孔)
  • *.dri:钻孔工具文件,通常不需要(以纯文本方式描述使用的钻头尺寸)

你需要上传这些文件(通常打包压缩成zip文件),有时需要指定哪个文件是做什么的。这是一个两层电路板板,尺寸为5.15”x 2.3”,电路板厚度为标准的0.62”,铜重量1盎司,焊接掩模应该不是问题。你需要双面焊接掩模和丝网印刷板。圆角线路板可能会按复杂形状线路板而加收费用,我认为这虽然值得但并不是必要的。.

ben189 ::__IHACKLOG_REMOTE_IMAGE_AUTODOWN_BLOCK__::1

获取部件

制作手机的现成工具是没有的,但你可以从不同的网站订购部件。

电子器件

大多数的电子器件都可以从SparkFunDigi-Key网站订到。M10 GSM 模块你需要从Arduino store上订到。

材料清单:BOM.pdf (LCD器件),BOM.pdf (LED矩阵器件)

工具

组装手机时你将需要配置一套好的焊接工具:一个电烙铁烙铁(例如WES51),烙铁头要好使,细焊锡、熔焊灯芯、镊子等。为了对AVR微处理器编程,那么您需要一个程序烧写器(如AVRISP mkII)以及一个3.3V FTDI Cable线。你还需要一个mini-USB线来给电池充电。 使用激光切割外壳时,您将需要一个激光切割机和一个小的飞利浦螺起子。

SIM卡

手机应该能使用一个全尺寸的SIM卡,,SIM卡可从任何GSM提供商获取。我已经用T-mobile卡在美国测试成功,AT&T电话卡在印度、中国和欧洲也已经测试成功。

其他材料

对于需要激光切割的外壳,你需要准备如下材料:

  •  一张1/4 ” / 6毫米胶合板,像craft plywood from Midwest Products这种可以在美国中西部的许多艺术供应商店可以买到。(避免使用Midwest Products的micro-lite航空胶合板或者其他带黑胶粘合层的胶合板,因为它们会在激光切割机的高温下燃烧);
  • 一张木单面饰板,最好有粘合底布;
  • 六个M0,5/8″,盘头机螺丝(如100 pack from McMaster-Carr);
  • 六个M0螺母(例如50 pack from McMaster-Carr

或者可以试着制作一个不一样的外壳(例如用3D打印机打印或有条件自己铣一个模具)。下面分别是LCD屏版的电路板以及LED点阵版的电路板图示:

8384518274_894c2713f3_m8383433747_e59ef7255b_m

9160323897_79ea9403cb_m9162546146_e33e20b15b_m

焊接电子器件

由于手机使用许多体积小、贴片式器件,可以用一个好的烙铁手工焊接它们。大多数器件都是直接焊接(因为他们的尺寸小),但有少数例外:

  • 电容:大(1000 uF)电容器的焊接要注意极性,如果你接错了方向可能会爆炸。可以用使用橙色条纹事先标识正确。
  • 器件的极性:其他带极性的器件包括超级电容器,发光二极管(注意有两个绿色的小点的一侧),ATmega1284P单片机(注意在角落里的圆圈标志),M10 GSM模块(角落里有个箭头标志),SIM卡插座。
  • 麦克风,二极管(注意淡灰色线一侧)。还有一些器件没有极性(可以任意方向焊接):如晶振(8 MHz)、扬声器、复位按钮、小电容、电阻。其他器件只需要一个方向对齐(但确保晶体管不能颠倒,按钮没有旋转90度)
  • 天线:当焊天线时,先从面向GSM模块的垫块开始焊。因为这里带电气信号,其他都只是在支撑结构(从下面稳定天线)。你甚至可以从天线顶部来加热焊接垫块,热量可以从两个通孔(小孔)散出去。
  • 焊接跳线:电路板底部有两个焊接跳线在,他们的标签分别是“Cell”和“uC”。焊接跳线中心点到标有“uC”的焊接点。(在线路板上此跳线从 FTDI头部通过RX和TX线到ATmega1284P模块,方便他们之间串行通信。相反如果你把中心垫焊接在“Cell”垫上,FTDI线将直接连接到GSM模块,这样你可以与计算机进行通讯)。
  • 扬声器:焊接扬声器是件挺不容易的事,因为它没有引脚。首先,将焊锡涂在印刷电路板的焊接点上。然后将扬声器安在印刷线路板上(和电路板上的焊接垫对齐)和从底部安装焊锡上。你可以添加焊锡或融化之前点在线路板上的焊锡。如果扬声器不发声,不要把扬声器拔下来(你可能会撕裂它下面的焊接点)。相反,尝试对从下面的洞其重新将焊锡点融化。
  • USB连接器:五个小引脚中只有外围的两个用到了,所以你不需要焊接那三个中心的引脚。(注意要焊上四个角,因为他们提供支撑结构的作用)。
  • ISP头:因为你只需要烧录一次引导程序,我特意不把管脚焊到ISP头(2×3)上。相反,可以在烧录引导程序的同时,把管脚插入你的ISP连接器,用手握着线路板(从线路板顶部)对着管脚。如果你做不到,你可以先把管脚焊入孔中,但你必须调整机壳来为它腾出空间。
  • 液晶屏(LCD):你只需要焊屏幕顶部八个脚,而不是底部的八脚。要把晶体焊好,需要从底部插入公头管脚(以便塑料部分在电路板下面)。首先先把它焊在电路板上,然后把显示屏放在上面(检查极性)。最后把管脚焊到显示屏上。

编译软件

手机的软件是一个Arduino程序,利用各种库和第三方硬件定义。你可以编译并与Arduino软件一起上传,但是一些初始设置是必需的:

  1. 下载并安装Arduino 1.0.4(经过测试的)或从Arduino 1.0.5软件页面Arduino software page上安装。
  2. 安装 Git version 版本控制软件.。使用方法见 Windows 或 Mac
  3. GitHub上签出手机的源代码。如:”git clone https://github.com/damellis/cellphone2.git“,然后执行 ”cd cellphone2″ 来改变源代码目录。
  4. 签出手机软件使用的其他库”git submodule init”和”git submodule update”。
  5. 对于LED矩阵屏,签出LED点阵分支”git checkout led-matrix”。(LCD屏代码存储在默认的主分支)。
  6. 运行Arduino系统,在preferences对话框设置你的sketchbook文件夹到cellphone2目录(即你从github上检出的目录)。
  7. 在preferences对话框,启用在编译和上传时显示详细信息(verbose)。(如果有任何差错的话,这将有助于调试)
  8. 重启Arduino软件。
  9. 选择“DIY手机”从工具>线路板菜单。
  10. 从工具> 烧写器菜单选择AVRISP mkII(或者你使用的烧写器)。
  11. 把锂电池放入手机。
  12. 从工具菜单启动“烧录引导程序”(同时握着ISP头的针在对着线路板上相应的孔)。这可能需要几分钟。
  13. 连接3.3 v FTDI电缆到FTDI头(黑色线继续边贴上“B”,绿色的边贴上“G”)。
  14. 从sketchbook打开手机脚本。
  15. 从工具>串行端口菜单选择对应FTDI电缆的选项。
  16. 上传手机脚本。
  17. 屏幕应该打开并显示“正在连接”。
  18. 把SIM卡插入槽中。
  19. 手机连接到网络可能需要一段时间的。如果几分钟之后仍连接不上网络,可以试着重启调整板(按小重启按钮)。你可以在Arduino串行监视器上看到9600波特的调试信息。
  20. 一旦手机和网络连接成功,你会在屏幕上“已连接”和“正在缓存”在屏幕上。几秒后,屏幕变成一片空白。这表明手机已经成功启动现在已锁定屏幕。参见“使用手机”一节获得更多的信息。

cellphone_call240

使用手机

解锁手机

一旦手机成功启动后屏幕将被锁定成空白。按任意键解锁手机,日期和时间将出现在屏幕几秒钟(这是“解锁”屏幕)。在LED点阵晶体上,日期和时间将来回滚动在屏幕上。如果在这时你按下“解锁”键(左上角的按钮),电话将会解锁,如果使用液晶显示屏,屏幕的背光将打开。在液晶日期和时间将保持屏幕会看到软键的“锁”和“菜单”出现在屏幕上。而在LED点阵晶体上时间将继续显示不再滚动,这就是主屏幕。

锁定手机

在主屏幕你可以锁定手机,只要按下左边的软键按钮(左上角按钮)即可。这将关掉屏幕和背光,但电话还在开机状态,还能接电话和发信息。

调整对比度/亮度

在手机的“解锁”屏幕中你可以调整对比度(LCD液晶显示屏)或亮度(LED点阵显示屏),这可以通过使用向上和向下按钮(屏幕下方的4个按键组的中间两个按键)来实现。.

拨电话号码

你可以从主屏幕拨一个号码。只需要简单按下对应的号码的第一个数字键。你会被带到拨号屏幕,在这里您可以输入剩余的数字。按*键可以删除最后一个数字或按“back”回到主屏幕。接下来连续按#键一次或多次,您就可以输入#、*、或+。要打电话就按右键(“call”)。

使用电话簿(联系人列表)

在主屏幕下,按向下箭头进入电话本。使用上下箭头来导航到所需的条目。按右键(“okay”)进入一个菜单,你可以打电话、发送短信到该联系人,添加一个新的联系人到通讯录进行编辑或着删除联系人。

添加一个联系人

要添加一个联系人,首先从主屏幕进入联系人列表,按向下箭头。然后按正确的按钮进入联系人菜单(“call”、“text”、“add entry”等等);滚动(使用上下按键)到“add entry”菜单项按右键即可。现在你可以使用数字小键盘输入的名称(2是“abc”,三是“def”等;1是空格,*是退格,和#是切换)。一旦你进入联系人的名字,按向下箭头移动到联系人的电话号码字段(你也可以按向上箭头返回字段用于输入联系人的名字)。输入联系人的号码使用键盘(*再次退格,但#现在在*# +和之间循环)。当你进入了名字和电话号码后,按右键保存联系人信息(或按左按键取消)。

打电话给联系人

要打电话给一个在您列表中的联系人,只需要滚动到联系人,按右键弹出菜单(“call”、”text”等等),然后再次按右键打电话给联系人。

发短信给联系人

要发短信给联系人,只需滚动到联系人列表,按右键弹出菜单联系人。向下滚动到“text”并按右键。现在你可以使用数字小键盘输入你的信息。(比如联系人的名字,2是“abc”,3是“def”等;1是空格,*是退格,#是切换)。按右键来发送文本(或左键取消)。

故障排除

自制手机涉及很多细节问题,也有很多问题使得手机不能正常工作。这里列举一些潜在的问题和可行的解决方法。

不能烧录引导程序到单片机

  • 微处理器是否带电?(电池放入了么,充电了吗?)
  • 微处理器是否焊接正确(即每条管脚是是否焊接到相应的焊点上和是否短路或脱焊)?特别是检查连接到ISP头、VCC以及接地的管脚是否正确。
  • ISP头的管脚是否牢固地固定在线路板相应的孔上?你可以试一试把管脚焊到ISP头上(线路板的顶部)。
  • 晶振焊接正确吗?(如果不正确的话引导装载程序第一步可能会成功,但第二个步可能会失败)。

不能编译手机程序

  • 你使用是Arduino 1.0.4或1.0.5系统么?
  • 你是否签出了cellphone2子库吗?(他们包含所需的库和线路板的定义)
  • Arduino的sketchbook目录是否设置为cellphone2?(否则Arduino软件无法找到库和线路板的定义)
  • “DIY Cellphone”是从工具>线路板菜单选取的吗?

不能上传手机程序

  • 是FTDI线是否连接正确(黑色线连接到贴着“B”的一端,绿色线连接到“G”的一段)?
  • 你是否从工具>串行端口的菜单选择正确的串口正确么?(试着拔掉FTDI电缆,看哪一项从菜单中消失,那一项就是对应的电缆项)
  • 是焊料跳线焊接正确(中央焊点连接到“UC“点上了么)?
  • 电路板上电了么?
  • FTDI头焊接正确吗?特别是临近的0.1超滤电容?或RX和TX微处理器?
  • 晶振焊接正确吗?
  • 引导装载程序烧录成功吗?(如果没有参考上面这个问题)

不能连接到通讯网络

  • 有SIM卡在插槽上吗?
  • 是SIM插座焊接正确吗?22欧姆电阻焊接正确么?GSM模块上相应的焊接点焊接正确吗?
  • 天线焊接正确吗?相应的焊点在GSM模块吗?
  • 0欧姆电阻是否焊接正确?(跟踪连接M10 GSM模块的天线)
  • 有接收吗?
  • SIM卡被另一部电话锁住了么?
  • AT&T SIM卡(可能还有其他运营商的SIM卡):你在AT&T网站上激活你的SIM卡了么?你需要一个印在M10 GSM模块上的IMEI号码。

其他器件不能工作(例如:显示屏、扬声器、麦克风、蜂鸣器)

  • 器件焊接正确么?
  • 连接器件部分焊接正确么 ?(例如 微处理器或GSM模块的管脚))焊接正确么?

串口调试

你可以通过计算机与GSM模块串口通讯进一步调试手机,使用微处理器作为代理。上传SerialProxy到手机上 (使用一个 3.3V FTDI 线缆或分支电路板)。打开串口监视器,把波特率设定为9600,行结束符设置成回车,几秒后你会看到:

READY

AT

OK

这意味着GSM准备接收AT命令(主要以“AT”打头的字符串文本)。GSM模块的数据手册中会有这个命令是详细介绍,这里有一些基本的AT命令:

AT命令

测试/同步命令。如果你在串口通讯监控器输入“AT”(以“回车”作为行结束符),你应该得到一个“OK”响应。

AT+CREG?

检查网络注册的状态(连接)。响应信息将是“+ CREG 0,N”的格式,N可以是:0(没有注册到网络)、1(注册到网络)、2(寻找网络)、3(网络注册否认)或5(注册、漫游)。

AT+ CPBS?

显示当前选中的电话簿。响应的信息例如:“+ CPBS:“SM”,50250”,“SM”指示的SIM卡是当前电话簿(其他选项包括“MC”为未接电话簿,“RC”为已接电话列表,“ME”是GSM模块电话簿)以及250条中的50个目在使用的联系人 。这个命令可以用于验证GSM模块能够与SIM卡的连接是否正确。

AT+ CPBS =“SM”

选择SIM卡的电话簿。你也可以用前面说的MC,RC,ME取代“SM”缩写。

AT+ CPBR = 1

阅读从当前选中的电话簿第一个条目。1可以换成其他你想读取的条目(电话本总的大小由AT+ CPBS 命令可以查出)

制作外壳

你可以采用激光切割的胶合板、单板饰面、以及一些小螺丝做一个简单但实用的外壳(详见上面的材料):

  1. 切割之前的情况,检查包装文件是否和电路板匹配。特别是我在大小和螺丝孔的位置上做了很多的调整,所以检查它们在PCB板和包装在外壳的孔是否在同一个位置上。(注意,外饰单板文件上的洞底应该比其他的孔大些,这是为了安上螺母、以及能把螺丝轻松的拧下来)
  2. 如果你在ISP头上焊上固定点,你需要在顶部块胶合板上抠出空间。相应DIY-Cellphone-Top图纸也要进行修改。
  3. 采用在GitHub上的damellis / cellphone2hw库Case/ folder中的DIY-Cellphone-Top-Veneer和DIY-Cellphone-Bottom-Veneer图纸文件来用激光切割胶合板(1/4”/ 6毫米)。SVG文件被创建到Inkscape里,然后生成hpgl文件,以便在CorelDraw绘图软件中导入。
  4. 激光表面使用DIY-Cellphone-Top-Veneer 和 DIY-Cellphone-Bottom-Veneer单板文件。切单板饰面时木前面向上(胶背面向下)
  5. 从顶部饰面单板块撕掉粘合底布,然后贴在了外面的顶级胶合板片上。背部反复贴紧,,再把外部的饰面贴在胶合板上。
  6. 在上层每个按钮和顶部饰面单板之间有一点空空间。你可以在上层饰面板的背面防止间隔垫,一个用于安放按钮的装置(放于饰面单板中间的一个个矩形曲线图样)。这样你不必降低单板下的按钮高度。
  7. 滑动电路板顶部和底部的外壳。为了安装GSM模块和电池连接器之间的电池线, 需要把电线弯成两段。胶合板碎片应该保持与电路板平行。
  8. 把六个螺丝拧进螺帽里。

设计文档

手机的设计文件和源代码可以在GitHub上找到:

 

 

英文原文链接:http://www.instructables.com/id/Make-your-own-cellphone-from-scratch

如何让keil支持二进制

最近在写流水灯程序和数码管位选的程序时对Keil不支持二进制还是很不满,

比如让P0口控制的8个LED间隔点亮,汇编语言可以直接写成

MOV P0, #01010101B
或者
MOV P0, #55H

而C语言中只能识别这样的语句:P0 = 0x55。

赋值P0 = 01010101不是既方便又直观吗?

mcu1

 

 

下面有几种方式可以使keil支持二进制.

方法一:

/*******************************************************
首先准备一个二进制对应十进制的数组(对应十六进制也行,个人爱好):
unsigned char code table_bin[8]={1,2,4,8,16,32,64,128};
这个数组每个元素都是8位字节的一个二进制位(从低到高)所对应的十进制值,即2的N次方
然后写这样一个函数,把刚才的数组放在里面:
***************************************************************/
uchar binary(char *str_bin){
uchar i,s = 0;

    unsigned char code table_bin[8]={1,2,4,8,16,32,64,128};

    for(i=8; i>=1; i–){
if(*str_bin == ‘1’){
s += table_bin[i-1];
}
str_bin++;
}

return(s);
}

//这个函数的功能是把一个以字符串形式输入的二级制码转换为对应十进制返回。简单调用如下:

P0 = binary(“01010101”);

//仿真中能够看到P0口对应电平状态已经达到预期要求。
/*****************************************************/

 

用字符串输入和查表取值,是专门为单片机这种嵌入式控制器设计的解决方案。
因为单片机体积小重量轻功耗低,因此从运算速度和内部资源上讲都很受限制。如果不用查表而直接使用Math.h中的pow()指数函数的话将牵扯大量双精度浮点运算。这样不仅耗费机器周期极多,对CPU本身也是极大的负担。如果这时还需要频繁地响应中断或串行通信,那么系统运行就会不稳定。因此查表是比较合理的选择。
当然没有完美的办法,这个方法也有个缺点就是输入的时候必须是8位一起输入。其实对于老手而言看着二进制完全就可以口算出十六进制,所以新手可以考虑使用~

方法二:

类似于上一种,程序更简洁:

uchar binary(char *str_bin){
uchar i,s = 0;
str_bin+=7;
for(i=1; i<=8; i++){
s<<=1;
s|=(*str_bin==”1″);
str_bin–;
}
return(s);
}

 

 

第三种:

看起来最简单的,使用宏定义:

         /*————让KEIL输入二进制的头文件———*/
/*——————— binary.h —————————*/
/*—————————————————————*/

#define B00000000 0x00
#define B00000001 0x01
#define B00000010 0x02
#define B00000011 0x03
#define B00000100 0x04
#define B00000101 0x05
#define B00000110 0x06
#define B00000111 0x07
#define B00001000 0x08
#define B00001001 0x09
#define B00001010 0x0A
#define B00001011 0x0B
#define B00001100 0x0C
#define B00001101 0x0D
#define B00001110 0x0E
#define B00001111 0x0F

#define B00010000 0x10
#define B00010001 0x11
#define B00010010 0x12
#define B00010011 0x13
#define B00010100 0x14
#define B00010101 0x15
#define B00010110 0x16
#define B00010111 0x17
#define B00011000 0x18
#define B00011001 0x19
#define B00011010 0x1A
#define B00011011 0x1B
#define B00011100 0x1C
#define B00011101 0x1D
#define B00011110 0x1E
#define B00011111 0x1F

#define B00100000 0x20
#define B00100001 0x21
#define B00100010 0x22
#define B00100011 0x23
#define B00100100 0x24
#define B00100101 0x25
#define B00100110 0x26
#define B00100111 0x27
#define B00101000 0x28
#define B00101001 0x29
#define B00101010 0x2A
#define B00101011 0x2B
#define B00101100 0x2C
#define B00101101 0x2D
#define B00101110 0x2E
#define B00101111 0x2F

#define B00110000 0x30
#define B00110001 0x31
#define B00110010 0x32
#define B00110011 0x33
#define B00110100 0x34
#define B00110101 0x35
#define B00110110 0x36
#define B00110111 0x37
#define B00111000 0x38
#define B00111001 0x39
#define B00111010 0x3A
#define B00111011 0x3B
#define B00111100 0x3C
#define B00111101 0x3D
#define B00111110 0x3E
#define B00111111 0x3F

#define B01000000 0x40
#define B01000001 0x41
#define B01000010 0x42
#define B01000011 0x43
#define B01000100 0x44
#define B01000101 0x45
#define B01000110 0x46
#define B01000111 0x47
#define B01001000 0x48
#define B01001001 0x49
#define B01001010 0x4A
#define B01001011 0x4B
#define B01001100 0x4C
#define B01001101 0x4D
#define B01001110 0x4E
#define B01001111 0x4F

#define B01010000 0x50
#define B01010001 0x51
#define B01010010 0x52
#define B01010011 0x53
#define B01010100 0x54
#define B01010101 0x55
#define B01010110 0x56
#define B01010111 0x57
#define B01011000 0x58
#define B01011001 0x59
#define B01011010 0x5A
#define B01011011 0x5B
#define B01011100 0x5C
#define B01011101 0x5D
#define B01011110 0x5E
#define B01011111 0x5F

#define B01100000 0x60
#define B01100001 0x61
#define B01100010 0x62
#define B01100011 0x63
#define B01100100 0x64
#define B01100101 0x65
#define B01100110 0x66
#define B01100111 0x67
#define B01101000 0x68
#define B01101001 0x69
#define B01101010 0x6A
#define B01101011 0x6B
#define B01101100 0x6C
#define B01101101 0x6D
#define B01101110 0x6E
#define B01101111 0x6F

#define B01110000 0x70
#define B01110001 0x71
#define B01110010 0x72
#define B01110011 0x73
#define B01110100 0x74
#define B01110101 0x75
#define B01110110 0x76
#define B01110111 0x77
#define B01111000 0x78
#define B01111001 0x79
#define B01111010 0x7A
#define B01111011 0x7B
#define B01111100 0x7C
#define B01111101 0x7D
#define B01111110 0x7E
#define B01111111 0x7F

#define B10000000 0x80
#define B10000001 0x81
#define B10000010 0x82
#define B10000011 0x83
#define B10000100 0x84
#define B10000101 0x85
#define B10000110 0x86
#define B10000111 0x87
#define B10001000 0x88
#define B10001001 0x89
#define B10001010 0x8A
#define B10001011 0x8B
#define B10001100 0x8C
#define B10001101 0x8D
#define B10001110 0x8E
#define B10001111 0x8F

#define B10010000 0x90
#define B10010001 0x91
#define B10010010 0x92
#define B10010011 0x93
#define B10010100 0x94
#define B10010101 0x95
#define B10010110 0x96
#define B10010111 0x97
#define B10011000 0x98
#define B10011001 0x99
#define B10011010 0x9A
#define B10011011 0x9B
#define B10011100 0x9C
#define B10011101 0x9D
#define B10011110 0x9E
#define B10011111 0x9F

#define B10100000 0xA0
#define B10100001 0xA1
#define B10100010 0xA2
#define B10100011 0xA3
#define B10100100 0xA4
#define B10100101 0xA5
#define B10100110 0xA6
#define B10100111 0xA7
#define B10101000 0xA8
#define B10101001 0xA9
#define B10101010 0xAA
#define B10101011 0xAB
#define B10101100 0xAC
#define B10101101 0xAD
#define B10101110 0xAE
#define B10101111 0xAF

#define B10110000 0xB0
#define B10110001 0xB1
#define B10110010 0xB2
#define B10110011 0xB3
#define B10110100 0xB4
#define B10110101 0xB5
#define B10110110 0xB6
#define B10110111 0xB7
#define B10111000 0xB8
#define B10111001 0xB9
#define B10111010 0xBA
#define B10111011 0xBB
#define B10111100 0xBC
#define B10111101 0xBD
#define B10111110 0xBE
#define B10111111 0xBF

#define B11000000 0xC0
#define B11000001 0xC1
#define B11000010 0xC2
#define B11000011 0xC3
#define B11000100 0xC4
#define B11000101 0xC5
#define B11000110 0xC6
#define B11000111 0xC7
#define B11001000 0xC8
#define B11001001 0xC9
#define B11001010 0xCA
#define B11001011 0xCB
#define B11001100 0xCC
#define B11001101 0xCD
#define B11001110 0xCE
#define B11001111 0xCF

#define B11010000 0xD0
#define B11010001 0xD1
#define B11010010 0xD2
#define B11010011 0xD3
#define B11010100 0xD4
#define B11010101 0xD5
#define B11010110 0xD6
#define B11010111 0xD7
#define B11011000 0xD8
#define B11011001 0xD9
#define B11011010 0xDA
#define B11011011 0xDB
#define B11011100 0xDC
#define B11011101 0xDD
#define B11011110 0xDE
#define B11011111 0xDF

#define B11100000 0xE0
#define B11100001 0xE1
#define B11100010 0xE2
#define B11100011 0xE3
#define B11100100 0xE4
#define B11100101 0xE5
#define B11100110 0xE6
#define B11100111 0xE7
#define B11101000 0xE8
#define B11101001 0xE9
#define B11101010 0xEA
#define B11101011 0xEB
#define B11101100 0xEC
#define B11101101 0xED
#define B11101110 0xEE
#define B11101111 0xEF

#define B11110000 0xF0
#define B11110001 0xF1
#define B11110010 0xF2
#define B11110011 0xF3
#define B11110100 0xF4
#define B11110101 0xF5
#define B11110110 0xF6
#define B11110111 0xF7
#define B11111000 0xF8
#define B11111001 0xF9
#define B11111010 0xFA
#define B11111011 0xFB
#define B11111100 0xFC
#define B11111101 0xFD
#define B11111110 0xFE
#define B11111111 0xFF