4×4矩阵键盘+1602液晶显示
//这是51hei单片机开发板附带的一个程序,矩阵键盘接p3口,其中p3.0-p3.4为行,P3.5->p3.7为列
//每按一下键数字便可显示在1602液晶上面,并且蜂鸣器会发出响声.
//全部源代码下载: http://www.51hei.com/f/jz1602.rar
#includereg52.h>#include Intrins.h>#define uchar unsigned char#define uint unsigned intsbit dula=P2^6;sbit wela=P2^7;sbit rs=P2^2;sbit lcden=P2^0;sbit rw=P2^1;sbit BEEP=P2^3;uchar num,temp,date,i;uchar code table_1[]=" shu ru tiao ma ";uchar code table_2[]=" Pro_8888 ";uchar code dis_tab[17]={ 0x30, //0在1602中的十六进制码 0x31, //1在1602中的十六进制码 0x32, //2在1602中的十六进制码 0x33, //3在1602中的十六进制码 0x34, //4在1602中的十六进制码 0x35, //5在1602中的十六进制码 0x36, //6在1602中的十六进制码 0x37, //7在1602中的十六进制码 0x38, //8在1602中的十六进制码 0x39, //9在1602中的十六进制码 0x41, //A在1602中的十六进制码 0x42, //B在1602中的十六进制码0x43, //C在1602中的十六进制码 0x44, //D在1602中的十六进制码 0x2A, //*在1602中的十六进制码 0x23, //#在1602中的十六进制码0x20, // 在1602中的十六进制码};void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void beep(){uchar i;for (i=0;i50;i++){delay(4);BEEP=0; //BEEP取反} BEEP=1; //关闭蜂鸣器delay(100); //延时 }void lcd_wait_busy() //1602忙检测函数{ P0=0xff; //数据口全部置1,为读状态做准备rs=0; //选择指令寄存器rw=1; //选择读lcden=1; //使能线电平变化while((P00x80)==0x80);//读忙状态,不忙时退出lcden=0; //恢复使能线电平}// 1602写命令函数 void lcd_write_com(unsigned char combuf){ rs=0; //选择指令寄存器rw=0; //选择写P0=combuf; //把命令字送入P2 lcden=1; //使能线电平变化,命令送入1602的8位数据口_nop_();lcden=0; //恢复使能线电平}// 1602写命令函数(带忙检测) void lcd_write_com_busy(unsigned char combuf){ lcd_wait_busy(); //调用忙检测函数lcd_write_com(combuf); //调用写命令函数}// 1602写数据函数(带忙检测) void lcd_write_data(unsigned char databuf){ lcd_wait_busy(); //调用忙检测函数rs=1; //选择数据寄存器rw=0; //选择写P0=databuf; //把数据字送入P2lcden=1; //使能线电平变化,命令送入1602的8位数据口_nop_();lcden=0; //恢复使能线电平}// 1602显示地址写函数 void lcd_write_address(unsigned char x,unsigned char y){ y=0x01; //行地址限制在0-1if(y==0x00)lcd_write_com_busy(x|0x80); //第一行的列地址写入elselcd_write_com_busy((x+0x40)|0x80); //第二行的列地址写入}// 指定地址写入函数 void lcd_write_char(unsigned char x,unsigned char y,unsigned char buf){ lcd_write_address(x,y); //写入地址 lcd_write_data(buf); //写入显示数据 } // 液晶初始化指令void lcd_init(){uchar num;dula=0;wela=0;lcden=0;lcd_write_com_busy(0x38); //设置16*2显示,5*7点阵,8位数据接口lcd_write_com_busy(0x0d); //关显示 显示光标 光标闪烁lcd_write_com_busy(0x06); //当读或写一个字符后地址指针加一,且光标加一,写一个字符,整屏显示移动lcd_write_com_busy(0x01); //显示清屏:1,数据指针清零 2,所有显示清零lcd_write_com_busy(0x80); //80h+地址码(0-27h,40h-67h) 设置数据地址指针 for(num=0;num16;num++){lcd_write_data(table_1[num]);delay(5);}lcd_write_com_busy(0x80+0x40);}void key_wdat(uchar i) //按键写数据{// dula=0;// wela=0;// lcden=0;//液晶初始化指令// write_com(0x38); //设置16*2显示,5*7点阵,8位数据接口// write_com(0x0d); //关显示 显示光标 光标闪烁// write_com(0x06); //当读或写一个字符后地址指针加一,且光标加一,写一个字符,整屏显示移动// write_com(0x01); //显示清屏:1,数据指针清零 2,所有显示清零// write_com(0x80+0x40); //80h+地址码(0-27h,40h-67h) 设置数据地址指针 lcd_wait_busy();lcd_write_data(i);delay(100);}// 删除液晶第1或2行全部数据void clear(uchar t){if(t==1){lcd_write_com_busy(0x80);}if(t==2){lcd_write_com_busy(0x80+0x40);}for(i=0;i15;i++){lcd_write_data(dis_tab[16]);}lcd_write_com_busy(0x80+0x40);}// 产品显示函数 待写 如何从键盘输入中提取出三位的产品号码???????????????????/*void display_product(){}*/// 4*4矩阵键盘检测void keyscan(){lcden=1;//???//P3=0xfe;temp=P3;temp=temp0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xee:key_wdat(dis_tab[7]); beep(); // 7break;case 0xde:key_wdat(dis_tab[8]); beep(); // 8break;case 0xbe:key_wdat(dis_tab[9]); beep(); // 9break;case 0x7e:key_wdat(dis_tab[17]); beep(); // break;}while(temp!=0xf0){temp=P3;temp=temp0xf0;}}}//P3=0xfd;temp=P3;temp=temp0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xed:key_wdat(dis_tab[4]); beep(); // 4break;case 0xdd:key_wdat(dis_tab[5]); beep(); // 5break;case 0xbd:key_wdat(dis_tab[6]); beep(); // 6break;case 0x7d:key_wdat(dis_tab[17]); beep(); // break;}while(temp!=0xf0){temp=P3;temp=temp0xf0;}}}//P3=0xfb;temp=P3;temp=temp0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xeb:key_wdat(dis_tab[1]);beep(); // 1break; case 0xdb:key_wdat(dis_tab[2]);beep(); // 2break;case 0xbb:key_wdat(dis_tab[3]);beep(); // 3break;case 0x7b:key_wdat(dis_tab[17]);beep(); // break;}while(temp!=0xf0){temp=P3;temp=temp0xf0;}}}//P3=0xf7;temp=P3;temp=temp0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xe7:key_wdat(dis_tab[0]); beep(); // 0break;case 0xd7:key_wdat(dis_tab[17]); beep(); // break;case 0xb7:clear(2); beep(); // 删除液晶第二行break;case 0x77:beep(); // enterbreak;}while(temp!=0xf0){temp=P3;temp=temp0xf0;}}}}//void main(){lcd_init();while(1){keyscan();}while(1);}
评论