当前位置: 代码迷 >> 单片机 >> 单片机的中duan解决方法
  详细解决方案

单片机的中duan解决方法

热度:49   发布时间:2016-04-28 15:55:27.0
单片机的中duan
#include<reg52.h>

#define uchar unsigned char
#define uint unsigned int
#define KeyPort P0

sbit RS=P2^0;
sbit RW=P2^1;
sbit En=P2^2;

sbit Pwm=P2^3;
sbit Out1=P2^4;
sbit Out2=P2^5;
sbit Wave=P2^6;

uchar code table[]={'0','1','2','3','4','5','6','7','8','9'};//转换成液晶显示的字符
uint wave_num=0,n;
uint change=0;
uint time=0;
uint high=20;
uint cycle=40;
uint key[4];
uint NUM,NUM_H,NUM_L;
static uint i;



//延迟Zms
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}


//向LCD写入命令
void write_com(uchar com)
{
RS=0;
RW=0;
P1=com;
delay(5);
En=1;
delay(5);
En=0;
}

//向LCD写入字符
void write_data(uchar date)
{
RS=1;
  RW=0;
P1=date;
delay(5);
En=1;
delay(5);
En=0;
}

//在LCD的特定位置显示字符
void write_char(uchar x,uchar y,uchar date)
{
if(y==0)
write_com(0x80+x);
else
write_com(0xc0+x);
  write_data(date);
}

//在LCD特定的位置显示字符串
void write_string(uchar x,uchar y,uchar *s)
{
if(y==0)
write_com(0x80+x);
else
write_com(0xc0+x);
  while(*s)
{
write_data(*s);
s++;
}
}

//LCD清屏
void LCD_Clear()
{
write_com(0x01);
delay(5);
}

//LCD初始化
void Init_LCD()
{
En=0;
write_com(0x38); //设置显示模式(两行显示)
write_com(0x0e); //显示光标并闪烁
write_com(0x06); //光标左移加1
write_com(0x01); //清屏
write_com(0x80);//整屏移动,起始位地址设为第一行的?
} //最后一位




uchar KeyScan(void) //键盘扫描函数,使用行列反转扫描法
{
uchar cord_h,cord_l; //行列值中间变量
KeyPort=0x0f; //行线输出全为0
cord_h=KeyPort&0x0f; //读入列线值
if(cord_h!=0x0f) //先检测有无按键按下
{
delay(10); //去抖
if((KeyPort&0x0f)!=0x0f)
{
cord_h=KeyPort&0x0f; //读入列线值
KeyPort=cord_h|0xf0; //输出当前列线值
cord_l=KeyPort&0xf0; //读入行线值

while((KeyPort&0xf0)!=0xf0); //等待松开并输出

return(cord_h+cord_l); //键盘最后组合码值
}
}
return(0xff); //返回该值
}




void Wave_test() //计脉冲个数
{
  while(1)
  {
while(!Wave); //检测到高电平
if(Wave)
  {
wave_num++; //高电平计数
while(Wave); //高电平等待
}
  }
}

uint speed_count()
{
return(wave_num/4); //假设转轴上有4个磁钢

}



/*------------------------------------------------
按键值处理函数,返回扫键值
------------------------------------------------*/
uchar Key_In(void)
{
 switch(KeyScan())
 {
  case 0x7e:return 0;break;//0 按下相应的键显示相对应的码值
  case 0x7d:return 1;break;//1
  case 0x7b:return 2;break;//2
  case 0x77:return 3;break;//3
  case 0xbe:return 4;break;//4
  case 0xbd:return 5;break;//5
  case 0xbb:return 6;break;//6
  case 0xde:return 8;break;//8
  case 0xb7:return 7;break;//7
  case 0xdd:return 9;break;//9
  case 0xdb:return 10;break;//a
  case 0xd7:return 11;break;//b
  case 0xee:return 12;break;//c
  case 0xed:return 13;break;//d
  case 0xeb:return 14;break;//e
  case 0xe7:return 15;break;//f
  default:return 0xff;break;
 }
}

//定时器T0.T1的初始化
void Init_timer()
{

IE0=1;
  TMOD=0x11;
   
  TH0=0xec;
  TL0=0x78;
TR0=1;
   

TH1=0x3c;
  相关解决方案