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

📄 key_lcd.c

📁 单片机与LCD1602
💻 C
字号:
#include<AT89X51.h>
#include <stdio.h>
#include <math.h>
#define unchar unsigned char
#define unint unsigned int
sbit e=P2^0;
sbit rw=P2^1;
sbit rs=P2^2;
bit flag=0;
unint count=0;
unchar code table[]={0x30,0x31,0x32,0x33,
                     0x34,0x35,0x36,0x37,
					 0x38,0x39,0x2b,0x2d,
					 0x2a,0x25,0x3d,0x30};//+-*/= on分别为2b,2d,2a,25,3d,0x71(F的代码)
unchar key,temp;

void delay(void);//LCD延时
void delay10ms(unsigned char time);	//键盘延时
void write_c(unchar command);//写命令到LCD
void write_d(unchar dat);//写数据到LCD
//void disply();//显示程序



void delay10ms(unsigned char time) //键盘延时程序
{
unsigned char a,b,c;
for(a=0;a<time;a++)
for(b=0;b<10;b++)
  for(c=0;c<120;c++)
  ;
}

void write_c(unchar command)//写命令到LCD
{
 e=1; 
 rw=0;
 rs=0;
 P0=command;
 e=0;
 delay();
}

void write_d(unchar dat) //写数据到LCD
{
 e=1;
 rw=0;
 rs=1;
 P0=dat;
 e=0;
 delay();
}


void delay(void)  //LCD延时
{
 int i;
 for(i=0;i<1000;i++);
}


void keyscan(void) interrupt 1 //按键扫描子程序
{
P3=0xFF;
P3_3=0;	  //第a行为0
temp=P3;
temp&=0xF0;
if(temp!=0xF0)
{
delay10ms(10); //等待键盘释放
temp=P3;
temp&=0xF0;
if(temp !=0xF0)
{ count++;
  temp=P3;
  temp&=0xF0;

  switch(temp)
  {
  case 0xe0:
  key=10;flag=1;break; 
  case 0xd0:			 
  key=14;flag=1;break;
  case 0xb0:
  key=0;flag=1;break;
  case 0x70:
  key=15;flag=1;break;
  }
}
}

P3=0xFF;
P3_2=0;	 //第b行为0
temp=P3;
temp&=0xF0;
if(temp !=0xF0)
{ 
delay10ms(10);	//等待键盘释放
temp=P3;
temp&=0xF0;
if(temp !=0xF0)
{ count++;
  temp=P3;
  temp&=0xF0;

  switch(temp)
  {
  case 0xe0:
  key=11;flag=1;break;
  case 0xd0:
  key=3;flag=1;break;
  case 0xb0:
  key=2;flag=1;break;
  case 0x70:
  key=1;flag=1;break;
  }
}
}

P3=0xFF;
P3_1=0;	 //第c行为0
temp=P3;
temp&=0xF0;
if(temp !=0xF0)
{ 
delay10ms(10); //等待键盘释放
temp=P3;
temp&=0xF0;
if(temp !=0xF0)
{ count++;
  temp=P3;
  temp&=0xF0;

  switch(temp)
  {
  case 0xe0:
  key=12;flag=1;break;
  case 0xd0:
  key=6;flag=1;break;
  case 0xb0:
  key=5;flag=1;break;
  case 0x70:
  key=4;flag=1;break;
  }
}
}

P3=0xFF;
P3_0=0;	 //第d行为0
temp=P3;
temp&=0xF0;
if(temp !=0xF0)
{
delay10ms(10);	//等待键盘释放
temp=P3;
temp&=0xF0;
if(temp !=0xF0)
{ count++;
  temp=P3;
  temp&=0xF0;

  switch(temp)
  {
  case 0xe0:
  key=13;flag=1;break;
  case 0xd0:
  key=9;flag=1;break;
  case 0xb0:
  key=8;flag=1;break;
  case 0x70:
  key=7;flag=1;break;
  }
}
}

 TH0=0x0b;//重赋初值
 TL0=0xcf;//20ms
 TR0=1;
}

void disply(void)	//这个函数没用到,但是一个好的显示函数
{ 
  if(count<=8)	 //如果第一行写满则换到第二行
  {write_c(0x80);
   write_d(table[key]);
  }
  else
  {
  write_c(0xc0);
  write_d(table[key]);
  }
  flag=0;
}

main()
{		
 EA=1; //定时器T0
 ET0=1;
 TH0=0x0b;
 TL0=0xcf;//20ms
 TR0=1;
 write_c(0x38);//设置为8总线16*2 5*7点阵
 write_c(0x0c);//开显示,光标闪烁
 write_c(0x01);//清屏幕
 write_c(0x80);
 while(1)
 { 
  if(flag)
     {if(count<=32)	 //如果第一行写满则换到第二行
         write_d(table[key]);
      else
         {
          write_c(0xc0+(count-34));   //转到第二行显示
          write_d(table[key]);
         }
       flag=0;//标志清零
      }
 }
}

⌨️ 快捷键说明

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