好久好久没有写博客了~唉~最近弄得东西都是实物没什么研究可写,全部就是调试啊调试啊~还是写一点东西吧。
最近做了一个基于51外部扩展RAM的小计算器。
用的是标准的总线结构,锁存器用的74L373,RAM用的是6264,液晶是1602,使能用74LS00来选择。最后用7407作为了
驱动。
本来他们公司给的代码说的是C51,实际上核心的确是C,不过LCD和键盘用的都是汇编。由于正在略微研究下外部扩展就拿来做出来顺便把代码都改成C的。LCD的驱动完全是总线结构,根据硬件连接来写代码。下面把LCD的代码汇编和C都放上来
我把前面汇编的注释掉了~
详细看代码就可以了,其中汇编的关键在MOVX的使用上,时序图可以查的到,可以研究一下~其中把LCD的地址当做寄存器来看待
每次先选好使用再给数据,就可行了~
主要说C
首先说明~C语言是我从以前的非总线式结构里面改写的。因此有些函数没有用到。
C语言的关键在这里就是
#define LCMDW XBYTE[0x8001] // 数据口
#define LCMCW XBYTE[0x8000] // 命令
#define LCMBY XBYTE[0x8002] //忙检测
XBYTE是在absacc.h库里的一个定义地址的工具
其中有~#define XBYTE ((unsigned char volatile xdata *) 0)
其中根据硬件连接高2位的使能打开正是80H的地址,低2位的地址根据功能(A0,A1)定义不同的地址
然后在输出的时候协商
LCMDW=*****;就可以实现MOVX的功能了,产生外部存储的时序来啦~
液晶怎么使用就看数据手册吧,1602的手册可是很全很很全,网上的例子更是很多很多(把上面代码稍微改动就可以直接使用lcd了哈)
接下来给出SAMPLE里我一点没动的核心,计算器的算法实现
这个由于里面的注释很详细,我也稍微加了一两句,就不做解释了,懒人~不过其中有个设定从右侧开始的。。我设定竟然不好用
当然了,从右侧自然好看~从左侧是可以用的呵呵(我已经写在注释里面啦~)。很怀疑软件有点不太支持哈~
最后是键盘的扫描,对于这个东西,用汇编实在是蛮痛苦的。呵呵~不过就像学长说过,用习惯了都是一样的!
同样前面的汇编注释掉了
键盘的扫描实现~没有用上拉下拉电阻~建议使用上拉下拉的电阻。做实物时总是不一样的,比如P0口总线可以不上拉
不过事实说,自己做的时候不上拉是很不好用的~没办法,自己做的工艺太差啦。
好了~大概就是这么多。计划下一个是以前的一个小超声波东东。串口只能再等等啦,虽然很是重要的东西。
(*^__^*) 嘻嘻……