#include <reg51.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int #define LCD_data P0 //数据口 sbit LCD_RS = P3^5; //寄存器选择输入 sbit LCD_RW = P2^0; //液晶读/写控制 sbit LCD_EN = P3^4; //液晶使能控制 sbit LCD_PSB = P2^1; //串/并方式控制 sbit wela = P2^7; sbit dula = P2^6; //关闭LED灯 sbit wr=P3^6; sbit rd=P3^7; sbit fm=P2^3; uint temp; uchar p=3,q=1,jianzhi; uint a1,a2,a3,date,q1; uchar code dis1[] = {"毕业设计电子秤"}; uchar code dis2[] = {"单价:"}; uchar code dis3[] = {"重量:"}; uchar code dis4[] = {"总价:"}; uchar code table[]="0123456789"; uchar code table1[]="Kg"; uchar code table2[]={"元"}; uchar code dis5[] = {"2012毕业设计电子秤"}; uchar code dis6[] = {"姓名:钱志伟"}; uchar code dis7[] = {"学号:5901108126"}; uchar code dis8[] = {"欢迎老师批评指正"}; #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};//宏定义延时4个CPU uchar IRDIS[2]; uchar IRCOM[4]; void delay0(uchar x); //x*0.14MS void beep(); void dataconv(); void lcd_pos(uchar X,uchar Y); //确定显示位置 uint AD_read(); key_read (); void disp_ad(); void disp_dy(); void disp_kj(); void disp_jianpan(uchar jian); void disp_zongjia(uint qian);
void delay(int ms) { while(ms--) { uchar i; for(i=0;i<250;i++) { _nop_(); _nop_(); _nop_(); _nop_(); } } } bit lcd_busy() { bit result; LCD_RS = 0; LCD_RW = 1; LCD_EN = 1; delayNOP(); result = (bit)(P0&0x80); LCD_EN = 0; return(result); } /*******************************************************************/ /* */ /*写指令数据到LCD */ /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */ /* */ /*******************************************************************/ void lcd_wcmd(uchar cmd) { while(lcd_busy()); LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; _nop_(); _nop_(); P0 = cmd; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0; } /*******************************************************************/ /* */ /*写显示数据到LCD */ /*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */ /* */ /*******************************************************************/ void lcd_wdat(uchar dat) { while(lcd_busy()); LCD_RS = 1; LCD_RW = 0; LCD_EN = 0; P0 = dat; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0; } void lcd_init() {
LCD_PSB = 1; //并口方式 lcd_wcmd(0x34); //扩充指令操作 delay(5); lcd_wcmd(0x30); //基本指令操作 delay(5); lcd_wcmd(0x0F); //显示开,开光标 delay(5); lcd_wcmd(0x01); //清除LCD的显示内容 delay(5); } main() { uchar w; uchar jiage[3]; while(1) { delay(10); //延时 wela=0; dula=0; lcd_init(); //初始化LCD disp_kj();//开机界面的显示 delay(500); disp_dy();//显示价格重量等固定的文字 disp_ad();//AD转换值的显示 while(q)//判断标志位q是否为0,为0表示键盘按了确定键 { uchar n=2; w=key_read ();//调出键值 disp_jianpan(w);//将键值显示 jiage[n]=jianzhi;//将键值存入数组中 p++; n--; } q=1; p=3; q1=jiage[2]*100+jiage[1]*10+jiage[0];//得到按键数 disp_zongjia(q1);//总价的计算和显示 } }
void delay0(uchar x) //x*0.14MS { uchar i; while(x--) { for (i = 0; i<13; i++) {} } } void lcd_pos(uchar X,uchar Y) { uchar pos; if (X==0) {X=0x80;} else if (X==1) {X=0x90;} else if (X==2) {X=0x88;} else if (X==3) {X=0x98;} pos = X+Y ; lcd_wcmd(pos); //显示地址 } /*AD转换函数*/ uint AD_read() { wela=1; P0=0; _nop_(); wr=0; _nop_(); wr=1; P0=0xff; delay(10); P0=0; rd=0; _nop_(); P1=0xff; temp=P1; return temp;
}
/*键盘扫描程序*/
key_read () { unsigned char key,key1; while(1) { P3=0xfe;//给P3.0一个低电平 key1=P3; key1=key1&0xf0; if(key1!=0xf0) { delay(10);//取抖 if(key1!=0xf0) { key1=P3; switch(key1) { case 0xee://选中0号键 key=0; break;
case 0xde://选中1号键 key=1; break;
case 0xbe://选中2号键 key=2; break;
case 0x7e://选中3号键 key=3; break; } } }
P3=0xfd;//给P3.1一个低电平 key1=P3; key1=key1&0xf0; if(key1!=0xf0) { delay(10);//取抖 if(key1!=0xf0) { key1=P3; switch(key1) { case 0xed://选中4号键 key=4; break;
case 0xdd://选中5号键 key=5; break;
case 0xbd://选中6号键 key=6; break;
case 0x7d://选中7号键 key=7; break; } } }
P3=0xfb;//给P3.2一个低电平 key1=P3; key1=key1&0xf0; if(key1!=0xf0) { delay(10);//取抖 if(key1!=0xf0) { key1=P3; switch(key1) { case 0xeb://选中8号键 key=8; break;
case 0xdb://选中9号键 key=9; break;
case 0xbb://选中10号键 key=10; break;
case 0x7b://选中11号键 key=11; break; } } }
P3=0xf7;//给P3.3一个低电平 key1=P3; key1=key1&0xf0; if(key1!=0xf0) { delay(10);//取抖 if(key1!=0xf0) { key1=P3; switch(key1) { case 0xe7://选中12号键 key=12; break;
case 0xd7://选中13号键 key=13; break;
case 0xb7://选中14号键 key=14; break;
case 0x77://选中15号键 key=15; break; } } } return key; } } /* AD转换数值显示函数*/ void disp_ad() { uint ad_read; ad_read=AD_read();//将AD转换函数的返回值调出 date=(float)ad_read*50.0/256.0; a1=date; a2=a1/10; a3=a1%10; lcd_pos(2,3); lcd_wdat(table[a2]); lcd_pos(2,4); lcd_wdat('.'); lcd_pos(2,5); lcd_wdat(table[a3]); lcd_pos(2,6); lcd_wdat(table1[0]); lcd_pos(2,7); lcd_wdat(table1[1]); } void disp_dy() { uchar i; lcd_pos(0,0); //设置显示位置为第一行的第1个字符 i = 0; while(dis1 != '\0') { //显示字符 lcd_wdat(dis1); i++; } lcd_pos(1,0); //设置显示位置为第二行的第1个字符 i = 0; while(dis2 != '\0') { lcd_wdat(dis2); //显示字符 i++; } lcd_pos(2,0); //设置显示位置为第三行的第1个字符 i = 0; while(dis3 != '\0') { lcd_wdat(dis3); //显示字符 i++; } lcd_pos(3,0); //设置显示位置为第四行的第1个字符 i = 0; while(dis4 != '\0') { lcd_wdat(dis4); //显示字符 i++; } }
void disp_kj() { uchar i; lcd_pos(0,0); //设置显示位置为第一行的第1个字符 i = 0; while(dis5 != '\0') { //显示字符 lcd_wdat(dis1); i++; } lcd_pos(1,0); //设置显示位置为第二行的第1个字符 i = 0; while(dis6 != '\0') { lcd_wdat(dis2); //显示字符 i++; } lcd_pos(2,0); //设置显示位置为第三行的第1个字符 i = 0; while(dis7 != '\0') { lcd_wdat(dis3); //显示字符 i++; } lcd_pos(3,0); //设置显示位置为第四行的第1个字符 i = 0; while(dis8 != '\0') { lcd_wdat(dis4); //显示字符 i++; } }
void disp_jianpan(uchar jian) { uchar a; a=jian; if(a<10) {lcd_pos(1,p); lcd_wdat(table[a]);//将键值显示 jianzhi=table[a];}//if中要执行多个语句时要加大括号, else if(a=10) q=0;//确认键 else fm=0;//警报响 } void disp_zongjia(uint qian) { uchar z1,z2,z3,z4; float q3,q2; uint x, z0; x=qian; q3=a3*0.1+a2; q2=x*q3; z0=q2*10; z1=(int)z0/1000; z2=(int)z0%1000/100; z3=(int)z0%1000%100/10; z4=(int)z0%1000%100%10; lcd_pos(3,3); lcd_wdat(table[(int)z1]); lcd_pos(3,4); lcd_wdat(z2); lcd_pos(3,5); lcd_wdat(table[(int)z3]); lcd_pos(3,6); lcd_wdat('.'); lcd_pos(3,7); lcd_wdat(table[(int)z4]); } |