实验目的:为了进一步掌握单片机中点阵的使用,理解单片机的工作原理,实现在单片机上实现显示
实验器材:keil、单片机(大板)、PZ-ISP普中自动下载软件。
实验原理:8*8点阵共由64个发光二极管组成,且每个发光二极管是放置在行线和列线上的交叉点上,当对应的某一行置高电平,某一列置低电平是,相应的二极管就会发亮。设计出汉字,将其转化为二进制进而转化为十六进制。
实验步骤:
1.在keil中新建工程,编写.c文件。
2.编译调试文件,修改错误及警告。
3.生成.hex文件。
4.在烧录软件中下载生成的.hex软件。
程序:
#include#includesbit SRCLK=P3^6;
sbit RCLK=P3^5;
sbit SER=P3^4;
//--定义要使用的IO口--//
#define COMMONPORTS P0
//--列选通控制--//
unsigned char code TAB[8] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
//--点阵字码--//
unsigned char code CHARCODE[6][8]=
{
0x00,0x08,0x12,0x01,0xFF,0x00,0x10,0x08, //小
0x00,0x2a,0x3c,0x2a,0x7f,0xa8,0x2c,0x02, //东
0x11,0xf2,0xbc,0xf2,0x1f,0x38,0x04,0xff,//别
0x38,0x28,0x38,0x23,0x55,0xd9,0x51,0x47,//吃
0x00,0x80,0x84,0x82,0xbf,0xc0,0x80,0x00,//了
{0xfb,0xfb,0xfb,0x00,0x00,0xfb,0xfb,0xfb} //叹号
};
void delay(unsigned int time){ unsigned int i,j; for(i=0;i>7;
dat<<=1;
SRCLK=1;
_nop_();
_nop_();
SRCLK=0;
}
RCLK=1;
_nop_();
_nop_();
RCLK=0;
}
/*******************************************************************************
* 函数名 : main
* 函数功能 : 主函数
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void main()
{
unsigned char tab, j;
unsigned int i;
while(1)
{
for(i= 0; i<50; i++ ) //两个字之间的扫描间隔时间
{
for(tab=0;tab<8;tab++)
{
Hc595SendByte(0x00); //消隐
COMMONPORTS = TAB[tab]; //输出字码
Hc595SendByte(CHARCODE[j][tab]);
delay(2);
}
}
j++;
if(j == 6)
{
j = 0;
}
}
}
结果:
录视频的时候,不知道为什么,是反的。
心塞。电脑调不了GIF方向,调了就只能保存图片格式。大家将就看吧,文字是 “小东别吃了!!”
调试与修改:
1.老师的源代码是显示四个字的。我把自己的字替换之后,发现即使不显示字,它会自动停留显示字的时间,并且,想要显示多于四个字就显示不出来。后来,经过我不懈的努力......我发现需要修改
//--点阵字码--//
unsigned char code CHARCODE[6][8]= 这里的数组,和
j++;
if(j == 6) 这里的循环体,你想显示几个字就改成几个字。
2.中英文标点!!不能用混了!好几次出现了这种错误怎么也找不到,他下面好像也没有提示,但是我发现如果他最后显示的时间很短,比如0.03,这个程序就有错误,如果是0.08,大概就没问题。(辛酸)