这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 串口-继电器-矩阵键盘LCD显示

共1条 1/1 1 跳转至

串口-继电器-矩阵键盘LCD显示

菜鸟
2012-01-12 23:10:14     打赏

#include<reg52.h>
#include<intrins.h>

#define uchar unsigned char
#define uint  unsigned int
sbit beep = P1^0;
/********************************************************************
* 名称 : Com_Init()
* 功能 : 初始化串口程序,晶振24M, 波特率9600
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Com_Init(void)
{
     TMOD = 0x20;
     PCON = 0x80;
     SCON = 0x50;   
     TH1 = 0xf3; //
     TL1 = 0xf3; //
     TR1 = 1;   
}

/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main()
{
 uchar i = 0;
 uchar code Buffer[] = "Welcome To MY MCU World";  //所要发送的数据
 uchar *p;
 beep = 0;
 Com_Init();
 P2 = 0x00;
 p = Buffer;
 while(1)
 {
  
  SBUF = *p;
  while(!TI)                   //如果发送完毕,硬件会置位TI
  {
   _nop_(); 
  }
  p++;
  if(*p == '\0') break;  //在每个字符串的最后,会有一个'\0'
  TI = 0;                  //TI清零
 }
 while(1);
}


#include<reg52.h>
#include<intrins.h>

#define uchar unsigned char
#define uint  unsigned int
sbit beep = P1^0;
uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar LED_Buffer[8] = {0};      //从串口接收的数据

/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay_1ms(uint i)//1ms延时
{
 uchar x,j;
 for(j=0;j<i;j++)
 for(x=0;x<=148;x++); 
}

/********************************************************************
* 名称 : Com_Int()
* 功能 : 串口中断子函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Com_Int(void) interrupt 4
{
 static uchar i = 7;    //定义为静态变量,当重新进入这个子函数时 i 的值不会发生改变
 EA = 0;
 if(RI == 1)   //当硬件接收到一个数据时,RI会置位
 {
  LED_Buffer[i] = SBUF - 48; //这里减去48是因为从电脑中发送过来的数据是ASCII码。
  RI = 0; 
  if(i==0) i = 8 ; 
  i--;  
 }
 EA = 1;
}

/********************************************************************
* 名称 : Com_Init()
* 功能 : 串口初始化,晶振11.0592,波特率9600,使能了串口中断
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Com_Init(void)
{
     TMOD = 0x20;
     PCON = 0x80;
     SCON = 0x50;   
     TH1 = 0xF3;    //设置波特率 9600
     TL1 = 0xF3;
     TR1 = 1;  //启动定时器1
   ES = 1;  //开串口中断
   EA = 1;  //开总中断  
}

/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main()
{
 uchar i = 0;
 beep = 0;
 Delay_1ms(100);
 Com_Init();
 P2 = 0x00;  //这里把P2口的最高为置1,进入循环后 循环左移 一位正好是P2 最低为置1
 while(1)
 {
  P0 = table[LED_Buffer[i]];
  P2 = i++;
  Delay_1ms(2);
  if(i == 8) i=0;
 }
}         


/*
用杜邦线把继电器输入端口和P1.1连接起来 按键s1吸合 s2释放继电器
*/
#include <reg52.h>
 
sbit key1=P3^2;//定义按键位置
sbit key2=P3^3;//定义按键位置
sbit RELAY = P1^1;
sbit beep = P1^0;
void delay(unsigned int cnt)
{
 while(--cnt);
}
///////////////////////////////////////////////////////
main()
{
 beep = 0;
 while(1)
      {
      if(!key1)     //按下相应的按键
        {
  delay(5000);
        if(!key1)     //去抖后是否按下相应的按键
    {
     RELAY=1; //继电器吸合
    }
  }

   if(!key2)     //按下相应的按键
        {
  delay(5000);
        if(!key2)     //去抖后是否按下相应的按键
    {
     RELAY=0; //继电器释放
    }
  }

      }
}


/********************************************************************
* 文件名  : 矩阵键盘LCD.c
* 描述    :  该文件实现了 4 * 4 键盘的试验。通过数码管的最后两位来显示
    当前的按键值。  
* 创建人  : 东流,2009年4月10日
* 版本号  : 2.0
* 技术支持论坛:www.zidh.com/bbs(请进入“赞助商板块”中的“东流电子工作室”)
* 感谢“中国自动化资讯网”对本工作室的大力支持。
*********************************************************************/
#include<reg51.h>
#include<intrins.h>

#define uint unsigned int
#define uchar unsigned char

uchar code table[10] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09};

//这三个引脚参考资料
sbit E=P2^6;  //1602使能引脚
sbit RW=P2^5;  //1602读写引脚 
sbit RS=P2^4;  //1602数据/命令选择引脚
sbit beep = P1^0;

/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay_1ms(uint i)//1ms延时
{
 uchar x,j;
 for(j=0;j<i;j++)
 for(x=0;x<=148;x++); 
}

/********************************************************************
* 名称 : delay()
* 功能 : 延时,延时时间大概为140US。
* 输入 : 无
* 输出 : 无
***********************************************************************/

void delay()
{
 int i,j;
 for(i=0; i<=10; i++)
 for(j=0; j<=2; j++);
}


/********************************************************************
* 名称 : enable(uchar del)
* 功能 : 1602命令函数
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/

void enable(uchar del)
{
 P0 = del;
 RS = 0;
 RW = 0;
 E = 0;
 delay();
 E = 1;
 delay();
}

/********************************************************************
* 名称 : write(uchar del)
* 功能 : 1602写数据函数
* 输入 : 需要写入1602的数据
* 输出 : 无
***********************************************************************/

void write(uchar del)
{
 P0 = del;
 RS = 1;
 RW = 0;
 E = 0;
 delay();
 E = 1;
 delay();
}

/********************************************************************
* 名称 : L1602_init()
* 功能 : 1602初始化,请参考1602的资料
* 输入 : 无
* 输出 : 无
***********************************************************************/
void L1602_init(void)
{
 enable(0x01);
 enable(0x38);
 enable(0x0c);
 enable(0x06);
 enable(0xd0);
}

/********************************************************************
* 名称 : L1602_char(uchar hang,uchar lie,char sign)
* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下
   L1602_char(1,5,'b')
* 输入 : 行,列,需要输入1602的数据
* 输出 : 无
***********************************************************************/
void L1602_char(uchar hang,uchar lie,char sign)
{
 uchar a;
 if(hang == 1) a = 0x80;
 if(hang == 2) a = 0xc0;
 a = a + lie - 1;
 enable(a);
 write(sign);
}

/********************************************************************
* 名称 : L1602_string(uchar hang,uchar lie,uchar *p)
* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
    L1602_string(1,5,"ab cd ef;")
* 输入 : 行,列,需要输入1602的数据
* 输出 : 无
***********************************************************************/
void L1602_string(uchar hang,uchar lie,uchar *p)
{
 uchar a;
 if(hang == 1) a = 0x80;
 if(hang == 2) a = 0xc0;
 a = a + lie - 1;
 enable(a);
 while(1)
 {
  if(*p == '\0') break;
  write(*p);
  p++;
 }
}

/********************************************************************
* 名称 : Keyscan()
* 功能 : 实现按键的读取。下面这个子程序是按处理 矩阵键盘 的基本方法处理的。
* 输入 : 无
* 输出 : 按键值
***********************************************************************/
uchar Keyscan(void)
{
 uchar i,j, temp, Buffer[4] = {0x7f, 0xbf, 0xdf, 0xef};
 for(j=0; j<4; j++)
 {
  P3 = Buffer[j];
  /*以下三个_nop_();作用为让 P1 口的状态稳定*/
  _nop_();
  _nop_();
  _nop_();
  temp = 0x01;                                                                                                                                                                   
  for(i=0; i<4; i++)
  {
   if(!(P3 & temp))
   {
    while(!(P3&temp));
    return (i+j*4);
   }
   temp <<= 1;
  } 
 }
}

/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main(void)
{
 uchar Key_Value;  //读出的键值
 beep = 0;
 L1602_init();
 L1602_string(1,1,"  4*4 KeyBoard  ");
 L1602_string(2,1,"You Press The    ");
 while(1)
 {
  P3 = 0xf0;
  if(P3 != 0xf0)
  {
   Delay_1ms(15); //按键消抖
   if(P3 != 0xf0)
   {
    Key_Value = Keyscan();  
   }
  }
  L1602_char(2,15,Key_Value/10+48);
  L1602_char(2,16,Key_Value%10+48);  
 }
}




关键词: 串口     继电器     矩阵     键盘     显示     uchar     名称         

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]