在树莓派3 io中如何像51单片那样把8个io口直接怎么写P1=0x00类似

后使用快捷导航没有帐号?
查看: 2775|回复: 25
注册时间最后登录阅读权限70积分10360精华3帖子
翰林, 积分 10360, 距离下一级还需 19640 积分
TA的每日心情无聊 15:08签到天数: 510 天连续签到: 1 天[LV.9]以坛为家II
本帖最后由 ming1006 于
21:51 编辑
&&最近在帮同学做一个32*56的点阵屏,是用洞洞板做的,那个连线,那个密密麻麻,那个心碎啊......打住,打住,这不是今天的主要内容,这个留着下次说吧!
&&在历尽千辛万苦,排除种种错焊,重重虚焊,终于将电路连接焊接好后,用51驱动却发现屏幕闪得厉害。要知道,我已经将原来单片机的11.0592M晶振换成32M晶振了(最高可以跑40M的SST89E58RDA换上40M晶振不知怎么的反而只有10来M)。诶,早知道之前在设计电路的时候就应该计算好,当时初略估计了下就以为速度没问题,于是为了节省引脚,就将点阵屏的驱动全部用了74HC595,整个屏幕总共用了18个595,所有的数据都是串行传送。现在可好了,屏幕闪烁了,怎么办?
&&昨天纠结了一晚上,一直在想如何提高速度,最后都快没办法了,已经打算今天进行电路改造了(这种电路,好几百条的飞线,要下定这个决心真不容易啊)。今天早上起晚了,不想去实验室,于是想在寝室先调一调,看能不能软件上解决。结果真有收获,于是就决定不改电路了,花了一下午时间进行各种测试对比,研究如何让C51执行尽可能快。
&&这次仿真时间是用的Keil3的Logical Analyzer(之前要嘛用keil2,要嘛用keil4,keil2没这个功能,kiel4不知怎么的不能仿真,网上也有人有这个问题,于是一直忘了keil有这个功能,虽然仿真时间和实际可能不一定相等,但是比较时间还是很可靠的),我一开始使用的的串行传送数据代码如下:void SendData(u8 byte1,u8 byte2)
{
& && &&&data u8
& && &&&
& && &&&for(i = 0;i & 8;i++)
& && &&&{& && && && && && && && &
& && && && && & COL_SCK_L;
& && && && && & if(byte1 & (0x80 && i))
& && && && && && && && &COL_SI_H;
& && && && && & else
& && && && && && && && &COL_SI_L;
& && && && && & COL_SCK_H;
& && &&&}
& && &&&for(i = 0;i & 8;i++)
& && &&&{& && && && && && && && &
& && && && && & COL_SCK_L;
& && && && && & if(byte2 & (0x80 && i))
& && && && && && && && &COL_SI_H;
& && && && && & else
& && && && && && && && &COL_SI_L;
& && && && && & COL_SCK_H;
& && &&&}
& && &&&COL_RCK_L;
& && &&&COL_RCK_H;
}复制代码在主函数的while循环里要调用它:while(1)
{
&&ROW_SCK_L;
&&ROW_SI_H;
&&ROW_SCK_H;
&&ROW_RCK_L;
&&ROW_RCK_H;
&&ROW_SI_L;
&&for(j=0 ; j&112 ; j++)
&&{
& & SendData(Hanzi[(j*2)+1],Hanzi[(j*2)]);
& & ROW_SCK_L;
& & ROW_SCK_H;
& & ROW_RCK_L;
& & ROW_RCK_H;
}
& && &&&}复制代码一开始的时候我的keil里的优化等级选择lever 9(faver speed),整个for循环执行一次大约要416us,也就是说发送一次16位数据要416us,显示一帧要发送112次16位字节也就是要46.592ms(实际时间应该不止,不然应该不会有闪烁感)。
&&优化等级已经达到最高了,是不是意味着速度也已经达到最优了。抱着试试看的态度,我试了下,改成lever 0(faver speed),结果意想不到的事情发生了,发送一次数据时间只要400us左右。这是怎么回事,优化的效果还不如不优化的。试一下其他等级看看吧,于是我把所有的优化等级实验了一遍,得到结果如下表:
优化等级for语句+移位(n位)时间/us0(speed)400.501(speed)400.192(speed)400.503(speed)338.364(speed)350.275(speed)350.276(speed)314.797(speed)313.88(size:798)8(speed)314.799(speed)416.46(size:776)9(size)423.84(size:776)
&&从实验数据可以看到,速度最快的是lever 7(faver speed),或者说lever 6、7、8都差不多将速度优化到了最佳,执行时间从416.46us减少到了313.88us,我们实现了faster。但是,这点速度的提高还是不能解决闪烁问题,we need faster!
&&有办法吗?别急,让我们先看看Logic Analyzer的图形。
19:46 上传
&&P1.2两个脉冲之间的时间就是执行一次SendData的执行时间,P1.7是串行通信移位时钟。怎么?有没有发现问题?串行时钟的逻辑0,怎么持续时间不一样?先由小变大,后又由小变大,数了下,变大的周期为8个串行时钟周期。这是怎么回事,让我们来看看汇编代码吧。& &126:& && && &for(i = 0;i & 8;i++)
C:0x0225& & E4& && & CLR& && &A
C:0x0226& & FC& && & MOV& && &R4,A
& &127:& && && &{& && && && && && && &
& &128:& && && && && &&&COL_SCK_L;
& &129:& && && && && &&&if(byte1 & (0x80 && i))
C:0x0227& & 1202DD& &LCALL& & Com0038(C:02DD)
C:0x022A& & 8003& &&&SJMP& &&&C:022F
C:0x022C& & 1202E7& &LCALL& & L?0060(C:02E7)
C:0x022F& & D8FB& &&&DJNZ& &&&R0,C:022C
C:0x0231& & FF& && & MOV& && &R7,A
C:0x0232& & E9& && & MOV& && &A,R1
C:0x0233& & FB& && & MOV& && &R3,A
C:0x0234& & EF& && & MOV& && &A,R7
C:0x0235& & 5B& && & ANL& && &A,R3
C:0x0236& & 6004& &&&JZ& && & C:023C
& &130:& && && && && && && && & COL_SI_H;
& &131:& && && && && &&&else
C:0x0238& & D295& &&&SETB& &&&P1_5(0x90.5)
C:0x023A& & 8002& &&&SJMP& &&&C:023E
& &132:& && && && && && && && & COL_SI_L;
C:0x023C& & C295& &&&CLR& && &P1_5(0x90.5)
& &133:& && && && && &&&COL_SCK_H;
C:0x023E& & D297& &&&SETB& &&&P1_7(0x90.7)
& &134:& && && &}
C:0x0240& & 0C& && & INC& && &R4
C:0x0241& & BC08E3& &CJNE& &&&R4,#0x08,C:0227复制代码这是SendData的主要执行代码,可以看到短短几句话,但是里面却还有两个LCALL,这两个LCALL是干什么用的呢?让我们再来看看吧:C:0x02DD& & C297& &&&CLR& && &P1_7(0x90.7)
C:0x02DF& & 7480& &&&MOV& && &A,#P0(0x80)
C:0x02E1& & 7E00& &&&MOV& && &R6,#0x00
C:0x02E3& & A804& &&&MOV& && &R0,0x04
C:0x02E5& & 08& && & INC& && &R0
C:0x02E6& & 22& && & RET& && &
C:0x02E7& & CE& && & XCH& && &A,R6
C:0x02E8& & A2E7& &&&MOV& && &C,0xE0.7
C:0x02EA& & 13& && & RRC& && &A
C:0x02EB& & CE& && & XCH& && &A,R6
C:0x02EC& & 13& && & RRC& && &A
C:0x02ED& & 22& && & RET& && &复制代码&&不难分析C:0x02DD的子函数处的其实是for循环的处理和移位运算的初始化,C:0x02E7的子函数是一个移位函数。两个LCALL子函数其实挺小的,倒也不会产生很大问题,但是 (0x80 && i)是要调用移位函数的,且移位的位数越多,调用的次数也越多,这也就为什么,串行时钟逻辑低电平的持续时间越来越长了。如果每次的时间都和第一次一样长多好啊!对,为什么不能做的一样长呢?干脆去掉移位,再把for循环也去了不就更省时间。于是,下面的代码就诞生了:void SendData(u8 byte1,u8 byte2)
{
& && &&&COL_SCK_L;
& && &&&if(byte1 & 0x80)
& && && && && & COL_SI_H;
& && &&&else
& && && && && & COL_SI_L;
& && &&&COL_SCK_H;
& && &&&COL_SCK_L;
& && &&&if(byte1 & 0x40)
& && && && && & COL_SI_H;
& && &&&else
& && && && && & COL_SI_L;
& && &&&COL_SCK_H;
& && && && && &
& && &&&COL_SCK_L;
& && &&&if(byte1 & 0x20)
& && && && && & COL_SI_H;
& && &&&else
& && && && && & COL_SI_L;
& && &&&COL_SCK_H;
& && &&&COL_SCK_L;
& && &&&if(byte1 & 0x10)
& && && && && & COL_SI_H;
& && &&&else
& && && && && & COL_SI_L;
& && &&&COL_SCK_H;
& && && && && &
& && &&&COL_SCK_L;
& && &&&if(byte1 & 0x08)
& && && && && & COL_SI_H;
& && &&&else
& && && && && & COL_SI_L;
& && &&&COL_SCK_H;
& && &&&COL_SCK_L;
& && &&&if(byte1 & 0x04)
& && && && && & COL_SI_H;
& && &&&else
& && && && && & COL_SI_L;
& && &&&COL_SCK_H;
& && && && && &
& && &&&COL_SCK_L;
& && &&&if(byte1 & 0x02)
& && && && && & COL_SI_H;
& && &&&else
& && && && && & COL_SI_L;
& && &&&COL_SCK_H;
& && &&&COL_SCK_L;
& && &&&if(byte1 & 0x01)
& && && && && & COL_SI_H;
& && &&&else
& && && && && & COL_SI_L;
& && &&&COL_SCK_H;
& && &&&COL_SCK_L;
& && &&&if(byte2 & 0x80)
& && && && && & COL_SI_H;
& && &&&else
& && && && && & COL_SI_L;
& && &&&COL_SCK_H;
& && &&&COL_SCK_L;
& && &&&if(byte2 & 0x40)
& && && && && & COL_SI_H;
& && &&&else
& && && && && & COL_SI_L;
& && &&&COL_SCK_H;
& && && && && &
& && &&&COL_SCK_L;
& && &&&if(byte2 & 0x20)
& && && && && & COL_SI_H;
& && &&&else
& && && && && & COL_SI_L;
& && &&&COL_SCK_H;
& && &&&COL_SCK_L;
& && &&&if(byte2 & 0x10)
& && && && && & COL_SI_H;
& && &&&else
& && && && && & COL_SI_L;
& && &&&COL_SCK_H;
& && && && && &
& && &&&COL_SCK_L;
& && &&&if(byte2 & 0x08)
& && && && && & COL_SI_H;
& && &&&else
& && && && && & COL_SI_L;
& && &&&COL_SCK_H;
& && &&&COL_SCK_L;
& && &&&if(byte2 & 0x04)
& && && && && & COL_SI_H;
& && &&&else
& && && && && & COL_SI_L;
& && &&&COL_SCK_H;
& && && && && &
& && &&&COL_SCK_L;
& && &&&if(byte2 & 0x02)
& && && && && & COL_SI_H;
& && &&&else
& && && && && & COL_SI_L;
& && &&&COL_SCK_H;
& && &&&COL_SCK_L;
& && &&&if(byte2 & 0x01)
& && && && && & COL_SI_H;
& && &&&else
& && && && && & COL_SI_L;
& && &&&COL_SCK_H;
& && && && && &
& && &&&COL_RCK_L;
& && &&&COL_RCK_H;
} 复制代码我想这是一段简单得再简单不过的代码了,没有什么复杂的语法,而且非常的冗长,但是如果我们想要得就是速度,牺牲一定空间又何乐而不为呢?we need faster,faster。让我们来看看代码执行的时间吧,你会吃一惊的(我们依然把实验从lever0到lever9做一遍):
优化等级顺序语句时间/us0(speed)68.231(speed)68.232(speed)68.193(speed)66.704(speed)65.315(speed)65.216(speed)63.337(speed)63.378(speed)63.379(speed)63.31(size:935)9(size)70.87(size:935)&&怎么样,最少用时63.37,比最早时的速度整整提高了6.6倍。6.6倍,6.6倍啊,6.6倍意味着什么呢?意味着老子的屏幕不闪了,不闪了,不闪了......这是何等的欣慰啊!C51,faster,faster,we need faster!
&&通过观察汇编窗口,发现这种代码在lever 9下的代码已经几乎是你能想到的最快的运行速度了。我们来看看我们现在代码的情况吧:SendData执行时间63.31us,总代码长度(还有其他代码)935字节;而之前的代码如果取lever 7下最快的情况对比则是:SenData执行时间313.88us,总代码长度798字节。采取第二种代码的话,我们将以137字节的代码空间换取4.96倍的速度,对于ROM不紧张的情况下何乐而不为呢?
&&到这里我的文章是不是该完了呢?呵呵,不是的,虽然我没能将代码的执行速度再提高了(优化主函数while循环里for循环等还可以更快的,这个就留着以后有空再优化),但是我们或许还有一个不错的方案。毕竟这个方案在速度不是很吃紧,而ROM去很吃紧的情况下没人想采用的。有没有想过,只要稍作修改,就可以让代码空间更小,而且速度是第一种的3倍。
&&没骗你的,其实这个方法很简单,而且也应该是一种习惯。第一种方案的串行模拟代码其实是很没有效率的,该被摒弃的。让我们再看看第一种方案,之前我们就说过,这个方案效率很低的原因就是移位函数的大量调用。要想不使用移位似乎是不大可能,不过要是每次只移位一位就好了。这是可以做到的,而且其实很多代码都是这么做的,只是我们没有注意到它的好处。这个方案的代码如下:void SendData(u8 byte1,u8 byte2)
{
& && &&&data u8
& && &&&
& && &&&for(i = 0;i & 8;i++)
& && &&&{& && && && && && && && &
& && && && && & COL_SCK_L;
& && && && && & if(byte1 & 0x80)
& && && && && && && && &COL_SI_H;
& && && && && & else
& && && && && && && && &COL_SI_L;
& && && && && & COL_SCK_H;
& && && && && & byte1 &&= 1;
& && &&&}
& && &&&for(i = 0;i & 8;i++)
& && &&&{& && && && && && && && &
& && && && && & COL_SCK_L;
& && && && && & if(byte2 & 0x80)
& && && && && && && && &COL_SI_H;
& && && && && & else
& && && && && && && && &COL_SI_L;
& && && && && & COL_SCK_H;
& && && && && & byte2 &&= 1;
& && &&&}
& && &&&COL_RCK_L;
& && &&&COL_RCK_H;
} 复制代码怎么样,只是稍加改动就做到了每次只移位一次,效果就大不一样,不信你看:
优化等级For语句+移位(1位)时间/us0(speed)139.251(speed)139.452(speed)139.253(speed)137.944(speed)136.595(speed)136.476(speed)100.757(speed)100.758(speed)100.799(speed)100.71(size:759)9(size)108.15(size:759)&&在lever 9(faver speed)下,SendData执行时间为100.7us,总代码长度为759字节。
&&这种方案和第一种方案在串行通信时都有用到,但是他们的效率差别可见一斑。我们应该在平时书写是注意自己的习惯,用第三种方案而不是第一种,because we need faster,and we also need small。
&&下面把三种方案的实验结果做了张表,对比下,来研究下keil的编译等级:
优化等级for语句+移位(n位)顺序语句For语句+移位(1位)时间/us时间/us时间/us0(speed)400.5068.23139.251(speed)400.1968.23139.452(speed)400.5068.19139.253(speed)338.3666.70137.944(speed)350.2765.31136.595(speed)350.2765.21136.476(speed)314.7963.33100.757(speed)313.88(size:798)63.37100.758(speed)314.7963.37100.799(speed)416.46(size:776)63.31(size:935)100.71(size:759)9(size)423.84(size:776)70.87(size:935)108.15(size:759)
&&从上表我们可以总结一下几点:
1.在keil的优化选项选择faver speed可以使生成代码的执行时间更少,而且在编译等级高的情况下也可以使代码空间大小达到一个很高的优化,对于本程序在lever 9下达到了和faver size一样的代码大小。
2.提高keil里的优化等级绝大部分情况下可以提高生成代码的执行速度,但是有时候不是,比如方案一的lever 9(我想不知道这是不是keil一开始默认的优化等级是8的原因)。
3.keil优化等级对速度的优化基本上分3个阶梯,lever0~lever2为第一个阶梯,速度最慢;lever3~lever5为第二个阶梯,速度较第一阶梯有较大优化;lever6~lever9为第三阶梯,速度较第二阶梯又有了较大的优化。
4.对比3种方案可以得出,第三种方案较第二种方案多了for循环和一位移位,所以执行时间翻了快一倍,而第一种方案与第三种方案的不同在于第一种方案存在多位移位,结果其执行时间又翻了3倍左右。于是我们可以总结,在C51中,多位移位并不是执行效率很高的方法,要想办法避免使用。
5.本实验的结论主要是在for循环和数组的索引(SendData(Hanzi[(j*2)+1],Hanzi[(j*2)]); hanzi[]即数组,对数组的索引,其地址的计算获得在for语句下应该是和效率有直接相关的)下进行的,对这类代码应该有较高的参考性,至于对其他类型的代码的优化可能会有差异,在此不多做研究。不过这种循环较数组索引的代码结构很常见,所以应该具有较高的参考性。
&&在下面,附上keil优化等级的说明,其能够对本实验的一些结果进行解释,大家可以细细研究:
0& & 常数合并:编译器预先计算结果,尽可能用常数代替表达式。包括运行地址计算。
& &&&优化简单访问:编译器优化访问8051系统的内部数据和位地址。
& &&&跳转优化:编译器总是扩展跳转到最终目标,多级跳转指令被删除。
1& & 死代码删除:没用的代码段被删除。
& &&&拒绝跳转:严密的检查条件跳转,以确定是否可以倒置测试逻辑来改进或删除。
2& & 数据覆盖:适合静态覆盖的数据和位段被确定,并内部标识。BL51连接/定位器可以通& &&&过全局数据流分&&,选择可被覆盖的段。
3& & 窥孔优化:清除多余的MOV指令。这包括不必要的从存储区加载和常数加载操作。当存 & &&&储空间或执行时间可节省时,用简单操作代替复杂操作。
4& & 寄存器变量:如有可能,自动变量和函数参数分配到寄存器上。为这些变量保留的存 储区就省略了。
& &&&优化扩展访问:IDATA、XDATA、PDATA和CODE的变量直接包含在操作中。在多数时间没& &&&必要使用中间寄存器。
& &&&局部公共子表达式删除:如果用一个表达式重复进行相同的计算,则保存第一次计算& &&&结果,后面有可能就用这结果。多余的计算就被删除。
& &&&Case/Switch优化:包含SWITCH和CASE的代码优化为跳转表或跳转队列。
5& & 全局公共子表达式删除:一个函数内相同的子表达式有可能就只计算一次。中间结果& &&&保存在寄存器中,在一个新的计算中使用。
& &&&简单循环优化:用一个常数填充存储区的循环程序被修改和优化。
6& & 循环优化:如果结果程序代码更快和有效则程序对循环进行优化。
7& & 扩展索引访问优化:适当时对寄存器变量用DPTR。对指针和数组访问进行执行速度和 代码大小优化。
8& & 公共尾部合并:当一个函数有多个调用,一些设置代码可以复用,因此减少程序大小 。
9& & 公共块子程序:检测循环指令序列,并转换成子程序。Cx51甚至重排代码以得到更大的循环序列。
总评分:&声望 + 1&
铜板 + 10&
注册时间最后登录阅读权限100积分7250精华0帖子
TA的每日心情怒 09:02签到天数: 656 天连续签到: 1 天[LV.9]以坛为家II
顶一个,这个文章可以去杂志上发表了
& & 我走了
& && & 正如我轻轻地来
挥一挥衣袖
& &不带走一片云彩
注册时间最后登录阅读权限70积分10360精华3帖子
翰林, 积分 10360, 距离下一级还需 19640 积分
TA的每日心情无聊 15:08签到天数: 510 天连续签到: 1 天[LV.9]以坛为家II
exiao 发表于
顶一个,这个文章可以去杂志上发表了
只是浅显的研究了下,之前对C51的优化和keil的优化等级也不是很明白,不对的还望指出,
注册时间最后登录阅读权限50积分2746精华0帖子
进士, 积分 2746, 距离下一级还需 254 积分
TA的每日心情奋斗 22:39签到天数: 303 天连续签到: 1 天[LV.8]以坛为家I
写的好,学习,参考了,做的很好
注册时间最后登录阅读权限50积分2779精华0帖子
进士, 积分 2779, 距离下一级还需 221 积分
TA的每日心情慵懒 22:37签到天数: 259 天连续签到: 1 天[LV.8]以坛为家I
呵呵,楼主很用心啊
注册时间最后登录阅读权限100积分9301精华5帖子
TA的每日心情开心 21:35签到天数: 340 天连续签到: 1 天[LV.8]以坛为家I
啥情况……支持!
注册时间最后登录阅读权限100积分9301精华5帖子
TA的每日心情开心 21:35签到天数: 340 天连续签到: 1 天[LV.8]以坛为家I
好久没看到lz这么经典的文章了呀……
注册时间最后登录阅读权限70积分10360精华3帖子
翰林, 积分 10360, 距离下一级还需 19640 积分
TA的每日心情无聊 15:08签到天数: 510 天连续签到: 1 天[LV.9]以坛为家II
Hayasaky 发表于
呵呵,楼主很用心啊
呵呵,还是要花很多时间的,不过研究下,也值得
注册时间最后登录阅读权限70积分10360精华3帖子
翰林, 积分 10360, 距离下一级还需 19640 积分
TA的每日心情无聊 15:08签到天数: 510 天连续签到: 1 天[LV.9]以坛为家II
kk5290122 发表于
好久没看到lz这么经典的文章了呀……
什么情况,经典?
注册时间最后登录阅读权限60积分5240精华0帖子
状元, 积分 5240, 距离下一级还需 4760 积分
TA的每日心情怒 09:17签到天数: 911 天连续签到: 1 天[LV.10]以坛为家III
keil 的优化等级是两方面的 一方面是代码大小 一方面是速度& & 不过优化等级再高还是不如人工优化啊
论坛版主职务勋章
爱板网论坛版主
爱板会员勋章
注册成为爱板网会员
活跃会员勋章
经常参与各类话题的讨论,发帖内容较有主见
在线达人勋章
在线时间长,且活跃度高
论坛骨干勋章
在论坛积极发帖,并积极与坛友交流互动,成为论坛骨干力量
发帖机器勋章
在论坛积极发帖,数量巨大,质量较高
原创达人勋章
经常在论坛发表原创帖,且质量较高
热心会员勋章
经常帮助其他会员答疑
在线之王勋章
在线时间非常长,且活跃度高
优秀会员勋章
经常在论坛发帖,与论坛互动交流,对论坛贡献很大
突出贡献勋章
长期对论坛的繁荣而不断努力,或多次提出建设性意见
技术高手勋章
拥有多年经验和一流的技术水平
推广达人勋章
积极宣传本站,为本站带来更多注册会员
灌水专家勋章
长期在论坛灌水,活跃论坛气氛
站长推荐 /8
爱板网最新上线每周精选栏目,其中汇集科技前沿、评测、拆解、原创资料、最新最热活动!不容错过速速围观!
爱板网论坛面向所有的网友进行 “晒板有奖” 活动,只要你有板卡,就可以尽情来晒,不仅有机会获得一定的奖励,同时,还能一览其他网友晒出的各种板卡。活动详情
参加本场团购活动,即可享受下单返现的福利,原厂的品质,代理的价格!史上仅此一次优惠活动,现金/京东卡任选其一,立减高达140元!
爱板团购专场又来喽!!购买以下4款开发板或任意产品即可参加我们的团购活动。现金or京东卡任意选,金额不止100元哦!
设计为带内置USB和电池充电功能的一体式ESP8266 Wi-Fi开发板。该板采用ESP8266 Wi-Fi微控制器,能够在最大80MHz时钟频率和3.3V逻辑电源下运行。
小e1智能硬件开发平台是易通星云旗下第一款物联网智能硬件开发平台,也是国内率先支持微信语音控制的智能硬件平台。现提供20块免费的该板卡供大家申请,快来看看吧!
随着8月份举行的全国大学生电子设计大赛日益临近,广大参赛者对大赛相关资料的需求也是日益迫切。作为国内知名的电子技术分享网站——爱板网已在爱板网论坛开通“2017全国大学生电子设计大赛资料专区”,热烈欢迎大家在此专区踊跃分享与大赛相关的资料和经验,作为活动的发起与组织者爱板网将给予每位发帖者相应的奖励。多重好礼在等着您哦!
本视频教程将从如何使用电源组件实现前端和负载点的功能,利用优化的模块实现电源转换功能;电源组件设计方法的优势;等方面入手,教你如何快速掌握高性能电源设计技巧。
新注册用户在Mouser原价购买树莓派TFT 2.2 HAT Mini Kit开发板,参加本活动即可享返京东券福利,最低返100元。参加的人数越多,返现额度越高哦!
Powered by Discuz!51单片机驱动16*16点阵显示生日快乐程序
11:05:23&&&来源:51hei &&
自己亲手做的一个点阵屏 仿真+实物,&送给女朋友的生日礼物&单片机+液晶显示&带仿真文件
妞都狠喜欢这个了,显示生日快乐4个字然后还有心型,还有i love you,全部源码和仿真文件的下载地址是:/bbs/dpj-18851-1.html
&下面是部分源码预览:
#define& din& P3_2
#define& load& P3_3
#define& clk& P3_4
#define uchar unsigned char&
#define uint& unsigned int
unsigned char code dispcode[]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b,0x01};
uchar buf[]={0,0,0,0,0,0,0,0};
SYSTEMTIME& time1;
unsigned char code tab1[]={
&&& 0x0F,0x00,0x1F,0x80,0x3F,0xC0,0x7F,0xE0,
&&&&&&&&& 0x7F,0xF0,0x7F,0xF8,0x3F,0xFC,0x1F,0xFE,
&&&&&&&&& 0x1F,0xFE,0x3F,0xFC,0x7F,0xF8,0x7F,0xF0,
&&&&&&&&& 0x7F,0xE0,0x3F,0xC0,0x1F,0x80,0x0F,0x00,//心型图
&&&&&&&0x00,0x80,0x01,0x02,0x06,0x02,0x78,0x82,
&&&&&&&0x08,0x82,0x08,0x82,0x08,0x82,0x08,0x82,
&&&&&&&0xFF,0xFE,0x48,0x82,0x08,0x82,0x08,0x82,
&&&&&&&0x19,0x82,0x08,0x86,0x00,0x02,0x00,0x00,/*"生",2*/
&&&&&&&0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xFC,
&&&&&&&0x42,0x08,0x42,0x08,0x42,0x08,0x42,0x08,
&&&&&&&0x42,0x08,0x42,0x08,0x42,0x08,0x7F,0xFC,
&&&&&&&0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"日",3*/
&&&&&&&0x0E,0x00,0x00,0x00,0xFF,0xFF,0x10,0x00,
&&&&&&&0x0D,0x01,0x11,0x02,0x11,0x0C,0x11,0x70,
&&&&&&&0xFF,0x80,0x11,0x60,0x11,0x10,0x11,0x0C,
&&&&&&&0x1F,0x06,0x01,0x03,0x01,0x02,0x00,0x00,/*"快",4*/
&&&&&&&0x00,0x00,0x00,0x04,0x02,0x18,0x3F,0x30,
&&&&&&&0x22,0xE0,0x22,0x48,0x22,0x04,0x62,0x02,
&&&&&&&0x5F,0xFC,0x42,0x00,0xC2,0x00,0xC2,0x40,
&&&&&&&0x42,0x30,0x02,0x1C,0x00,0x08,0x00,0x00,/*"乐",5*/
&&&&&&&&&&&& 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
&&&&&&&&&&&& 0x00,0x00,0x00,0x00,0x3F,0x8C,0x7F,0xDE,
&&&&&&&&&&&& 0x7F,0xDE,0x3F,0x8C,0x00,0x00,0x00,0x00,
&&&&&&&&&&&& 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//!
&&&&&&&&&&&& 0x00,0x00,0x42,0xFE,0x42,0x02,0x7E,0x00,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 0x42,0xFE,0x42,0x82,0x00,0xFE,0x00,0x00,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 0x00,0xFC,0x00,0x02,0x7E,0xFC,0x02,0x00,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 0x02,0xFE,0x02,0x92,0x7E,0x92,0x00,0x00,//I LOVE U
&&&&&&&&&&&& 0xE0,0x07,0x8F,0xF1,0x98,0x19,0x30,0x0C,
&&&&&&&&&&&&&&&&&&& 0x64,0x46,0x48,0x22,0x44,0x12,0x40,0x12,
&&&&&&&&&&&&&&&&&&& 0x40,0x12,0x44,0x12,0x48,0x22,0x64,0x46,
&&&&&&&&&&&&&&&&&&& 0x30,0x0C,0x98,0x19,0x8F,0xF1,0xE0,0x07,//笑脸
unsigned char code tab2[]={ 0x0f,0x0e,0x0d,0x0c,0x0b,0x0a,0x09,0x08,
&&&&&&&&& 0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00};
uchar code tab3[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,0x03,0x06,
&&&&&& 0x0c,0x18,0x30,0x60,0xe0,0x70,0x38,0x1c,0x0e,0x07,
&&&&&& 0x0f,0x1f,0x3e,0x7c,0xf8,0xfc,0x7e,0x3f,0x7f,0xfe,
&&&&&& 0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x3f,
&&&&&& 0x9f,0xcf,0xe7,0xf3,0xf9,0xfc,0xf8,0xf1,0xe3,0xc7,
&&&&&& 0x8f,0x1f,0x0f,0x87,0xc3,0xe1,0xf0,0xe0,0xc1,0x83,
&&&&&& 0x07,0x03,0x81,0xc0,0x80,0x01,0x00,
&&&&&& 0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00,0x01,0x03,
&&&&&& 0x07,0x0f,0x1f,0x3f,0x7f,0xff,0xe7,0xc3,0x81,0x00,
&&&&&& 0x81,0xc3,0xe7,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,
&&&&&& 0xbf,0x7f,0x7e,0x7d,0x7b,0x77,0x6f,0x5f,0x3f,0x3e,
&&&&&& 0x3d,0x3b,0x37,0x2f,0x1f,0x1e,0x1d,0x1b,0x17,0x0f,
&&&&&& 0x0e,0x0d,0x0b,0x07,0x06,0x05,0x03,0x02,0x01,0x00,
&&&&&& 0x55,0xaa,0x55,0xaa,0x00,0xff,0x00,0xff,0x00,0xff,};
sbit KAI=P1^4;
sbit KAI2=P1^5;
void delay(uint time);
&uint j=0,q=0;
&& uchar r,t=0,num=0;
void csh()
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
51单片机相关资源
16*16点阵相关资源
生日快乐程序相关资源
编辑:什么鱼
本文引用地址:
大学堂最新课程
本周热门资源推荐
EEWORLD独家

我要回帖

更多关于 树莓派3 io口 的文章

 

随机推荐