16x162.docx
《16x162.docx》由会员分享,可在线阅读,更多相关《16x162.docx(14页珍藏版)》请在冰豆网上搜索。
![16x162.docx](https://file1.bdocx.com/fileroot1/2023-5/17/9d47c352-53b2-4eb2-8b8b-6704fda56c26/9d47c352-53b2-4eb2-8b8b-6704fda56c261.gif)
16x162
6uuuuuuuuuuuuuuuuuttrcccccccccccccccccccccccccccccccccccccccccccccccu
南京工程学院
课程设计任务书
课程名称单片机原理及应用A
院(系、部、中心)自动化学院
专业自动化(数控技术应用)
班级数控061
姓名吴胡(33)
起止日期2008.12.172008.12.21
指导教师孙来业
一设计任务
1.题目
16×16点阵显示器设计
2.要求
利用实验仪上的16x16LED点阵显示器,编写显示英文、汉字字符程序。
显示中文“南京工程学院”。
最好能移动显示。
二总体方案
16x16点阵需要32个驱动,分别为16个列驱动及16个行驱动。
每个行与每个列可以选中一个发光管,共有256个发光管,采用动态驱动方式。
每次显示一行后再显示下一行。
点阵图案按如下格式排列:
片选信号16X16CS占用0B000H地址开始的地址段,行低八位地址Hang2=0B002H,行高八位地址Hang1=0B003H,列低八位地址Lie2=0B000H,列高八位地址Lie1=0B003H。
整个程序用查表的方式完成。
这个表由“南京工程学院”六个字的代码组成。
每个字的代码由32个数字组成。
最终让“南京工程学院”六个字在点阵显示器上滚动左移。
三原理框图
如图:
程序流程图
YN
程序流程图
四系统模块详细设计与调试
1.模块设计
(1)列的高8位显示
K0:
MOVA,R5
MOVR0,A
MOVR1,#07FH
K1:
MOVDPTR,#LIE1
MOVA,R1
MOVX@DPTR,A
RRA
MOVR1,A
MOVDPTR,#LIE2
MOVA,#0FFH
MOVX@DPTR,A
MOVA,R0
MOVDPTR,#TAB
MOVCA,@A+DPTR
INCR0
MOVDPTR,#HANG2
MOVX@DPTR,A
CALLDELAY
MOVDPTR,#TAB
MOVA,R0
MOVCA,@A+DPTR
MOVDPTR,#HANG1
MOVX@DPTR,A
CALLDELAY
MOVDPTR,#HANG1
MOVA,#00H
MOVX@DPTR,A
MOVDPTR,#HANG2
MOVX@DPTR,A
INCR0
CJNER1,#07FH,K1
7FH为01111111B开列的最高位,使其可以显示。
再RR指令向右移动为10111111B,11011111B……只到11111110B,01111111B时结束。
在开一列时,同时在行的控制口输出相应的查表值。
这样逐行扫描。
这样一个字的左半部分就被扫描完了。
(2)列低8位显示
MOVR1,#07FH
K2:
MOVDPTR,#LIE2
MOVA,R1
MOVX@DPTR,A
RRA
MOVR1,A
MOVDPTR,#LIE1
MOVA,#0FFH
MOVX@DPTR,A
MOVA,R0
MOVDPTR,#TAB
MOVCA,@A+DPTR
INCR0
MOVDPTR,#HANG2
MOVX@DPTR,A
CALLDELAY
MOVA,R0
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVDPTR,#HANG1
MOVX@DPTR,A
CALLDELAY
MOVDPTR,#HANG1
MOVA,#00H
MOVX@DPTR,A
MOVDPTR,#HANG2
MOVX@DPTR,A
INCR0
CJNER1,#07FH,K2
同样的道理,7FH为01111111B开列的最高位,使其可以显示。
再RR指令向右移动为10111111B,11011111B……只到11111110B,01111111B时结束。
在开一列时,同时在行的控制口输出相应的查表值。
这样逐行扫描。
这样一个字的右半部分就被扫描完了。
这样一个字就被扫描完了。
(3)因为是字是被扫描的,所以显示的很快,无法看到清楚的字。
这时用循环,让这个字被扫描N次,就可以看清楚了。
(4)向左移动
INCR4
CJNER4,#02H,K0
INCR5
INCR5
CJNER5,#192,ZZ
SJMPNEXT
ZZ:
LJMPK
NEXT:
LJMPSTART
这里R5和R0用来指向代码表。
在每次显示完32个代码代表的字后,R5的值加2,指向下面第二个代码值。
这样在从头开始,执行K1,K2段。
把新的32个代码代表的字符显示出来。
这样,只到R5的值等于192(192=6*32)时停止,这样六个字就全都显示完了。
通过LJMPSTART指令又从头开始无限循环了。
2.调试
(1)出现的问题
a.用指令SJMP,CJNE。
程序很长,最后出现了“跳转出范围”的错误。
原来:
CJNER5,#192,K
SJMPSTART
改为:
CJNER5,#192,ZZ
SJMPNEXT
ZZ:
LJMPK
NEXT:
LJMPSTART
b.程序执行完6个字,“南京工程学院”后,会有一段乱码,大概一个字的位置空间。
发现,少个“南”字的代码。
要在6个字的后面再加上一个“南”字的代码。
c.在显示一个字时,总是有多余的部分出现。
因为在循环时,跳到下一列显示时,行的输出还在,这样就显示到下一列上了,所以看起来总有多余的部分。
措施:
在跳到下一列之前,把所有的行输出清零。
(2)结果
在显示器上,“南京工程学院”六个字滚动向左移动。
五设计总计
这次课程设计,相对其他组的课题比较简单。
其他组多说都用到中断和键盘程序等。
我们的课题主要是逻辑问题,只要把程序的逻辑关系搞好就可以了。
但我还是费了不少力。
开始时,我是做了一个字“南”,很容易就成功了。
但再继续往下做,把六个字都显示出来,发现程序太长了,因为每个字都写了一大段。
于是,就想到用循环来做。
在不经意间,发现只要把这六个字的代码写出来,不断调用就好了。
这样,比原来的程序简洁多了。
通过这次课程设计,我发现写程序的关键是流程,思路有了后,一切都会水到渠成。
六主要参考文献
《单片机原理及应用实验指导书》,屈波等编,2008年
《单片机原理及应用》,赵德安等编,机械工业出版社,2004
《单片机原理及应用》,雷晓平等编著,机械工业出版社,2007
七附件材料
1.硬件图
硬件图
2.程序清单及说明
LIE1EQU0B001H;列的高位
LIE2EQU0B000H;列的低位
HANG1EQU0B003H;行的高位
HANG2EQU0B002H;行的低位
ORG0000H
AJMPSTART
DELAY:
MOVR7,#0;延时子程序
DELAY1:
DJNZR7,DELAY1
RET
START:
MOVR5,#00H;R5和R0都是用来指向代码表的
K:
MOVR4,#00H;R4用来控制一个字被重复
MOVA,#0FFH扫描的次数。
以使字可以清楚地
MOVDPTR,#LIE1被看到
MOVX@DPTR,A
MOVDPTR,#LIE2
MOVX@DPTR,A
MOVA,#00H
MOVDPTR,#HANG1
MOVX@DPTR,A
MOVDPTR,#HANG2;清屏
MOVX@DPTR,A
K0:
MOVA,R5
MOVR0,A
MOVR1,#07FH
K1:
MOVDPTR,#LIE1;显示字的左半部分
MOVA,R1
MOVX@DPTR,A;控制高8列的开关
RRA
MOVR1,A
MOVDPTR,#LIE2;关掉低8列的显示,防止在低
MOVA,#0FFH8位上出现显示
MOVX@DPTR,A
MOVA,R0
MOVDPTR,#TAB
MOVCA,@A+DPTR;读查表指令
INCR0;指向下一个表值
MOVDPTR,#HANG2
MOVX@DPTR,A;显示代码值
CALLDELAY
MOVDPTR,#TAB
MOVA,R0
MOVCA,@A+DPTR;读查表指令
MOVDPTR,#HANG1
MOVX@DPTR,A;显示代码值
CALLDELAY
MOVDPTR,#HANG1;清除所有行的输出,防止
MOVA,#00H在开下一列时显示到下一列
MOVX@DPTR,A在屏幕上出现多余部分。
MOVDPTR,#HANG2
MOVX@DPTR,A
INCR0;指向下一个表值
CJNER1,#07FH,K1
MOVR1,#07FH
K2:
MOVDPTR,#LIE2;显示字的右半部分
MOVA,R1;开始时,R0的值已经加了
MOVX@DPTR,A16(相比在K1段中开始时)
RRA;其他的与K1段相似
MOVR1,A
MOVDPTR,#LIE1
MOVA,#0FFH
MOVX@DPTR,A
MOVA,R0
MOVDPTR,#TAB
MOVCA,@A+DPTR
INCR0
MOVDPTR,#HANG2
MOVX@DPTR,A
CALLDELAY
MOVA,R0
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVDPTR,#HANG1
MOVX@DPTR,A
CALLDELAY
MOVDPTR,#HANG1
MOVA,#00H
MOVX@DPTR,A
MOVDPTR,#HANG2
MOVX@DPTR,A
INCR0
CJNER1,#07FH,K2
INCR4
CJNER4,#02H,K0;让一个字被扫描2次
INCR5;用来指向代码表
INCR5
CJNER5,#192,ZZ;若R5的值小于192,就重复执行,
SJMPNEXT但每次开始时R5的值已经加2.
ZZ:
LJMPK以此来实现字的左移。
NEXT:
LJMPSTART;无限循环执行
;代码表
TAB:
DB000H,000H,0FFH,027H,000H,024H,090H,024H
DB090H,026H,090H,025H,090H,024H,0FEH,0FCH
DB090H,024H,090H,025H,090H,026H,092H,024H
DB001H,024H,0FEH,02FH,000H,024H,000H,000H;NAN
DB000H,000H,008H,020H,010H,020H,020H,020H
DB040H,020H,000H,02FH,002H,029H,001H,029H
DB0FEH,069H,000H,029H,000H,029H,060H02FH
DB020H,020H,010H,020H,008H,020H,000H,000H;JING
DB004H,000H,004H,000H,004H,010H,004H,010H
DB004H,010H,004H,010H,004H,010H,0FCH,01FH
DB004H,010H,004H,010H,004H,010H,004H,010H
DB004H,010H,004H,010H,004H,000H,004H,000H;GONG
DB000H,000H,080H,00AH,000H,013H,0FEH,03FH
DB000H,043H,080H,002H,002H,000H,022H,07DH
DB022H,045H,022H,045H,0FEH,045H,022H,045H
DB022H,045H,022H,07DH,002H,000H,000H,000H;CHENG
DB000H,000H,040H,008H,040H,010H,040H,054H
DB040H,034H,042H,014H,041H,054H,0FEH,034H
DB040H,015H,040H,016H,040H,034H,040H,050H
DB040H,018H,040H,010H,000H,000H,000H,000H;XUE
DB000H,000H,0FEH,07FH,000H,041H,000H,04BH
DB000H,054H,006H,020H,002H,012H,002H,02AH
DB006H,02AH,0F8H,02BH,000H,06BH,0f8H,02AH
DB006H,02AH,002H,022H,002H,030H,006H,020H;YUAN
DB000H,000H,0FFH,027H,000H,024H,090H,024H
DB090H,026H,090H,025H,090H,024H,0FEH,0FCH
DB090H,024H,090H,025H,090H,026H,092H,024H
DB001H,024H,0FEH,02FH,000H,024H,000H,000H;NAN
3.元器件清单
微型计算机一台
伟福Lab6000系列通用微控器实验系统
4.实物图片
“南”和“院”