数码管和LED显示电路:
电路里,把数码管和LED都挂到外部内存地址,内存单元每个bit对应一个LED或者数码管的一个位段。
锁存器由74HC138译码器和74HC259锁存器实现:
file:///C:\DOCUME~1\c\LOCALS~1\Temp\msohtml1\01\clip_image002.jpg
1- 选通74HC138时,A15=1,A14=0;A[3,2,1]再确定选通哪一个74HC259 2- A[3,2,1]=000:选通LED 以下所有点都是A7=1发光,A7-0熄灭;空缺的地址在阅读反汇编代码过程再填上:
|
| 选通
74HC138
| 未用,xxxxxx都可,
以下是实测:
| 亮灭
| 选择
259位段
| 138译码
输出
| 未用
| 地址
| 备注
| 编号
| 功能
| A15
| A14
| A13-A8
| A7
| A6
| A5
| A4
| A3
| A2
| A1
| A0
|
|
|
|
| 1
| 1
| 11,1111
| 1/0
| 0
| 0
| 0
| 0
| 0
| 0
| X
|
| 未用
|
|
| 1
| 1
| 11,1111
| 1/0
| 1
| 0
| 0
| 0
| 0
| 0
| X
|
| Verify-红灯亮/灭
|
|
| 1
| 1
| 11,1111
| 1/0
| 0
| 1
| 0
| 0
| 0
| 0
| X
|
| Ready-绿灯亮/灭
|
|
| 1
| 1
| 11,1111
| 1/0
| 1
| 1
| 0
| 0
| 0
| 0
| X
|
| 未用
|
|
| 1
| 1
| 11,1111
| 1/0
| 0
| 0
| 1
| 0
| 0
| 0
| X
|
| Send按键LED亮/灭
|
|
| 1
| 1
| 11,1111
| 1/0
| 1
| 0
| 1
| 0
| 0
| 0
| X
|
| Down按键LED亮/灭
|
|
| 1
| 1
| 11,1111
| 1/0
| 0
| 1
| 1
| 0
| 0
| 0
| X
|
| Up按键LED亮/灭
|
|
| 1
| 1
| 11,1111
| 1/0
| 1
| 1
| 1
| 0
| 0
| 0
| X
|
| 未用
|
|
| 1
| 1
| XX,XXXX
| 1/0
| 0
| 0
| 0
| 1
| 0
| 0
| X
|
| 左边数码管段a亮/灭
|
|
| 1
| 1
| XX,XXXX
| 1/0
| 1
| 0
| 0
| 1
| 0
| 0
| X
|
| 左边数码管段b亮/灭
|
|
| 1
| 1
| XX,XXXX
| 1/0
| 0
| 1
| 0
| 1
| 0
| 0
| X
|
| 左边数码管段c亮/灭
|
|
| 1
| 1
| XX,XXXX
| 1/0
| 1
| 1
| 0
| 1
| 0
| 0
| X
|
| 左边数码管段d亮/灭
|
|
| 1
| 1
| XX,XXXX
| 1/0
| 0
| 0
| 1
| 1
| 0
| 0
| X
|
| 左边数码管段e亮/灭
|
|
| 1
| 1
| XX,XXXX
| 1/0
| 1
| 0
| 1
| 1
| 0
| 0
| X
|
| 左边数码管段f亮/灭
|
|
| 1
| 1
| XX,XXXX
| 1/0
| 0
| 1
| 1
| 1
| 0
| 0
| X
|
| 左边数码管段g亮/灭
|
|
| 1
| 1
| XX,XXXX
| 1/0
| 1
| 1
| 1
| 1
| 0
| 0
| X
|
| 左边数码管段dp亮/灭
|
|
| 1
| 1
| XX,XXXX
| 1/0
| 0
| 0
| 0
| 0
| 1
| 0
| X
|
| 右边数码管段a亮/灭
|
|
| 1
| 1
| XX,XXXX
| 1/0
| 1
| 0
| 0
| 0
| 1
| 0
| X
|
| 右边数码管段b亮/灭
|
|
| 1
| 1
| XX,XXXX
| 1/0
| 0
| 1
| 0
| 0
| 1
| 0
| X
|
| 右边数码管段c亮/灭
|
|
| 1
| 1
| XX,XXXX
| 1/0
| 1
| 1
| 0
| 0
| 1
| 0
| X
|
| 右边数码管段d亮/灭
|
|
| 1
| 1
| XX,XXXX
| 1/0
| 0
| 0
| 1
| 0
| 1
| 0
| X
|
| 右边数码管段e亮/灭
|
|
| 1
| 1
| XX,XXXX
| 1/0
| 1
| 0
| 1
| 0
| 1
| 0
| X
|
| 右边数码管段f亮/灭
|
|
| 1
| 1
| XX,XXXX
| 1/0
| 0
| 1
| 1
| 0
| 1
| 0
| X
|
| 右边数码管段g亮/灭
|
|
| 1
| 1
| XX,XXXX
| 1/0
| 1
| 1
| 1
| 0
| 1
| 0
| X
|
| 右边数码管段dp亮/灭
| 从这个表可以看出,数码管和LED输出可选的地址很多,但好在是落在只读ROM的地址范围(0x8),并且是只能写不能读的,所以只需要在代码里找到高于0x8000的写入操作,就可以判断为控制LED或数码管亮灭了。
根据74HC259的特性,只能逐bit写入,不能一次写入多个bit,所以正常人的做法会定义3个字节的输出缓冲区,每bit对应一个LED或者数码管位段;先输出显示内容到缓冲区,然后定时用一个循环体逐bit刷新输出到外部的锁存器
按键定义:
1- SEND——PE2 2- DOWN——PE1 3- UP——PE0
通信口定义:
1- RS232串口RXD——PD0 输入 2- RS232串口TXD——PD1 输出
存储器扩展定义:
1- PC口(PC0..7)——低8位总线地址,和8位数据口复用 2- PB口(PB0..7)——高8位总线地址 3- AS,R/W,E总线读写控制信号标准接法 4- RAM——32KB,芯片型号KS62256,地址范围0x0000-0x7FFF 5- ROM——32KB,芯片型号AM27C256,地址范围0x8000-0xFFFF
处理器主频:
1- 振荡器为8MHz,示波器实测也是8MHz 2- E输出信号实测为2MHz,根据手册描述是振荡器频率的1/4,正确
汇编、仿真工具:
选择了“THRSim11”
反汇编:
1- 安装ADA5.5; 2- 打开从ROM里读出的bin文件,设置好参数,MCU选择“Motorola 68HC11”,目标汇编器选择“Motorola FreeWareAssembler”——这是反复测试出来的,其他汇编器格式都无法在“THRSim11”里编译。 3- 点击“重新分析程序”,得到汇编代码 4- 把汇编代码复制到Ultraedit里,用列块模式,把代码前面的名称和地址删掉,得到纯净的汇编代码,另存为asm格式 5- 在“THRSim11”打开上面保存的asm,编译,成功后自动进入仿真状态并跳转到程序入口。 6- 点击运行,提示一堆错误,意思是往只读ROM地址里写数据,出错……明显是仿真器没有设置好,根据提示需要重新配置MCU 7- 点击View->memory->memory configuration,根据测绘电路图,填写RAM范围$0000至$7FFF,ROM范围$8000至$FFFF,如下图所示: file:///C:\DOCUME~1\c\LOCALS~1\Temp\msohtml1\01\clip_image004.jpg
8- 重新打开asm,编译后全速运行,有8*3=24处出错,都是提示非法写入只读ROM的,地址分别是: ff20 ff23 ff25 ff26 ff28 ff2a ff2c ff2e
ff11 ff13 ff15 ff17 ff19 ff1b ff1c ff1e
fe0d fe02 fe04 fe06 fe08 fe0a fe0c
很有规律,估计就是电路测绘时发现的LED及数码管写入地址了。
重新设置存储器映射,增加一个区域$FE00至$FFFF:
file:///C:\DOCUME~1\c\LOCALS~1\Temp\msohtml1\01\clip_image006.jpg
9- 重新打开asm,编译后全速运行,可以跑了 10- 把编译得到的S19文件转换为bin,二进制方式比较,结果完全一致。证明“ADA5.5”反汇编完全正确。 11- 所以阅读汇编代码直接用“ADA5.5”就可以了,里面有很多智能跳转、标签等功能,可以很方便浏览代码。 |