一、功能簡介
本項目使用Proteus8仿真STM32單片機控制器,使用LCD1602顯示模塊、矩陣按鍵模塊、LED和蜂鳴器、繼電器模塊等。
主要功能:
系統運行后,LCD1602顯示系統初始界面,可通過矩陣按鍵S1和S5選擇商品,LCD液晶顯示商品價格,共有8種價格商品可供選擇,且選擇的商品對應LED會有指示。可通過S9和S13選擇商品數量,當需要返回時可按下S16鍵,選擇好商品和數量后可按下S12鍵,此時LCD顯示累計商品總價,此時可通過鍵盤輸入投幣數,LCD顯示投幣值,若投幣數值大于等于商品累計總價,則驅動繼電器出貨,且蜂鳴器報警提示,LCD顯示找零數。若投幣數小于商品累計總價,則LCD顯示繼續投幣。
二、軟件設計
//系統參數初始化
void sys_parm_init(void)
{
sys_ctrl.pric=0;
sys_ctrl.num=1;
sys_ctrl.coin=0;
sys_ctrl.runflag=0;
sys_ctrl.change=0;
}
//系統開機界面顯示
void sys_open_show(void)
{
lcd1602_clear();
lcd1602_show_string(0,0," -->Welcome<-- ");
lcd1602_show_string(0,1,"Select an Item..");
}
//系統功能控制
void sys_fun_ctrl(void)
{
u8 key=0;
static u8 sta=0;
//掃描按鍵
key=key_matrix_flip_scan();
//商品選擇和數量顯示
if((key==1 || key==5) && sta==0)
{
sta=1;//僅顯示一次
lcd1602_clear();
lcd1602_show_string(0,0,"Money:");
lcd1602_show_string(10,0,"Num:");
lcd1602_show_string(0,1,"OK");
lcd1602_show_string(14,1,"NO");
}
if(sta)
{
switch(key)
{
case 1://商品價格+
sys_ctrl.pric++;
if(sys_ctrl.pric >8)sys_ctrl.pric=1;
break;
case 5://商品價格-
sys_ctrl.pric--;
if(sys_ctrl.pric<1)sys_ctrl.pric=8;
break;
case 9://商品數量+
sys_ctrl.num++;
if(sys_ctrl.num >9)sys_ctrl.num=1;
break;
case 13://商品數量-
sys_ctrl.num--;
if(sys_ctrl.num< 1)sys_ctrl.num=9;
break;
case 12://OK,商品選擇完成
//總計商品價格
sys_ctrl.pric=sys_ctrl.pric*sys_ctrl.num;
break;
case 16://NO,返回/取消
sta=0;
sys_ctrl.runflag=0;
//關閉LED指示燈
ITEM_LED1=1;ITEM_LED2=1;ITEM_LED3=1;ITEM_LED4=1;
ITEM_LED5=1;ITEM_LED6=1;ITEM_LED7=1;ITEM_LED8=1;
sys_parm_init();
sys_open_show();
break;
case 2://投幣1
sys_ctrl.coin+=1;
break;
case 3://投幣50
sys_ctrl.coin+=50;
break;
case 6://投幣5
sys_ctrl.coin+=5;
break;
case 7://投幣100
sys_ctrl.coin+=100;
break;
case 10://投幣10
sys_ctrl.coin+=10;
break;
case 14://投幣20
sys_ctrl.coin+=20;
break;
}
//商品價格和數量顯示
if(key==1 || key==5 || key==9 || key==13)
{
//商品價格顯示
lcd1602_show_nums(6,0,sys_ctrl.pric,1,0);
//商品數量顯示
lcd1602_show_nums(14,0,sys_ctrl.num,1,0);
//商品LED指示
switch(sys_ctrl.pric)
{
case 1:
ITEM_LED1=0;ITEM_LED2=1;ITEM_LED3=1;ITEM_LED4=1;
ITEM_LED5=1;ITEM_LED6=1;ITEM_LED7=1;ITEM_LED8=1;
break;
case 2:
ITEM_LED1=1;ITEM_LED2=0;ITEM_LED3=1;ITEM_LED4=1;
ITEM_LED5=1;ITEM_LED6=1;ITEM_LED7=1;ITEM_LED8=1;
break;
case 3:
ITEM_LED1=1;ITEM_LED2=1;ITEM_LED3=0;ITEM_LED4=1;
ITEM_LED5=1;ITEM_LED6=1;ITEM_LED7=1;ITEM_LED8=1;
break;
case 4:
ITEM_LED1=1;ITEM_LED2=1;ITEM_LED3=1;ITEM_LED4=0;
ITEM_LED5=1;ITEM_LED6=1;ITEM_LED7=1;ITEM_LED8=1;
break;
case 5:
ITEM_LED1=1;ITEM_LED2=1;ITEM_LED3=1;ITEM_LED4=1;
ITEM_LED5=0;ITEM_LED6=1;ITEM_LED7=1;ITEM_LED8=1;
break;
case 6:
ITEM_LED1=1;ITEM_LED2=1;ITEM_LED3=1;ITEM_LED4=1;
ITEM_LED5=1;ITEM_LED6=0;ITEM_LED7=1;ITEM_LED8=1;
break;
case 7:
ITEM_LED1=1;ITEM_LED2=1;ITEM_LED3=1;ITEM_LED4=1;
ITEM_LED5=1;ITEM_LED6=1;ITEM_LED7=0;ITEM_LED8=1;
break;
case 8:
ITEM_LED1=1;ITEM_LED2=1;ITEM_LED3=1;ITEM_LED4=1;
ITEM_LED5=1;ITEM_LED6=1;ITEM_LED7=1;ITEM_LED8=0;
break;
}
}
//OK,商品選擇完成
if(key==12)
{
lcd1602_clear();
lcd1602_show_string(0,0,"SUM:");
lcd1602_show_string(7,0,"Input:");
lcd1602_show_string(0,1,"OK");
lcd1602_show_string(14,1,"NO");
//商品總價顯示
lcd1602_show_nums(4,0,sys_ctrl.pric,2,0);
sys_ctrl.runflag=1;//商品選擇完成標記
}
}
//投幣顯示
if((key==2 || key==3 || key==6 || key==7 || key==10 || key==14)&& sys_ctrl.runflag==1)
{
lcd1602_show_nums(13,0,sys_ctrl.coin,3,0);
delay_ms(1500);//能顯示一下投幣數
}
if(sys_ctrl.coin!=0 && sys_ctrl.runflag==1)
{
//如果投幣數大于商品價格累計總和,則啟動繼電器出貨和找零
if(sys_ctrl.coin>=sys_ctrl.pric)
{
lcd1602_clear();
lcd1602_show_string(0,0,"Shipment...");
lcd1602_show_string(0,1,"Change:");
//顯示找零數據
sys_ctrl.change=sys_ctrl.coin-sys_ctrl.pric;
lcd1602_show_nums(7,1,sys_ctrl.change,3,0);
RELAY=0;//打開商品輸出
BEEP=0;//打開蜂鳴器
delay_ms(2000);
BEEP=1;//關閉蜂鳴器
RELAY=1;//關閉商品輸出
//關閉LED指示燈
ITEM_LED1=1;ITEM_LED2=1;ITEM_LED3=1;ITEM_LED4=1;
ITEM_LED5=1;ITEM_LED6=1;ITEM_LED7=1;ITEM_LED8=1;
sys_parm_init();
sys_open_show();
sta=0;
sys_ctrl.runflag=0;
}
//如果投幣數小于商品價格累計總和,則顯示繼續投幣提示信息
else
{
lcd1602_show_string(0,0,"Please continue to coin... ");
}
}
}
//應用控制系統
void appdemo_show(void)
{
sys_parm_init();//系統參數初始化
ctrl_pin_init();
key_matrix_init();
BEEP_Init();
lcd1602_init();//LCD1602初始化
sys_open_show();//系統開機界面顯示
while(1)
{
sys_fun_ctrl();//系統功能控制
}
}
三、實驗現象
?
評論
查看更多