0

关于投票
51 4*4 键盘扫描 实验(六)

点击下载

前面介绍的基本都是IO口作为输出口的实验,这里介绍一个输入的实验,实现矩阵键盘扫描.详细介绍见附件.

平台:FDR51开发板

#include<AT89X52.H>
#include"led.h"                          //该头文件包含数码管驱动动
/******************************************************
                按键扫描函数
    若有按键按下:返回 键值(1-16);
    若没按键按下:返回  255              
********************************************************/
unsigned char getch (  )
{  
 unsigned char X="0",                    
 Y=0,
 Z=0,
 k=255;
 P2=0xff;
 P2=0x0f;       //先对P2置数  行扫描
 if(P2!=0x0f)     //判断是否有键按下
 { 
  //延时,软件去干扰
  if(P2!=0x0f)   //确认按键按下X = P2;
  {
   X=P2;          //保存行扫描时有键按下时状态
   P2=0xf0;       //列扫描
   Y=P2;          //保存列扫描时有键按下时状态
   Z=X|Y;         //取出键值
   switch ( Z )   //判断键值(那一个键按下)
   {
    case 0xee: k="0"; break; //对键值赋值
    case 0xde: k="1"; break;
    case 0xbe: k="2"; break;
    case 0x7e: k="3"; break;
    case 0xed: k="4"; break;
    case 0xdd: k="6"; break;
    case 0xbd: k="7"; break;
    case 0x7d: k="8"; break;
    case 0xeb: k="9"; break;
    case 0xdb: k="7"; break;  
    case 0xbb: k="10";break;
    case 0x7b: k="11";break;
    case 0xe7: k="12";break;
    case 0xd7: k="13";break;
    case 0xb7: k="14";break;
    case 0x77: k="15";break;
   }
   while(P2!=0xf0);
  }    
 }  
 return k;
}
void main()
{
 unsigned char temp="0",key=255;
 while(1)
 {
  key=getch();           //扫描
  if(key!=255)temp=key;  //有按键按下  
  led_display(temp);     //显示按键值
 }
}

系统分类: 单片机
用户分类: 51单片机专区
标签: 51单片机 矩阵键盘扫描
来源: 原创
发表评论 阅读全文(170) | 回复(0)

0

关于投票
51 数码管静态显示 实验(四)

pdf

这里通过51单片机控制数码管的静态显示.详细介绍见附件.

平台:FDR51开发板

#include
/********************数码管常量****************************/
unsigned char code table[]={0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80,0x90};           //LED段码
unsigned char code position[]={1,2,4,8}; //LED选位码 
/********************延时函数*************************
  延时t毫秒
******************************************************/

void  delay_ms(unsigned char t)
{
 unsigned char t2=126;
 while(t--)while(t2--); 
}

/**************  数码管显示函数  ************************************
参数: dat 待显示的数据     pos 显示该数据的位置
*************************************************************/

void led_display(unsigned char dat ,unsigned char pos)                 
{        
 unsigned int dat1=dat%10;  //一个数码管只能显示到9,此处用于防止溢出      
 P0=table[dat1]|position[pos];
 delay_ms(2); 

/****************************************************************
              主函数
    效果:依次点亮一个数码管,
******************************************************************/
void main()
{
 unsigned char t="0",
 time=90,
 position=0; 
 while(1)
 {
  t++;
  t=t%4;                //l令t为0~99;
  position++;
  position=position%4;
  time=255;
  while(time--)led_display(t,position);  
 }
}

系统分类: 单片机
用户分类: 51单片机专区
标签: 无标签
来源: 原创
发表评论 阅读全文(163) | 回复(0)

0

关于投票
51 按键输入 实验(三)

点击下载

这个实验是51io口作为基本输入口使用的第一个实验.详情见附件.

平台:FDR51开发板

代码:

#include <reg51.h>
sbit LED="P1"^0; //定义P1.0为LED接口
sbit KEY="P2"^0;
#define uchar unsigned char
/*------------------time ms延时函数-----------------*/
void delay_ms(unsigned int time)
{
 unsigned char tres;
 for(;time>0;time--)
 {
  tres=150;
  while(tres--);
 }
}
void main()
{
 bit off="1";//按键松开标记
 P2=0X01;
 while(1)//死循环,不停的点亮和熄灭LED
 {
  if(!KEY&&off)//判定进入获取键值的条件:key=0,off=1
  {
   delay_ms(10);//消除抖动
   if(!KEY) //确实有键按下
   {
    LED=!LED;//LED取反
    off=0; //按键按下标记
   }
  }
  if(KEY)off=1; //清除按下标记 
 }
}

系统分类: 单片机
用户分类: 51单片机专区
标签: 51单片机 io口输入 键盘扫描
来源: 原创
发表评论 阅读全文(162) | 回复(0)

0

关于投票
51 跑马灯 实验(二)

点击下载

这是一个典型的跑马灯实验,帮助初学者熟悉io口的基本使用.

平台:FDR51开发板

#include <reg51.h>    
#define LED P1  //宏定义,使用LED代替P1口(相当于LED=P1)
#define uchar unsigned char //用uchar代替unsigned char方便操作
#define uint unsigned int
/*------------------time ms延时函数-----------------*/
void delay_ms(uint time)
{
 uchar tres;
 for(;time>0;time--)
 {
  tres=150;
  while(tres--);
 }
}        
void main()
{  
 uchar t;
 LED=0X01;//P1=00000001B
  while(1)//死循环,不停的点亮和熄灭LED
 {  
  for(t=0;t<8;t++)
  {
   LED=~LED;//按位取反,点亮一个LED            
   delay_ms(100);//延时0.1s
   LED=~LED;//按位取反
   LED<<=1;//左移一位,点亮不同的LED 
  }
  LED=0X80;//P1=10000000B 
  for(t=0;t<8;t++)
  {
   LED=~LED;//按位取反,点亮一个LED             
   delay_ms(100);//延时0.1s
   LED=~LED;//按位取反
   LED>>=1;//右移一位,点亮不同的LED  
  }
  LED=0X01;//P1=00000001B
 }
}

系统分类: 单片机
用户分类: 51单片机专区
标签: 51单片机 io口使用 跑马灯
来源: 原创
发表评论 阅读全文(174) | 回复(0)

0

关于投票
51 IO口基本实验(一)

点击下载,点击下载

这是一个51IO口基本操作的实验,详细介绍见附件.

平台:FDR51开发板

#include
/*-------------------------------------------------------------------------------------------------------------------
第一行是一个"文件包含"处理。
所谓"文件包含"是指一个文件将另外一个文件的内容全部包含进来,所以这里的程序虽
然只有4 行,但C 编译器在处理的时候却要处理几十或几百行。这里程序中包含reg51.h
文件的目的是为了要使用P1 这符号即通知C 编译器,程序中所写的P1 是指80C51 单片机
的P1 端口而不是其它变量。
--------------------------------------------------------------------------------------------------------------------*/
sbit LED="P1"^0; //定义P1.0为LED接口
/*------------------time ms延时函数-----------------*/
void delay_ms(unsigned int time)
{
 unsigned char tres;
 for(;time>0;time--)
 {
  tres=150;
  while(tres--);
 }
}
void main()
{
 while(1)//死循环,不停的点亮和熄灭
 {
  LED=1; //熄灭LED
  delay_ms(500);//延时0.5s
  LED=0; //开启LED
  delay_ms(500);//延时0.5s
 }
}

系统分类: 单片机
用户分类: 51单片机专区
标签: 51单片机 io口基本使用 跑马灯
来源: 原创
发表评论 阅读全文(186) | 回复(2)
总共 , 当前 /