以下是一个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); //程序结束
}
``
帮我找一个51单片机自动售货机能实现多款商品能同时出货并且在lcd上显示出货后找零的程序

原文地址: https://www.cveoy.top/t/topic/eiFe 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录