⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 8x8 lcd.c

📁 51单片机1602液晶屏应用
💻 C
字号:
//******** 小波电子工作室 All rights reserved******
//******** 个人主页:http://hi.baidu.com/niejinbo **
//******** 文 件 名:   lcd_key.1.c     ************
//******** 功能概要:   4*4矩阵键盘扫描 ***********
//******** MCU: STC89C52 晶振:11.0592Mhz **********
//******** 设 计 者:   聂金波          ************
//******** 完成日期:   2008-07-14      ************
//******** 当前版本:   0714.1          ************
//******** 改进说明:   暂无            ************
//******** 补充说明:    从键盘输入0-F,在LCD上显示出来
//*********头文件区*******************
#include<reg52.h>
#include<math.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
//*********定义变量区*******************
sbit e=P2^7;      //LCD使能信号
sbit rs=P2^5;      //LCD数据/命令选择信号
sbit rw=P2^6;
uchar tab_key[50];
uchar code tab[]="0123456789abcdef";   
uchar n=0,temp,key;
//*********函数声明区********************
void lcd_disp();          //LCD显示函数
void lcd_init();          //LCD初始化函数
void write_com(uchar);    //写命令函数
void write_data(uchar);   //写数据函数
void delay(uint);         //延迟函数
void key_scan();          //键盘扫描函数
void key_manage1();       //键盘功能分配函数
void key_manage2(); 
void key_manage3(); 
void key_manage4(); 
void key_manage5(); 
void key_manage6(); 
void key_manage7(); 
void key_manage8(); 
void key_manage9(); 
void key_manage10();
void key_manage11(); 
void key_manage12(); 
void key_manage13(); 
void key_manage14(); 
void key_manage15(); 
void key_manage16();

//**********主函数开始**********
void main()
{
lcd_init();
write_com();
while(1)
{
key_scan();
lcd_disp(); 
}
}

//**********LCD显示函数开始***********
void lcd_disp()
{
uchar j,i=0;
write_com(0x80);
for(i=0;i<n;i++)
{
j=tab_key[i];
write_data(tab[j]);
}
}
/*void key_manage16()
{
tab_key[n]=15;
n++;
}  */

//**********LCD初始化函数开始*********
void lcd_init()
{
e=0;
write_com(0x38);      //设置显示模式:16X2,5X7,8位数据接口
write_com(0x0c);      //开显示,显示光标,光标闪烁
write_com(0x06);      //读写一个字符后,地址指针及光标加一,且光标加一整屏显示不移动
write_com(0x80);    //设置光标指针
}

//**********写命令函数开始************
void write_com(uchar com)
{
	rs=0;
	rw=0;
	e=0;
P0=com;       //写入命令
delay(3);     //延时约3ms
e=1;      //LCD使能端置高电平
delay(5);     //延时约5ms
e=0;      //LCD使能端拉低电平
}
//**********写数据函数开始************
void write_data(uchar dat)
{
   rs=1;      //低电平写数据

	rw=0;

   P0=dat;       //写入命令
   delay(3);     //延时约3ms
   e=1;      //LCD使能端置高电平
   delay(5);     //延时约5ms
   e=0;      //LCD使能端拉低电平
}
//**********键盘扫描函数开始****
void key_scan()
{
//**********扫描第一行*********
P3=0xfe;          
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(100);
if(temp!=0xf0)
   {
    temp=P3;
    switch(temp)
     {
      case 0xee:
           key_manage1();
           break;
      case 0xde:
           key_manage2();
           break;
       case 0xbe:
            key_manage3();
            break;
       case 0x7e:
            key_manage4();
            break;
      }
     while(temp!=0xf0)
      {
       temp=P3;
       temp=temp&0xf0;
      }
     }
   }
//**********扫描第二行*********
P3=0xfd;         
temp=P3;
temp=temp&0xf0;
   if(temp!=0xf0)
    {
     delay(100);
     if(temp!=0xf0)
      {
       temp=P3;
       switch(temp)
        {
         case 0xed:
              key_manage5();
              break;
         case 0xdd:
              key_manage6();
              break;
         case 0xbd:
              key_manage7();
              break;
         case 0x7d:
              key_manage8();
              break;
         }
       while(temp!=0xf0)
        {
         temp=P3;
         temp=temp&0xf0;
        }
      }
    }
//**********扫描第三行*********   
P3=0xfb;      
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
   {
    delay(100);
    if(temp!=0xf0)
     {
      temp=P3;
      switch(temp)
      {
        case 0xeb:
             key_manage9();
             break;
        case 0xdb:
             key_manage10();
             break;
         case 0xbb:
              key_manage11();
              break;
         case 0x7b:
              key_manage12();
              break;
        }
      while(temp!=0xf0)
         {
          temp=P3;
          temp=temp&0xf0;
         }
        }
     }

//**********扫描第四行*********
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
   {
    delay(100);
    if(temp!=0xf0)
     {
      temp=P3;
      switch(temp)
       {
        case 0xe7:
             key_manage13();
             break;
        case 0xd7:
             key_manage14();
             break;
        case 0xb7:
             key_manage15();
             break;
        case 0x77:
             key_manage16();
             break;
      }
    while(temp!=0xf0)
     {
      temp=P3;
      temp=temp&0xf0;
     }
    }
}
}  
//*********延时函数开始**************
void delay(uint k)
{
uint i,j;
for(i=k;i>0;i--)
   for(j=50;j>0;j--);
}

//******键盘功能分配函数群开始********
//       键盘功能示意图
//       设计者:聂金波
//** 1 ** 2 ** 3 ** 4 **  
//** 5 ** 6 ** 7 ** 8 **
//** 9 ** 0 ** s ** c **
//** M1** M2** M3** M4**  
void key_manage1()
{
tab_key[n]=0;
n++;
}
void key_manage2()
{

tab_key[n]=1;
n++;

}
void key_manage3()
{
tab_key[n]=2;
n++;
}
void key_manage4()
{
tab_key[n]=3;
n++;
}
void key_manage5()
{
tab_key[n]=4;
n++;
}
void key_manage6()
{
tab_key[n]=5;
n++;
}
void key_manage7()
{
tab_key[n]=6;
n++;
}
void key_manage8()
{
tab_key[n]=7;
n++;
}
void key_manage9()
{
tab_key[n]=8;
n++;
}
void key_manage10()
{
tab_key[n]=9;
n++;
}
void key_manage11()
{
tab_key[n]=10;
n++;
}
void key_manage12()
{
tab_key[n]=11;
n++;
}
void key_manage13()
{
tab_key[n]=12;
n++;
}
void key_manage14()
{
tab_key[n]=13;
n++;
}
void key_manage15()
{
tab_key[n]=14;
n++;
}
void key_manage16()
{
tab_key[n]=15;
n++;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -