帮我找一个51单片机自动售货机能实现多款商品能同时出货并且在lcd上显示出货后找零的程序
以下是一个51单片机自动售货机能实现多款商品能同时出货并且在LCD上显示,出货后找零的程序参考:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit KEY1 = P1 ^ 0; //选择商品1的按键
sbit KEY2 = P1 ^ 1; //选择商品2的按键
sbit KEY3 = P1 ^ 2; //选择商品3的按键
sbit SCLK = P2 ^ 0; //SPI时钟线
sbit SDATA = P2 ^ 1; //SPI数据线
sbit RST = P2 ^ 2; //LCD复位线
sbit DC = P2 ^ 3; //LCD数据/命令选择线
sbit CS = P2 ^ 4; //LCD片选线
uchar code num_table[] = { //0~9数字显示表
0x3f, //0
0x06, //1
0x5b, //2
0x4f, //3
0x66, //4
0x6d, //5
0x7d, //6
0x07, //7
0x7f, //8
0x6f //9
};
uchar code price_table[] = { //商品价格表,单位为角
5, //商品1价格
8, //商品2价格
10 //商品3价格
};
uchar num_disp[3] = {0, 0, 0}; //存放LCD上显示的数码
void delay(uint t) { //延时函数,t为延时时间,单位为毫秒
uint i, j;
for (i = t; i > 0; i--)
for (j = 110; j > 0; j--);
}
void SPI_Write(uchar dat) { //SPI写入函数,dat为待写入的数据
uchar i;
for (i = 0; i < 8; i++) {
SDATA = dat >> 7; //先传送高位
dat <<= 1;
SCLK = 0; //置时钟线为0
_nop_(); //延时
_nop_();
SCLK = 1; //置时钟线为1
_nop_();
_nop_();
}
}
void LCD_WriteCmd(uchar cmd) { //LCD写入命令函数,cmd为待写入的命令
DC = 0; //置数据/命令选择线为0
SPI_Write(cmd);
}
void LCD_WriteData(uchar dat) { //LCD写入数据函数,dat为待写入的数据
DC = 1; //置数据/命令选择线为1
SPI_Write(dat);
}
void LCD_Init() { //LCD初始化函数
CS = 0; //片选线置为0
RST = 0; //复位线置为0
delay(10);
RST = 1; //复位线置为1
delay(10);
LCD_WriteCmd(0x01); //清屏
delay(10);
LCD_WriteCmd(0x02); //复位光标
delay(10);
LCD_WriteCmd(0x0c); //显示开,光标关,闪烁关
delay(10);
LCD_WriteCmd(0x06); //光标右移,字符不移动
delay(10);
LCD_WriteCmd(0x80); //设置数据指针到第一行第一列
delay(10);
}
void Disp_Num(uchar num) { //在LCD上显示一个数字,num为待显示的数字
LCD_WriteData(num_table[num]); //写入显示表中对应的数码
}
void Disp_Price(uchar price) { //在LCD上显示商品的价格,price为待显示的价格,单位为角
uchar i, j, k;
i = price / 10; //十位数
j = price % 10; //个位数
k = price / 100; //百位数
if (k > 0) //如果价格超过100角
num_disp[0] = 1; //第一位不显示0
else
num_disp[0] = 0; //第一位显示0
num_disp[1] = i;
num_disp[2] = j;
for (i = 0; i < 3; i++) {
Disp_Num(num_disp[i]); //依次显示每一位数字
delay(5);
}
LCD_WriteData(0xdf); //显示“角”字
LCD_WriteData(0x2e); //显示“.”字
LCD_WriteData(0xdf); //显示“分”字
}
void main() {
uchar key, price, money, change;
LCD_Init(); //LCD初始化
while (1) {
if (KEY1 == 0) { //按下选择商品1的按键
key = 1; //记录选择的商品
price = price_table[0]; //获取商品价格
break; //跳出循环
} else if (KEY2 == 0) { //按下选择商品2的按键
key = 2; //记录选择的商品
price = price_table[1]; //获取商品价格
break; //跳出循环
} else if (KEY3 == 0) { //按下选择商品3的按键
key = 3; //记录选择的商品
price = price_table[2]; //获取商品价格
break; //跳出循环
}
}
Disp_Price(price); //在LCD上显示商品价格
while (1) {
if (money >= price) { //如果已投入的钱大于等于商品价格
change = money - price; //计算找零金额
break; //跳出循环
}
if (KEY1 == 0 && key == 1) { //按下选择商品1的按键,并且当前已选择商品1
money += 5; //投入5角钱
Disp_Price(price - money); //在LCD上显示剩余金额
} else if (KEY2 == 0 && key == 2) { //按下选择商品2的按键,并且当前已选择商品2
money += 5; //投入5角钱
Disp_Price(price - money); //在LCD上显示剩余金额
} else if (KEY3 == 0 && key == 3) { //按下选择商品3的按键,并且当前已选择商品3
money += 5; //投入5角钱
Disp_Price(price - money); //在LCD上显示剩余金额
}
}
Disp_Price(0); //在LCD上显示找零金额为0
while (change > 0) { //如果还需要找零
if (change >= 5) { //如果需要找零5角
Disp_Num(5); //在LCD上显示5角字样
change -= 5; //找零减去5角
} else { //如果需要找零1角
Disp_Num(1); //在LCD上显示1角字样
change -= 1; //找零减去1角
}
delay(500); //延时500ms
}
while (1); //程序结束
}
``
原文地址: https://www.cveoy.top/t/topic/eiFe 著作权归作者所有。请勿转载和采集!