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