- /******************************************************
- ******************************************************/
- #include <REG51.H>
- #include <intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- //延時子程序模塊
- //**********************************************
- void mdelay(uint delay)
- {
- uint i;
- for(; delay>0; delay--)
- {
- for(i=0; i<80; i++) //1ms延時.
- {
- ;
- }
- }
- }
- //************************************************
- void show(); //液晶顯示程序
- //****************************************
- //12864液晶顯示部分子程序模塊
- //****************************************
- sbit K1 = P0^4;
- sbit K2 = P0^3;
- sbit K3 = P0^2;
- sbit K4 = P0^1;
- sbit K5 = P0^0;
- sbit K6 = P1^0;
- sbit K7 = P1^1;
- sbit K8 = P1^2;
- sbit rs = P0^5;
- sbit rw = P0^6;
- sbit e = P0^7;
- sbit beep = P1^5;
- #define lcddata P2
- unsigned char count=0,m=30,n,nn,money=0,du; //定義計數變量
- uchar Time[6];
- sbit busy=P0^7; //lcd busy bit
- void wr_d_lcd(uchar content);
- void wr_i_lcd(uchar content);
- void clrram_lcd (void);
- void init_lcd(void);
- void busy_lcd(void);
- void rev_row_lcd(uchar row);
- void rev_co_lcd(uchar row,uchar col,uchar mode);
- void clr_lcd(void);
- void wr_co_lcd(uchar row,uchar col,uchar lcddata1,uchar lcddtta2);
- void wr_row_lcd(uchar row,char *p);
- //******************************************************************* */
- //因為引腳的定義DB0..DB7是從P1.7...P1.0排列的 */
- //所以順序需要調換一下
- //*******************************************************************
- uchar swapbit(uchar udata)
- {
- uchar ii,tmp=0;
- for(ii=0; ii<8; ii++)
- {
- tmp<<=1;
- if(udata&0x01)
- {
- tmp|=0x01;
- }
- udata>>=1;
- }
- return tmp;
- }
- //**********************************
- //液晶初始化
- //**********************************
- void init_lcd(void)
- {
- wr_i_lcd(0x06); /*光標的移動方向*/
- wr_i_lcd(0x0c); /*開顯示,關游標*/
- }
- //***********************************
- //填充液晶DDRAM全為空格
- //**********************************
- void clrram_lcd (void)
- {
- wr_i_lcd(0x30);
- wr_i_lcd(0x01);
- }
- //***********************************
- //對液晶寫數據
- //content為要寫入的數據
- //***********************************
- void wr_d_lcd(uchar content)
- {
- // busy_lcd();
- rs=1;
- rw=0;
- lcddata=swapbit(content);
- e=1;
- ;
- e=0;
- }
- //********************************
- //對液晶寫指令
- //content為要寫入的指令代碼
- //*****************************
- void wr_i_lcd(uchar content)
- {
- // busy_lcd();
- rs=0;
- rw=0;
- lcddata=swapbit(content);
- e=1;
- ;
- e=0;
- }
- //********************************
- //液晶檢測忙狀態
- //在寫入之前必須執行
- //********************************
- void busy_lcd(void)
- {
- lcddata=0xff;
- rs=0;
- rw=1;
- e =1;
- while(busy==1);
- e =0;
- }
- //********************************
- //指定要顯示字符的坐標
- //*******************************
- void gotoxy(unsigned char y, unsigned char x)
- {
- if(y==1)
- wr_i_lcd(0x80|x);
- if(y==2)
- wr_i_lcd(0x90|x);
- if(y==3)
- wr_i_lcd((0x80|x)+8);
- if(y==4)
- wr_i_lcd((0x90|x)+8);
- }
- //**********************************
- //液晶顯示字符串程序
- //**********************************
- void print(uchar *str)
- {
- while(*str!='\0')
- {
- wr_d_lcd(*str);
- str++;
- }
- }
- //***************************************
- //液晶顯示主程序模塊
- //***************************************
- void show()
- {
- if(nn<10)
- {
- gotoxy(1,0);
- print("按鍵選擇貨物:");
- mdelay(10);
- gotoxy(2,0);
- print("①礦泉水(1.5元)");
- mdelay(10); //掃描延時
- gotoxy(3,0);
- print("②紅茶(3元) ");
- mdelay(10); //掃描延時
- gotoxy(4,0);
- print("③綠茶(4元)");
- mdelay(10); //掃描延時
- }
- clrram_lcd ();
- if(nn>11)
- {
- gotoxy(1,0);
- print("④啤酒(5元)");
- mdelay(10);
- gotoxy(2,0);
- print("⑤紅牛(6元)");
- mdelay(10); //掃描延時
- gotoxy(3,0);
- print("選定后投入硬幣");
- mdelay(10); //掃描延時
- }
- }
- //***************************************
- //按鍵選擇貨物
- //***************************************
- void key()
- {
- if(K4==0)//按鍵1
- {
- clrram_lcd ();
- while(1)
- {
- if(m==6)beep=0;
- if(m==5)beep=1;
- if(m==0)
- {
- if(0<money)
- {
- clrram_lcd ();
- gotoxy(1,0);
- print("投幣不足購買失敗");
- mdelay(10);
- gotoxy(2,0);
- print("退錢: 元");
- mdelay(10);
- Time[0]=money/10+'0';
- Time[1]='.';
- Time[2]=money%10+'0';
- Time[3]='\0';
- gotoxy(2,3);
- print(Time);
- mdelay(6000);
- money=0;
- }
- clrram_lcd ();
- break;
- }
- gotoxy(1,0);
- print("已選礦泉水");
- mdelay(10);
- gotoxy(2,0);
- print("貨物價格:1.5元");
- mdelay(10);
- gotoxy(3,0);
- print("投幣金額: 元");
- mdelay(10);
- gotoxy(4,0);
- print("規定時間:");
- mdelay(10);
- if(n==0)
- {
- gotoxy(3,5);
- print(Time);
- mdelay(100);
- }
- if(n==1)
- {
- gotoxy(4,7);
- print(Time);
- mdelay(10);
- }
- if(K1==0)
- {
- while(K1==0);
- mdelay(10);
- money=money+100;
- }
- if(K2==0)
- {
- while(K2==0);
- mdelay(10);
- money=money+50;
- }
- if(K3==0)
- {
- while(K3==0);
- mdelay(10);
- money=money+10;
- }
- if(money>=15)
- {
- clrram_lcd ();
- gotoxy(1,0);
- print("礦泉水購買成功");
- mdelay(10);
- gotoxy(2,0);
- print("找錢: 元");
- mdelay(10);
- du=money-15;
- Time[0]=du/10+'0';
- Time[1]='.';
- Time[2]=du%10+'0';
- Time[3]='\0';
- gotoxy(2,3);
- print(Time);
- mdelay(6000);
- money=0;
- clrram_lcd ();
- break;
- }
- }
- }
- if(K5==0)//按鍵2
- {
- clrram_lcd ();
- while(1)
- {
- if(m==6)beep=0;
- if(m==5)beep=1;
- if(m==0)
- {
- if(0<money<30)
- {
- clrram_lcd ();
- gotoxy(1,0);
- print("投幣不足購買失敗");
- mdelay(10);
- gotoxy(2,0);
- print("退錢: 元");
- mdelay(10);
- Time[0]=money/10+'0';
- Time[1]='.';
- Time[2]=money%10+'0';
- Time[3]='\0';
- gotoxy(2,3);
- print(Time);
- mdelay(6000);
- money=0;
- }
- clrram_lcd ();
- break;
- }
- gotoxy(1,0);
- print("已選紅茶");
- mdelay(10);
- gotoxy(2,0);
- print("貨物價格:3元");
- mdelay(10);
- gotoxy(3,0);
- print("投幣金額: 元");
- mdelay(10);
- gotoxy(4,0);
- print("規定時間:");
- mdelay(10);
- if(n==0)
- {
- gotoxy(3,5);
- print(Time);
- mdelay(100);
- }
- if(n==1)
- {
- gotoxy(4,7);
- print(Time);
- mdelay(10);
- }
- if(K1==0)
- {
- while(K1==0);
- mdelay(10);
- money=money+100;
- }
- if(K2==0)
- {
- while(K2==0);
- mdelay(10);
- money=money+50;
- }
- if(K3==0)
- {
- while(K3==0);
- mdelay(10);
- money=money+10;
- }
- if(money>=30)
- {
- clrram_lcd ();
- gotoxy(1,0);
- print("紅茶購買成功");
- mdelay(10);
- gotoxy(2,0);
- print("找錢: 元");
- mdelay(10);
- du=money-30;
- Time[0]=du/10+'0';
- Time[1]='.';
- Time[2]=du%10+'0';
- Time[3]='\0';
- gotoxy(2,3);
- print(Time);
- mdelay(6000);
- money=0;
- clrram_lcd ();
- break;
- }
- }
- }
- if(K6==0)//按鍵3
- {
- if(m==6)beep=0;
- if(m==5)beep=1;
- clrram_lcd ();
- while(1)
- {
- if(m==0)
- {
- if(0<money<40)
- {
- clrram_lcd ();
- gotoxy(1,0);
- print("投幣不足購買失敗");
- mdelay(10);
- gotoxy(2,0);
- print("退錢: 元");
- mdelay(10);
- Time[0]=money/10+'0';
- Time[1]='.';
- Time[2]=money%10+'0';
- Time[3]='\0';
- gotoxy(2,3);
- print(Time);
- mdelay(6000);
- money=0;
- }
- clrram_lcd ();
- break;
- }
- gotoxy(1,0);
- print("已選綠茶");
- mdelay(10);
- gotoxy(2,0);
- print("貨物價格:4元");
- mdelay(10);
- gotoxy(3,0);
- print("投幣金額: 元");
- mdelay(10);
- gotoxy(4,0);
- print("規定時間:");
- mdelay(10);
- if(n==0)
- {
- gotoxy(3,5);
- print(Time);
- mdelay(100);
- }
- if(n==1)
- {
- gotoxy(4,7);
- print(Time);
- mdelay(10);
- }
- if(K1==0)
- {
- while(K1==0);
- mdelay(10);
- money=money+100;
- }
- if(K2==0)
- {
- while(K2==0);
- mdelay(10);
- money=money+50;
- }
- if(K3==0)
- {
- while(K3==0);
- mdelay(10);
- money=money+10;
- }
- if(money>=40)
- {
- clrram_lcd ();
- gotoxy(1,0);
- print("綠茶購買成功");
- mdelay(10);
- gotoxy(2,0);
- print("找錢: 元");
- mdelay(10);
- du=money-40;
- Time[0]=du/10+'0';
- Time[1]='.';
- Time[2]=du%10+'0';
- Time[3]='\0';
- gotoxy(2,3);
- print(Time);
- mdelay(6000);
- money=0;
- clrram_lcd ();
- break;
- }
- }
- }
- if(K7==0)//按鍵4
- {
- if(m==6)beep=0;
- if(m==5)beep=1;
- m=30;
- clrram_lcd ();
- while(1)
- {
- if(m==0)
- {
- if(0<money<50)
- {
- clrram_lcd ();
- gotoxy(1,0);
- print("投幣不足購買失敗");
- mdelay(10);
- gotoxy(2,0);
- print("退錢: 元");
- mdelay(10);
- Time[0]=money/10+'0';
- Time[1]='.';
- Time[2]=money%10+'0';
- Time[3]='\0';
- gotoxy(2,3);
- print(Time);
- mdelay(6000);
- money=0;
- }
- clrram_lcd ();
- break;
- }
- gotoxy(1,0);
- print("已選啤酒");
- mdelay(10);
- gotoxy(2,0);
- print("貨物價格:5元");
- mdelay(10);
- gotoxy(3,0);
- print("投幣金額: 元");
- mdelay(10);
- gotoxy(4,0);
- print("規定時間:");
- mdelay(10);
- if(n==0)
- {
- gotoxy(3,5);
- print(Time);
- mdelay(100);
- }
- if(n==1)
- {
- gotoxy(4,7);
- print(Time);
- mdelay(10);
- }
- if(K1==0)
- {
- while(K1==0);
- mdelay(10);
- money=money+100;
- }
- if(K2==0)
- {
- while(K2==0);
- mdelay(10);
- money=money+50;
- }
- if(K3==0)
- {
- while(K3==0);
- mdelay(10);
- money=money+10;
- }
- if(money>=50)
- {
- clrram_lcd ();
- gotoxy(1,0);
- print("啤酒買成功");
- mdelay(10);
- gotoxy(2,0);
- print("找錢: 元");
- mdelay(10);
- du=money-50;
- Time[0]=du/10+'0';
- Time[1]='.';
- Time[2]=du%10+'0';
- Time[3]='\0';
- gotoxy(2,3);
- print(Time);
- money=0;
- clrram_lcd ();
- break;
- }
- }
- }
- if(K8==0)//按鍵5
- {
- if(m==6)beep=0;
- if(m==5)beep=1;
- m=30;
- clrram_lcd ();
- while(1)
- {
- if(m==0)
- {
- if(0<money<60)
- {
- clrram_lcd ();
- gotoxy(1,0);
- print("投幣不足購買失敗");
- mdelay(10);
- gotoxy(2,0);
- print("退錢: 元");
- mdelay(10);
- Time[0]=money/10+'0';
- Time[1]='.';
- Time[2]=money%10+'0';
- Time[3]='\0';
- gotoxy(2,3);
- print(Time);
- money=0;
- }
- clrram_lcd ();
- break;
- }
- gotoxy(1,0);
- print("已選紅牛");
- mdelay(10);
- gotoxy(2,0);
- print("貨物價格:6元");
- mdelay(10);
- gotoxy(3,0);
- print("投幣金額: 元");
- mdelay(10);
- gotoxy(4,0);
- print("規定時間:");
- mdelay(10);
- if(n==0)
- {
- gotoxy(3,5);
- print(Time);
- mdelay(100);
- }
- if(n==1)
- {
- gotoxy(4,7);
- print(Time);
- mdelay(10);
- }
- if(K1==0)
- {
- while(K1==0);
- mdelay(10);
- money=money+100;
- }
- if(K2==0)
- {
- while(K2==0);
- mdelay(10);
- money=money+50;
- }
- if(K3==0)
- {
- while(K3==0);
- mdelay(10);
- money=money+10;
- }
- if(K1==0)
- {
- while(K1==0);
- mdelay(10);
- money=money+100;
- }
- if(K2==0)
- {
- while(K2==0);
- mdelay(10);
- money=money+50;
- }
- if(K3==0)
- {
- while(K3==0);
- mdelay(10);
- money=money+10;
- }
- if(money>=60)
- {
- clrram_lcd ();
- gotoxy(1,0);
- print("紅牛買成功");
- mdelay(10);
- gotoxy(2,0);
- print("找錢: 元");
- mdelay(10);
- du=money-60;
- Time[0]=du/10+'0';
- Time[1]='.';
- Time[2]=du%10+'0';
- Time[3]='\0';
- gotoxy(2,3);
- print(Time);
- money=0;
- clrram_lcd ();
- break;
- }
- }
- }
- }
- //************************************
- //主程序
- //*************************************
- main()
- {
- TMOD=0x01; //T0 工作在方式1 16位計數器
- TH0=(65536-5000)/256; //預先 設定定時器 初值,50毫秒
- TL0=(65536-5000)%256;
- EA=1; //開啟 總中斷
- ET0=1; //開啟定時器 0 中斷
- TR0=1; //定時器 0 啟動計數
- init_lcd();
- clrram_lcd();
- while(1)
- {
- show();
- key();
- }
- }
- void time0(void) interrupt 1
- {
- TH0=(65536-50000)/256; //重新設置定時器 初值,產生50MS定時中斷
- TL0=(65536-50000)%256;
- count++; //50ms太短,閃爍頻率太快
- if(count==10)
- {
- if(n==0)
- {
- Time[0]=m/10+'0';
- Time[1]=m%10+'0';
- Time[2]='\0';
- }
- if(n==1)
- {
- Time[0]=money/10+'0';
- Time[1]='.';
- Time[2]=money%10+'0';
- }
- Time[3]='\0';
- Time[4]='\0';
- count=0;
- if(m==0)m=30;
- n++;
- if(n==2)
- {
- m--;
- n=0;
- }
- nn++;
- if(nn==20)
- {
- nn=0;
- }
- }
- }
復制代碼 |