单片机综合实验 - 04 | 键盘、数码管与点阵管实验

一、实验目的和任务

1、掌握80C51单片机矩阵键盘的构成原理和软件编程。

2、掌握80C51单片机数码管动态显示原理和编程。

3、掌握80C51单片机LED点阵的构成原理和软件编程。

二、实验原理简介

ZSC-1实验箱为MCU1配置了2*8矩阵键盘、8位LED数码管、8*8LED点阵管等人机对话设备,相关电路如下图所示。为提高口线利用率,单片机P0口分时用作矩阵键盘的行扫描口、数码管的段码口以及点阵管的列驱动口,P2.2、P2.1、P2.0与74HC138译码器及2片74HC240反相驱动器相配合,用作数码管的位码口和点阵管的行驱动口。

P3.4、P3.5用于读取矩阵键盘的列状态,P2.3、P4.4的作用为:P2.3=1时,数码管和点阵管均关闭显示,P2.3=0而P4.4=1或0时,数码管或点阵管开通显示。

三、实验内容和步骤

1、在8个数码上顺序显示0-7八个数字。程序代码如下所示:

#include <reg52.h>  

unsigned lettern[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; 

void delay(int n)
{
	int i;
	int j;
	for(i=0; i<n; i++)
		for(j=700; j>=0; j--);
}

void display(unsigned char *dis,unsigned char n) 
{   
  unsigned char i,x;  
  for (i=0;i<n;i++)  
  { 
    P2=i;   
    x=*dis;   
    dis++;   
    P0=~lettern[x];               
    delay(500);  
  } 
}  

void main(void) 
{   
  unsigned char  dis[8]={0,1,2,3,4,5,6,7};  
  while(1)  
  {   
    display(dis,8);  
  }    
} 

2、用8*8LED点阵循环显示0-9。程序代码如下所示:

#include <reg52.h> 

sfr P4 = 0xC0; 
sfr P4SW = 0xBB; 
sbit P44=P4^4;  
unsigned char code led88n[16][8]= 
{  
	{0x00,0x18,0x24,0x24,0x24,0x24,0x18,0x00}, //'0' 
	{0x00,0x08,0x18,0x08,0x08,0x08,0x1C,0x00}, //'1'  
	{0x00,0x18,0x24,0x04,0x08,0x10,0x3C,0x00}, //'2' 
	{0x00,0x3C,0x08,0x10,0x08,0x04,0x24,0x18}, //'3' 
	{0x00,0x08,0x18,0x28,0x28,0x3C,0x08,0x08}, //'4' 
	{0x00,0x3C,0x20,0x38,0x04,0x24,0x18,0x00}, //'5' 
	{0x00,0x18,0x20,0x38,0x24,0x24,0x18,0x00}, //'6' 
	{0x00,0x3C,0x04,0x08,0x10,0x10,0x10,0x00}, //'7' 
	{0x00,0x18,0x24,0x24,0x18,0x24,0x24,0x18}, //'8' 
	{0x00,0x18,0x24,0x24,0x1C,0x04,0x24,0x18}, //'9' 
	{0x0C,0x12,0x12,0x12,0x1E,0x12,0x12,0x00}, //'A' 
	{0x0E,0x09,0x09,0x0E,0x09,0x09,0x09,0x0E}, //'B' 
	{0x00,0x1C,0x20,0x20,0x20,0x20,0x1C,0x00}, //'C' 
	{0x0E,0x1C,0x12,0x12,0x12,0x12,0x1C,0x00}, //'D' 
	{0x00,0x1E,0x10,0x1E,0x10,0x10,0x1E,0x00}, //'E' 
	{0x00,0x1E,0x10,0x10,0x1E,0x10,0x10,0x00}, //'F' 
};  

void delay(int n)
{
	int i;
	int j;
	for(i=0; i<n; i++)
		for(j=700; j>=0; j--);
}

void display88(unsigned char *chs)  //显示8*8LED点阵 
{   
	unsigned char i;  
	P44=0;   
	for(i=0;i<8;i++)  
	{   
		P0=~chs[i];             //每行值   
		P2=i;           //第几行   
		delay( 1 );   
		P2=0xff;  
	}   
	P44=1; 
}  

void main(void) 
{   
	unsigned char  dis[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};  
	char i; 
	unsigned int j;  
	P4SW|=0x10;         //将P44设为IO  
	while(1)  
	{   
		for(i=0;i<16;i++)    
			for(j=0;j<100;j++)     
		        display88(led88n[dis[i]]);  
  }  
}  

3、从矩阵键盘获得按键值,对0-9的值同时用数码管和LED点阵进行显示。

#include <reg52.h>     

sbit P34=P3^4;     
sbit P35=P3^5;     
sfr P4 = 0xC0;     
sfr P4SW = 0xBB;  
sbit P44=P4^4;   
unsigned lettern[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; 
unsigned char code led88n[16][8]= 
{  
	{0x00,0x18,0x24,0x24,0x24,0x24,0x18,0x00}, //'0' 
	{0x00,0x08,0x18,0x08,0x08,0x08,0x1C,0x00}, //'1'  
	{0x00,0x18,0x24,0x04,0x08,0x10,0x3C,0x00}, //'2' 
	{0x00,0x3C,0x08,0x10,0x08,0x04,0x24,0x18}, //'3' 
	{0x00,0x08,0x18,0x28,0x28,0x3C,0x08,0x08}, //'4' 
	{0x00,0x3C,0x20,0x38,0x04,0x24,0x18,0x00}, //'5' 
	{0x00,0x18,0x20,0x38,0x24,0x24,0x18,0x00}, //'6' 
	{0x00,0x3C,0x04,0x08,0x10,0x10,0x10,0x00}, //'7' 
	{0x00,0x18,0x24,0x24,0x18,0x24,0x24,0x18}, //'8' 
	{0x00,0x18,0x24,0x24,0x1C,0x04,0x24,0x18}, //'9' 
	{0x0C,0x12,0x12,0x12,0x1E,0x12,0x12,0x00}, //'A' 
	{0x0E,0x09,0x09,0x0E,0x09,0x09,0x09,0x0E}, //'B' 
	{0x00,0x1C,0x20,0x20,0x20,0x20,0x1C,0x00}, //'C' 
	{0x0E,0x1C,0x12,0x12,0x12,0x12,0x1C,0x00}, //'D' 
	{0x00,0x1E,0x10,0x1E,0x10,0x10,0x1E,0x00}, //'E' 
	{0x00,0x1E,0x10,0x10,0x1E,0x10,0x10,0x00}, //'F'
};    

void delay(int n)  
{   int i;   
    int  j;   
    for(i=0;i<n;i++)     
      for(j=700;j>=0;j--);   
}

unsigned char getkey(void)
{
	P0 = 0x00;
	if(P34 == 1 && P35 == 1)
		return 0xFF;
	delay(10);
	
	P0 = 0xfe;
	if(P35 == 0)	return 0;	// K0
	if(P34 == 0)	return 8;	// K8
	
	P0 = 0xfd;
	if(P35 == 0)	return 1;	// K1
	if(P34 == 0)	return 9;	// K9
	
	P0 = 0xfb;
	if(P35 == 0)	return 2;	// K2
	if(P34 == 0)	return 10;	// KEYESC
	
	P0 = 0xf7;
	if(P35 == 0)	return 3;	// K3
	if(P34 == 0)	return 11;	// KEYENTER
	
	P0 = 0xef;
	if(P35 == 0)	return 4;	// K4
	if(P34 == 0)	return 0xF1;// KEYF1

	P0 = 0xdf;
	if(P35 == 0)	return 5;	// K5
	if(P34 == 0)	return 0xF2;// KEYF2

	P0 = 0xbf;
	if(P35 == 0)	return 6;	// K6
	if(P34 == 0)	return 0xF3;// KEYF3

	P0 = 0x7f;
	if(P35 == 0)	return 7;	// K7
	if(P34 == 0)	return 0xF4;// KEYF4

	return 0xFF;
}

void display88(unsigned char *chs)  //显示8*8LED点阵     
{          
  unsigned char i;         
  P44=0;          
  for(i=0;i<8;i++)     
  {    
    P0=~chs[i];     //每行值    
    P2=i;           //第几行    
    delay(1);    
    P2=0xff;   
  }   P44=1;   
}       
  
void main(void)  
{   
  unsigned char ch1,ch=0;   
  unsigned char x[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};   
  P4SW|=0x10;         //将P44设为IO   
  while(1)   
  {    
    ch1=getkey();    
    if(ch1<10) ch=ch1;    
    if(ch<10)    
    {     
      display(&x[ch],1);     
      display88(led88n[ch]);   
     }      
   }   
} 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式逍遥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值