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/nQfu 著作权归作者所有。请勿转载和采集!