www.pudn.com > c.rar > 0.c


#include  
#include                  
#define uchar unsigned char 
#define uint  unsigned int 
//#include"absacc.h" 
 
//#include"intrins.h" 
#define dport P1 
#define unchar unsigned char 
sbit RS=P3^4; 
sbit RW=P3^3; 
sbit E=P3^2; 
unchar xpos;   //列方向地址指针 
unchar ypos;   //行方向地址指针 
#define nodisp 0 
#define nocur 1 
#define curnoflash 2 
#define curflsh 3 
void lcdwcn(unchar); 
void lcdwc(unchar); 
void writechar(unchar); 
void lcdpos(); 
void lcdwd(unchar); 
void lcdwdn(unchar); 
 
uchar table[10]= {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38};//数码管代码 
 
sbit BEEP = P3^5;         //蜂鸣器驱动线 
uchar dis_buf;            //显示缓存 
uchar  temp; 
uchar  key;               //键顺序吗 
void mdelay(unsigned int delay) 
{unsigned int i; 
for( ; delay>0; delay--) 
{for(i=0;i<124;i++) 
{ ; } 
 } 
 } 
 void setcur(unchar cur)   //光标设置 
 {switch(cur) 
 {case 0x0: 
 {lcdwc(0x08); //关显示 
 break; 
 } 
 case 0x1: 
 {lcdwc(0xc); //开显示但无光标 
 break; 
 } 
 case 0x2: 
 {lcdwc(0x0e);//开显示有光标但不闪 
 break; 
 } 
 case 0x3: 
 {lcdwc(0x0f);  //开显示有光标且闪 
 break; 
 } 
 default: break; 
 
 } 
 } 
 void clrlcd()   //清屏 
 {lcdwc(0x01);}  //在指定的行和列显示 
 void writechar(unchar c) 
 {lcdpos(); 
  lcdwd(c); 
  } 
  void waitidle()//正常读写之前LCD控制器 
  {unchar tmp; 
  dport=0xff; 
  RS=0; 
  RW=1; 
  E=1; 
  _nop_(); 
  for( ; ; ) 
  {tmp=dport; 
  tmp&=0x80; 
  if(tmp==0) 
  break; 
  } 
  E=0; 
  } 
  void lcdwdn(unchar c)//不检测忙子程序 
  { 
   RS=1; 
	RW=0; 
	dport=c;//写入待写字符 
E=1; 
	_nop_(); 
	E=0; 
	} 
void lcdwd(unchar c)//带忙坚检测的控制字子程序 
	{waitidle(); 
	lcdwdn(c);} 
	void lcdwcn(unchar c) 
	{RS=0; 
	RW=0; 
	dport=c; 
    E=1; 
	_nop_(); 
	E=0; 
	} 
void lcdwc(unchar c)//检测忙信号的送控制字子程序 
{waitidle(); 
lcdwcn(c); 
} 
void lcdpos() 
{unchar tmp; 
xpos&=0x0f;//范围为0~15个字符 
ypos&=0x01;//范围为0~1 
tmp=xpos; 
if(ypos==1) 
{tmp+=0x40; 
} 
tmp|=0x80;//地址加80H 
lcdwc(tmp); 
} 
void rstlcd()//LCD的复位程序 
{mdelay(15);//延时15S 
lcdwcn(0x38); 
mdelay(5); 
lcdwcn(0x38); 
mdelay(5); 
lcdwcn(0x38); 
 
lcdwc(0x38); 
lcdwc(0x08); 
lcdwc(0x01); 
lcdwc(0x06); 
lcdwc(0x0c); 
} 
    
void beep();              //蜂鸣器 
void delay0(uchar x);      //x*0.14MS 
//-------------------------------------------------- 
/* 延时子程序*/ 
 
void  delay(uchar x) 
{ uchar j; 
    while((x--)!=0) 
    { for(j=0;j<125;j++) 
         {;} 
    } 
} 
//-------------------------------------------------- 
 /*键扫描子程序*/ 
 void  keyscan(void) 
 {  
    P2=0x0F;         //低四位输入   
    delay(1); 
    temp=P2;         //读P2口  
    temp=temp&0x0F; 
    temp=~(temp|0xF0); 
    if(temp==1) 
        key=0; 
    else if(temp==2) 
        key=1; 
    else if(temp==4) 
        key=2; 
    else if(temp==8) 
        key=3; 
    else 
        key=16; 
         
    P2=0xF0;        //高四位输入 
    delay(1); 
    temp=P2;          //读P2口        
    temp=temp&0xF0; 
    temp=~((temp>>4)|0xF0); 
    if(temp==1) 
        key=key+0; 
    else if(temp==2) 
        key=key+4; 
    else if(temp==4) 
        key=key+8; 
    else if(temp==8) 
        key=key+12; 
    else 
        key=16; 
      
     dis_buf=table[key]; //查表得键值 
 } 
//-------------------------------------------------- 
/*判断键是否按下*/ 
 void  keydown(void) 
 {   
   P2=0xF0; 
 if(P2!=0xF0) 
 { 
   keyscan(); 
   beep(); 
     // while(P1!=0xF0);  //等待键释放 
 } 
 }  
//-------------------------------------------------- 
void beep() 
{ 
  unsigned char i; 
  for (i=0;i<100;i++) 
   { 
   delay0(4); 
   BEEP=!BEEP;       //BEEP取反 
   }  
   BEEP=1;           //关闭蜂鸣器 
   delay(250);       //延时      
} 
//-------------------------------------------------- 
void delay0(uchar x)    //x*0.14MS 
{ 
 unsigned char i; 
  while(x--) 
 { 
  for (i = 0; i<13; i++) {} 
 } 
} 
//--------------------------------------------------  
    main() 
 { 
    P0=0xFF;         
              
    dis_buf=0xBF; 
     
    while(1) 
    { int t; 
       keydown(); 
       //P0 = dis_buf;   //键值送显示 
	   t=dis_buf; 
       delay(2); 
	   rstlcd(); 
	   clrlcd(); 
	   setcur(curflsh); 
	   xpos=2; 
	   ypos=0; 
	   writechar(t); 
	   } 
        
    }