实验二 开关控制LED数码管实验
一、实验目的:
1.通过AT89C51读入4位开关K1、K2、K3、K4的输入状态,并按照二进制编码关系0-F输出到数码管显示。(如K4K3K2K1全部按下,则显示F;若只有K2按下,则显示2。)
2.掌握LED数码管的静态显示。
3.掌握I/O口的控制方法。
二、PROTEUS电路设计:
三、实验仪器和设备
PC机、PROTEUS软件或W-A-51综合开发学习板
四、源程序设计:
根据电路图自行编写并调试。
程序:
MAIN: MOV A,P2
CPL A
MOV DPTR,#TAB
MOVC A,@A+DPTR
ANL A,#0FH
MOV P0,A
TAB:
DB 3FH,06H,5BH,4FH,66H
DB 6DH,7DH,07H,7FH,6FH
RET
END
第二篇:实验报告——LED显示控制
实验一 LED显示控制
一、硬件介绍
1) C28X芯片提供了56个多功能引脚,用户可以将这些引脚作为片内外设的输入输出引脚,当不使用片内外设时,也可以将他们作为数字I/O口。本实验是将其用作GPIO口,如
图1所示。
图1 GPIO口应用
2)74HC164是一个8位的串并行数据转换的芯片,其时序图如图2所示。
图2 74164工作时序图
由图2知,输入端A和B相与是74HC164的输出,若输入信号只有一个(A端),则可以将其中一个输入端置1(B端),则可将输入的串行信号(A端)转化成并行输出(QA--QH)。
CLEAR是低电平有效的复位信号,即CLEAR为低电平时,输出端(QA—QH)全部置0,其为高电平时芯片可正常工作。
CLOCK是上升沿有效的时钟信号,即每来一个上升沿,输入的数据就会传一位,输出端QA会输出最新的输入信号,而QB则重复前一个时钟的QA,QC则重复前一个时钟的QB,……待满8个上升沿时,一个输入的8位串行数据就被转换成8位的并行数据输出。
3)8×8 LED的显示模块如图3所示。
图3 8×8 LED的显示模块
由图3可知,若要是LED正常发光,将LED的正向加高电平,负向加低电平即可。显示图像或字可通过动态扫描得到结果。
二、硬件连接
实验模块 控制模块
G LED DISPLAY A DSP SECTION
LED_A2(J32) SPISIMOA(J34)
LED_B2(J32) SPISOMIA(J34)
CLKIN2(J32) SPICLKA(J34)
/CLR2(J32) SPISTEA(J34)
LED_A1(J5) PWM7(J35)
LED_B1(J5) PWM8(J35)
/CLKIN1(J5) PWM9(J35)
/CLR1(J5) PWM10(J35)
除此之外,通过用跳线头短接J6(G LED DISPLAY )的VCC和U2VCC为LED DISPLAY 模块供电。用跳线头短接J61(A DSP SECTION)的GND和1DIR以及J62(A DSP SECTION)的GND和2DIR,将A DSP SECTION模块的缓冲设为输出。
三、软件设计
#include "DSP28_Device.h"
#include "DSP28_Globalprototypes.h"
#define DINA GpioDataRegs.GPFDAT.bit.GPIOF0
#define DINB GpioDataRegs.GPFDAT.bit.GPIOF1
#define CLK2 GpioDataRegs.GPFDAT.bit.GPIOF2
#define CLEAR2 GpioDataRegs.GPFDAT.bit.GPIOF3
#define DINC GpioDataRegs.GPBDAT.bit.GPIOB0
#define DIND GpioDataRegs.GPBDAT.bit.GPIOB1
#define CLK1 GpioDataRegs.GPBDAT.bit.GPIOB2
#define CLEAR1 GpioDataRegs.GPBDAT.bit.GPIOB3
// Prototype statements for functions found within this file.
// interrupt void ISRTimer2(void);
void delay_loop(void);
void Gpio_select(void);
void sendto1(unsigned char dab);
void sendto2(unsigned char dat);
void DELAY(void);
unsigned int var1 = 0;
unsigned int var2 = 0;
unsigned int var3 = 0;
unsigned char sendBdata[8]={0x0ff,0x0ff,0x0ff,0x0ff,0x0ff,0x0ff,0x0ff,0x0ff};
unsigned char dispdata[8]={0x7c,0x48,0x48,0xff,0x48,0x48,0x7c,0x00};//中
//unsigned char dispdata[4]={0x18,0x3c,0x7e,0xff};//candy
unsigned char dispbit[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xDf,0xBf,0x7f};
//unsigned char dispbit[4]={0xe7,0xc3,0x81,0x00};//candy
unsigned char kdab;
unsigned char kdat;
void main(void)
{
unsigned char i;
InitSysCtrl();
// Disable and clear all CPU interrupts:
DINT;
IER = 0x0000;
IFR = 0x0000;
// Initialize Pie Control Registers To Default State:
InitPieCtrl();
InitPieVectTable();
// Run GPIO test
var1= 0x0000; // sets GPIO Muxs as I/Os
var2= 0xFFFF; // sets GPIO DIR as outputs
var3= 0x0000; // sets the Input qualifier values
Gpio_select();
// Toggle I/Os using DATA register for ever
for(i=0;i<200;i++);
CLEAR2=0;
CLK2=1;
CLEAR1=0;
CLK1=1;
DINA=1;
DINB=1;
DINC=1;
DIND=1;
CLEAR2=1;
CLEAR1=1;
while(1)
{
sendto1(0x0ff);
//static/stria map
// for(i=0;i<8;i++)
// {
// sendto1(sendBdata[i]);
//GpioDataRegs.GPBDAT.all=0X00FF;
// sendto2(dispdata[i]);
// sendto1(dispbit[i]);
//GpioDataRegs.GPBDAT.all=dispbit[i];
// DELAY();
// DELAY();
// DELAY();
// DELAY();
// DELAY();
// DELAY();
// }
//static/stria map
//expanded window
sendto1(dispbit[0]); //发送列的第一个数据
sendto2(dispdata[0]); //发送行的第一个数据
DELAY();//延时
DELAY();
DELAY();
DELAY();
DELAY();
DELAY();
DELAY();
DELAY();
sendto1(dispbit[1]); //发送列的第二个数据
sendto2(dispdata[1]); //发送行的第二个数据
DELAY();
DELAY();
DELAY();
DELAY();
DELAY();
DELAY();
DELAY();
sendto1(dispbit[2]); //发送列的第三个数据
sendto2(dispdata[2]); //发送行的第三个数据
DELAY();
DELAY();
DELAY();
DELAY();
DELAY();
DELAY();
DELAY();
DELAY();
sendto1(dispbit[3]); //发送列的第四个数据
sendto2(dispdata[3]); //发送行的第四个数据
DELAY();
DELAY();
DELAY();
DELAY();
DELAY();
DELAY();
DELAY();
DELAY();
sendto1(dispbit[4]); //发送列的第五个数据
sendto2(dispdata[4]); //发送行的第五个数据
DELAY();
DELAY();
DELAY();
DELAY();
DELAY();
DELAY();
DELAY();
DELAY();
sendto1(dispbit[5]); //发送列的第六个数据
sendto2(dispdata[5]); //发送行的第六个数据
DELAY();
DELAY();
DELAY();
DELAY();
DELAY();
DELAY();
DELAY();
DELAY();
sendto1(dispbit[6]); //发送列的第七个数据
sendto2(dispdata[6]); //发送行的第七个数据
DELAY();
DELAY();
DELAY();
DELAY();
DELAY();
DELAY();
DELAY();
DELAY();
sendto1(dispbit[7]); //发送列的第八个数据
sendto2(dispdata[7]); //发送行的第八个数据
DELAY();
DELAY();
DELAY();
DELAY();
DELAY();
DELAY();
DELAY();
DELAY();
//expanded window
}
}
void Gpio_select(void)
{
EALLOW; //使CPU能对寄存器操作
GpioMuxRegs.GPBMUX.all=var1; //0x0000
GpioMuxRegs.GPBDIR.all=var2; // 0xFFFF,GPIO DIR select GPIOs as output
GpioMuxRegs.GPBQUAL.all=var3; //0x0000
GpioMuxRegs.GPFMUX.all=var1;
GpioMuxRegs.GPFDIR.all=var2; // GPIO DIR select GPIOs as output
EDIS; //停止CPU对寄存器的操作
}
void sendto1(unsigned char dab)
{
unsigned char i;
CLK1=0;
kdab=dab;
for(i=0;i<8;i++)
{
if((kdab&0x01) == 0x01)
{
DINC=1;
}else DINC = 0;
CLK1=1; //产生一个上升沿,使数据输入
CLK1=0;
kdab=kdab>>1;
}
}
void sendto2(unsigned char dat)
{
unsigned char i;
CLK2=0;
kdat=dat;
for(i=0;i<8;i++)
{
if((kdat & 0x01) == 0x01)
{
DINA=1;
}else DINA = 0;
CLK2=1;
CLK2=0;
kdat=kdat>>1;
}
}
void DELAY()
{
unsigned long k,j;
for(k=0;k<50;k++)
for(j=0;j<5000;j++);
}
//===========================================================================
// No more.
//===========================================================================