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); } }