实验目的:
学会使用LED点阵,通过编程显示不同内容
实验器材:
Keil、protues
实验原理(给出硬件电路图):
实验步骤:
- 实验原理
1.1 8*8点阵
8*8点阵共由64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一行置1电平,某一列置0电平,则相应的二极管就亮;如要将第一个点点亮,则1脚接高电平a脚接低电平,则第一个点就亮了;
1.2 取模软件
1.2.1新建图像
1.2.2 画汉字
1.2.3生成字模
1.3 74LS245芯片
74LS245常用来驱动LED或者其他的设备,它是8路同相三态双向总线收发器,可双向传输数据。74LS245还具有双向三态功能,既可以输出,也可以输入数据。
1.4 关于8*8点阵需要注意的问题
判断按键按下操作。有时按下按键,点阵就显示一下,又灭了,这可能就是没有对按键按下进行判断。在使用按键时,只有当我们按下按键时才会把键值返回,在没按的期间,返回的值是初始化的值。也就是说,返回的键值没有保存下来,只会在你按下的时候显示一次键值,没按的时候显示的是初始的值。
程序代码及实验结果(含汇编语言代码和C语言代码):
#include <regx51.h>
unsigned int wei[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //扫描8位,八个数字分别对应着第一行、第二行....
unsigned int duan[2][8]={{0x00,0x00,0x3E,0x08,0x7F,0x14,0x22,0x41},//“天”的字模
{0x7E,0x08,0x08,0x5D,0x22,0x41,0x7F,0x08}};//“空”的字模
void delayms(unsigned int m) // 延时子程序
{
int i,j;
for(i=0;i<m; i++)
for(j=0; j<120; j++);
}
void main(void)
{
int i,j,k;
while(1)//死循环,让两个汉字循环出现
{ for(i=0;i<2;i++) //第一个循环是选择不同的汉字
{for(k=0;k<100;k++)//第二个循环是让汉字停留时间长一点
{
for(j=0; j<8; j++) //第三个循环是显示汉字
{
P0 = wei[j]; //先发送位码
P3 = duan[i][j]; //再发送断码
delayms(2);
P3=0x00;//给P3低电平,关闭LED灯
}
}
}
}
}
ORG 0000H
SJMP START
ORG 0030H
START:
MOV DPTR,#TAB ;给DPTR赋值汉字编码的表的首地址
MOV R2,#7FH ;R2=0111 1111,第一行给低电平,选择了第一行
;R3是显示不同的汉字
L0:MOV R3,#0
;R5是让汉字停留的时间长一点
L1:MOV R5,#100
;R4是让单个汉字显示
L2:MOV R4,#0
L3:MOV A,R3
ADD A,R4 ;A赋值为R3+R4
LCALL DIS ;调用LED对应的第N行编码,CALL跳转了之后可以返回到这个地方
L4:INC R4 ;R4+1
CJNE R4,#8,L3 ;若第一个汉字已经循环完,则可以顺序显示第二个汉字
;若第一个汉字还没显示完,则跳转到L3,继续显示第一个汉字
DJNZ R5,L2 ;重复询问第一个数组,使显示汉字能停一会
;R3加1次8即访问第二行数
MOV A,R3
ADD A,#8 ;从下一行第一个开始
MOV R3,A
CJNE R3,#16,L2 ;若R3不等于16,则表示第二个汉字没有访问完,跳转到L1
SJMP START
DIS:
MOVC A,@A+DPTR ;此时A表示表的地址,A=R3+R4
MOV P3,A ;将表的地址赋值给P3
MOV P0,R2 ;R2=7FH
MOV A,R2
RR A;右移7FH,依次得到0xbe,0xdf,0xef,0xf7,0xfb,0xfd,0xfe
MOV R2,A ;将右移得到的值赋值给R2
Delay:
MOV R7,#0FFH
D1:DJNZ R7,D1
MOV P3,#0
RET
TAB:
DB 00H,00H,3EH,08H,7FH,14H,22H,41H ;"天"的汉字编码
DB 08H,7FH,41H,22H,5DH,08H,08H,7EH ;“空”的汉字编码
END