AT89C51按键控制点阵显示.docx
《AT89C51按键控制点阵显示.docx》由会员分享,可在线阅读,更多相关《AT89C51按键控制点阵显示.docx(12页珍藏版)》请在冰点文库上搜索。
AT89C51按键控制点阵显示
AT89C51的点阵显示的设计
1.1项目概述
当今社会是一个信息比较发达的时代,点阵的显示屏到处可见,如电梯、公交车、广告牌等等。
为此让大家进一步认识点阵的具体显示原理让大家对其有更深入的了解。
1.2项目要求
用AT89C51单片机控制点阵的显示效果,晶振采用12MHz。
简易模拟电梯的上下显示,以及汉字的简单变换。
(1)用点阵显示屏显示汉字
(2)按键控制字的流动
(3)用74HC15474HC959连接点阵显示屏
1.3系统设计
点阵显示屏主要用来显示信息。
用四个八乘八的点阵显示组合而成的。
1.3.1框图设计
1.3.2知识点
本项目用到一下知识
1、单片机复位电路工作原理及设计。
2、单片机晶振电路工作原理及设计。
3、按键的设计。
4、点阵的显示。
5、AT89C51的引脚。
6、单片机c语言及程序设计。
1.4硬件设计
本项目用AT89C51单片机的P1、P3传输信息,用P2口按键相连分别显示不同的效果。
1.4.1电路原理图
1.4.2元器件清单
名称
数量
名称
数量
单片机
1个
电阻
1个
晶振12MHz
1个
8*8点阵
4个
电容
2个
按键
4个
电解电容
1个
显示驱动
1.5软件设计
1.5.1程序流程图
该程序分为几个部分编写,一个是单片机的主程序,作用是是完成相应的功能,其他的为单个功能的子程序,流程图如下。
主程序里包括了延时、显示、和按键判断。
按下不同的按键显示不同的效果。
1.5.2 程序清单
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineblkn2
sbitEN74154=P1^7;//74154片选线
sbitST_CP74595=P1^6;//74595内部输出(从移位寄存器到输出锁存器)控制
sbitCLEAR74595=P1^5;//74595移位寄存器清零
sbitKey1=P2^0;
sbitKey2=P2^1;
sbitKey3=P2^2;
sbitKey4=P2^3;
uchardatadispram[32];//显示数据缓冲数组
ucharcount;
//顺向逐列取模
ucharcodeSJM[][32]={
{0x00,0x00,0x07,0xF0,0x08,0x08,0x10,0x04,
0x10,0x04,0x08,0x08,0x07,0xF0,0x00,0x00,/*"0",0*/
0x00,0x00,0x08,0x04,0x08,0x04,0x1F,0xFC,
0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00},/*"1",1*/
{0x00,0x00,0x07,0xF0,0x08,0x08,0x10,0x04,
0x10,0x04,0x08,0x08,0x07,0xF0,0x00,0x00,/*"0",0*/
0x00,0x00,0x0E,0x0C,0x10,0x14,0x10,0x24,
0x10,0x44,0x11,0x84,0x0E,0x0C,0x00,0x00},/*"2",1*/
{0x00,0x00,0x07,0xF0,0x08,0x08,0x10,0x04,
0x10,0x04,0x08,0x08,0x07,0xF0,0x00,0x00,/*"0",0*/
0x00,0x00,0x0C,0x18,0x10,0x04,0x11,0x04,
0x11,0x04,0x12,0x88,0x0C,0x70,0x00,0x00},/*"3",1*/
{0x00,0x00,0x07,0xF0,0x08,0x08,0x10,0x04,
0x10,0x04,0x08,0x08,0x07,0xF0,0x00,0x00,/*"0",0*/
0x00,0x00,0x00,0xE0,0x03,0x20,0x04,0x24,
0x08,0x24,0x1F,0xFC,0x00,0x24,0x00,0x00},/*"4",1*/
{0x00,0x00,0x07,0xF0,0x08,0x08,0x10,0x04,
0x10,0x04,0x08,0x08,0x07,0xF0,0x00,0x00,/*"0",0*/
0x00,0x00,0x1F,0x98,0x10,0x84,0x11,0x04,
0x11,0x04,0x10,0x88,0x10,0x70,0x00,0x00},/*"5",1*/
{0x00,0x00,0x07,0xF0,0x08,0x08,0x10,0x04,
0x10,0x04,0x08,0x08,0x07,0xF0,0x00,0x00,/*"0",0*/
0x00,0x00,0x07,0xF0,0x08,0x88,0x11,0x04,
0x11,0x04,0x18,0x88,0x00,0x70,0x00,0x00},/*"6",1*/
{0x00,0x00,0x07,0xF0,0x08,0x08,0x10,0x04,
0x10,0x04,0x08,0x08,0x07,0xF0,0x00,0x00,/*"0",0*/
0x00,0x00,0x1C,0x00,0x10,0x00,0x10,0xFC,
0x13,0x00,0x1C,0x00,0x10,0x00,0x00,0x00},/*"7",1*/
{0x00,0x00,0x07,0xF0,0x08,0x08,0x10,0x04,
0x10,0x04,0x08,0x08,0x07,0xF0,0x00,0x00,/*"0",0*/
0x00,0x00,0x0E,0x38,0x11,0x44,0x10,0x84,
0x10,0x84,0x11,0x44,0x0E,0x38,0x00,0x00},/*"8",1*/
};
//延时函数
voiddelay(unsignedintdt)
{
registerucharbt;
for(;dt;dt--)
for(bt=0;bt<250;bt++);
}
//向上移动函数
voidUp_Removeout_Word(uchar*LRp,ucharLRheard,ucharnumber)
{
registeruchari,j,k,l;
for(i=0;i{
for(j=0;j<2;j++)
for(k=0;k<8;k++)
{
for(l=0;l<16;l++)
{
dispram[l*2]=dispram[l*2]<<1|dispram[l*2+1]>>7;//通过左移或上右移把下一行给上一行
dispram[l*2+1]=dispram[l*2+1]<<1|LRp[(i+LRheard)*32+l*2+j]>>(7-k);//确定移几个数
}
delay(100);
}
delay(100);
}
}
//向下移动函数
voidDown_Removeout_Word(uchar*RRp,ucharRRheard,ucharnumber)
{
registeruchari,j,k,l;
for(i=0;i{
for(j=2;j>0;j--)
for(k=0;k<8;k++)
{
for(l=0;l<16;l++)
{
dispram[l*2+1]=dispram[l*2+1]>>1|dispram[l*2]<<7;//上半部分向上移一格
dispram[l*2]=dispram[l*2]>>1|RRp[(RRheard-i)*32+l*2+j-1]<<(7-k);
}
delay(100);
}
delay(100);
}
}
voidmain(void)
{
uchari;
SCON=0x00;//串行口以方式0工作,用作同步移位寄存器,波特率为fosc/12,禁止接收
TMOD=0x11;//定时器T0以方式1工作,由TR0控制启停
TH0=0xF8;//计数初值,定时2ms
TL0=0x30;
EA=1;
ET0=1;
//IE=0x82;//允许T0申请中断
TR0=1;//启动定时器T0
P1=0x3F;//EN74154=0,ST_CP74595=0,CLEAR74595=1
for(i=0;i<32;i++)
{
dispram[i]=SJM[3][i];
}
while
(1)
{
while(!
Key1)
{
Up_Removeout_Word(SJM,4,4);
}
while(!
Key2)
{
Down_Removeout_Word(SJM,6,7);
}
}
}
/**********************************************************************
函数名称:
TIME0(void)interrupt1using1
函数功能:
T0中断服务函数
**********************************************************************/
voidTIME0(void)interrupt1using1
{
registerunsignedcharj=blkn;
TH0=0xF8;//重装计数初值
TL0=0x30;
P1=count|0x20;
do{
j--;
SBUF=dispram[count*blkn+j];//开始发送数据
while(!
TI);//等待发送结束
TI=0;//清发送中断标志位
}while(j);
EN74154=1;//禁止行数据输出
ST_CP74595=1;//允许列数据输出
ST_CP74595=0;//禁止列数据输出
EN74154=0;//允许行数据输出
count++;
if(count>15)
count=0;
}
1.6 系统仿真及调试
单片机系统的硬件调试和软件是分不开的,许多硬件错误是在软件调试中被发现和纠正的。
但是通常是先排除明显的硬件故障以后,再和软件结合起来调试以进一步排除故障。
可见硬件的调试时基础,如果硬件调试不通过,软件调试则是无从做起。
硬件调试主要是把电路的各种参数调整到符合设计要求。
先排除硬件电路故障,包括设计性错误和工艺性故障。
一般原则是先静态,后动态。
硬件静态调试主要是检测电路是否有短路、断路、虚焊等,检测芯片引脚焊接是否有错位,数码段位是否焊接正确。
利用万用表或者逻辑测试仪器,检测电路中的各器件以及用脚连接是否正确,是否短路故障。
在通电前,一定要先检查电源电压的幅值和极性,否则很容易造成集成块的损坏。