初始化端口 设定扫描时间 拉幕时序清0 取列扫描地址 取行数据地址 数据输出 Yes 幕次数计满? No 幕次数加1 送新的行码地址 四、设计调试过程
将电路按原理图连接好之后,把汇编程序编译产生的十六进制文件下载到单片机内。第一次做时是在实验箱上直接连接硬件电路,可是由于没有74LS245双向总线收发器,所以在LED点阵和单片机I/O口之间就直接跳线连接了,因此没有将电平上拉,结果在实验箱上的LED显示屏无法显示单片机输出的结果,所有的LED灯都不亮。看来直接跳线时单片机I/O口输出的信号不足以驱动8乘8点阵工作。由于硬件条件的各种限制,因此本小组考虑改用软件仿真的方法来实现电路的设计与调试。
在PC机上运行Proteus软件,将电路原理图中的元件找出并相应地连接好线;在Keil汇编软件中输入设计的程序,编译通过后生成十六进制文件,并再把该文件下载到虚拟的AT89C51单片机内。因为单片机的RST引脚经电容接到了Vcc电源上,同时并联接地,所以系统可以上电后自动执行一次复位操作。仿真开始。此时可能会看到LED点阵中有字显示的地方(前景)灯是灭的,无字显示的地方(背景)灯是亮的,这种状态叫做“阴文”显示状
6
态。产生这种显示的原因是因为点阵的列码扫描信号线A~H与单片机的P3.0~P3.7口相应的顺序接反了,把对应的接线顺序倒过来,即可看到正确的“阳文”方式显示出的数字。
此显示系统最终实现了将数字从0到9向左拉幕显示的功能。部分显示效果如图。
五、源程序代码
R_CNT EQU 31H ;列码R_NCT=31H单元 NUMB EQU 32H ;行码NUMB=32H单元
TCOUNT EQU 33H ;拉幕计数值TCOUNT=33H单元 ORG 00H ;程序起始地址 LJMP START
ORG 0BH ;中断入口地址 LJMP INT_T0
ORG 30H ;子程序入口地址 START: ;主程序开始
MOV R0, #00H ;每列的行码起始序号置0
MOV R_CNT, #00H ;列:初值00送到31H单元 MOV NUMB, #00H ;行:初值00送到32H单元 MOV TCOUNT, #00H ;计数单元初值置0
MOV TMOD, #01H ;计数定时器选用16位的计数器,工作在方式1 MOV TH0, #(65536-5000)/256 ;定时5ms。定时器高位初值为236 MOV TL0, #(65536-5000) MOD 256 ;定时器低位初值为120 SETB TR0 ;启动C/T的定时器T0 MOV IE, #82H ;CPU开中断 SJMP $ ;中断等待 INT_T0:
MOV TH0, #(65536-5000)/256 ;定时5ms,设置定时器T0高位初值为236
MOV TL0, #(65536-5000)/256 ; 定时器T0低位初值为120 MOV DPTR, #TAB ;读列码表首地址,放入DPTR MOV A, R_CNT ;读列码偏移地址,放入A中
MOVC A, @A+DPTR ;基址变址寻址将寻到的列码数据放入A中 MOV P3,A ;将列码数据送P3口输出 MOV DPTR, #NUB ;装入显示数据的地址 MOV A, NUMB ;显示幕次的偏移地址
7
MOVC A, @A+DPTR ;寻到数据的行码地址 MOV P0, A ;将该地址值输出 INC NUMB ;行码地址加1 NEXT1: INC R_CNT ;扫描列码地址加1 MOV A, R_CNT ;把列地址放入A中 CJNE A, #8, NEXT2 ;A不等于8,转子程序NEXT2,否则往下执行 MOV R_CNT, #00H ;就把列码置0
MOV NUMB, R0 ;行码地址送存储单元格中 NEXT2:
INC TCOUNT ;拉幕计数序号加1 MOV A, TCOUNT ;将幕次序号送A中
CJNE A, #40, NEXT4 ;此序号不等于40转Next4,否则往下执行 MOV TCOUNT, #00H ;把拉幕时序归0 INC R0 ;行码起始地址加1
CJNE R0, #88, NEXT3 ;行码自加次数不满11字符×8行/字符=88行就转Next3
MOV R0, #00H ;不然就把行码置0 NEXT3:
MOV NUMB, R0 ;送新的一幕行码起始位给R0 NEXT4:
RETI ;中断返回 TAB: ;列码码表
DB 0FEH, 0FDH, 0FBH, 0F7H, 0EFH, 0DFH, 0BFH, 7FH ;列扫描从右向左 NUB: ;行码码表,字符数据
DB 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ;NULL DB 00H, 00H, 3EH, 41H, 41H, 41H, 3EH, 00H ; 0 DB 00H, 00H, 00H, 00H, 21H, 7FH, 01H, 00H ; 1 DB 00H, 00H, 27H, 45H, 45H, 45H, 39H, 00H ; 2 DB 00H, 00H, 22H, 49H, 49H, 49H, 36H, 00H ; 3 DB 00H, 00H, 0CH, 14H, 24H, 7FH, 04H, 00H ; 4 DB 00H, 00H, 72H, 51H, 51H, 51H, 4EH, 00H ; 5 DB 00H, 00H, 3EH, 49H, 49H, 49H, 26H, 00H ; 6 DB 00H, 00H, 40H, 40H, 40H, 4FH, 70H, 00H ; 7 DB 00H, 00H, 36H, 49H, 49H, 49H, 36H, 00H ; 8 DB 00H, 00H, 32H, 49H, 49H, 49H, 3EH, 00H ; 9 DB 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ;NULL END ;结束汇编
六、收获体会
在本项目完成的过程中,我们小组遇到了不少困难,不过基本都能顺利
8
解决。在全程设计制作的过程中学到了很多东西,对汇编语言有了更深刻的了解。有一些问题比较值得注意,比如在作品制作的初期,当时我们还不了解电路中所用芯片的要求与实验箱上的硬件要求是否匹配,后来发现在实验箱上没有所用到的双向总线收发器芯片,导致设计出的电路无法在实验箱上进行硬件仿真测试;在软件平台上连线时,由于不知道8乘8 LED显示屏的引脚结构而盲目接线,使显示出的实验结果和预期的不一样。于是重新连线后解决了这个问题。
在做完设计之后,仔细回想这几天来的收获,和同学们互相帮助,共同进步,也复习了一学期来学过的一些知识。还有,学会了处理问题的方法,以及更多的耐心和学习的能力。
七、参考文献
? 《单片机原理及接口技术》,高等教育出版社出版,李全钊、迟荣强 等 编
著。
? 《Proteus教程——电子线路设计、制板与仿真》,清华大学出版社出版,
朱清慧、张凤蕊、翟天嵩、王志奎 编著。 ? 《基于Proteus的80C51单片机实例教程》,电子工业出版社出版,李学
礼 主编。
? 《51系列单片机应用与实践教程》,北京航空航天大学出版社出版,周向
红 主编。
? 《单片机应用及技术》,电子工业出版社
9