//8*8led显示电梯楼层 //processing发送数据 //需要配合processing代码使用

#include <reg51.h> #define uchar unsigned char #define uint unsigned int

//数字0~9的编码 uchar code Table[] = { 0x3C, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, //0 0x18, 0x38, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, //1 0x00, 0x7E, 0x02, 0x02, 0x7E, 0x40, 0x40, 0x7E, //2 0x00, 0x7E, 0x02, 0x02, 0x7E, 0x02, 0x02, 0x7E, //3 0x00, 0x48, 0x48, 0x48, 0x7E, 0x08, 0x08, 0x08, //4 0x00, 0x7E, 0x40, 0x40, 0x7E, 0x02, 0x02, 0x7E, //5 0x00, 0x7C, 0x40, 0x40, 0x7C, 0x44, 0x44, 0x7C, //6 0x00, 0x7C, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, //7 0x00, 0x7C, 0x44, 0x44, 0x7C, 0x44, 0x44, 0x7C, //8 0x00, 0x7E, 0x42, 0x42, 0x7E, 0x02, 0x02, 0x7E //9 };

uchar Current_Level = 1, Dest_Level = 1; //当前楼层和目标楼层 uint r = 0; //控制led显示的计数器 char offset = 0; //控制led显示的偏移量 uchar val = 0; //从processing接收到的数据

void displayDigit(); //显示数字 void serial() interrupt 4; //串口中断函数

void main() { //串口初始化 TMOD = 0x20; //设置计数器1为8位自动重载模式 SCON = 0x50; //设置串口为模式1,允许接收 PCON = 0x00; //波特率不加倍 TH1 = 0xFD; //计数器1初值,用于波特率9600 TL1 = 0xFD; TR1 = 1; //启动计数器1 ES = 1; //允许串口中断 EA = 1; //开全局中断

while (1) { displayDigit(); //显示数字 } }

void serial() interrupt 4 { if (RI == 1) { //如果接收到数据 val = SBUF; //读取数据 RI = 0; //清除接收中断标志位 if (val >= 1 && val <= 9) { //如果数据为1~9之间的数字 Dest_Level = val; //设置目标楼层为该数字 SBUF = val; //向processing发送确认信息 } } }

void displayDigit() { uchar i = Current_Level * 8 + r + offset; //计算要显示的数字在Table中的索引 P0 = ~Table[i]; //在led上显示该数字

//根据目标楼层调整当前楼层的值以及led的显示效果 if (Current_Level < Dest_Level) { //电梯上升 if (++r == 8) { //到达下一个数字 r = 0; if (++offset == 8) { //下一个数字超出led的显示范围,需要移动偏移量 offset = 0; Current_Level++; } } } else if (Current_Level > Dest_Level) { //电梯下降 if (++r == 8) { //到达下一个数字 r = 0; if (--offset == -8) { //下一个数字超出led的显示范围,需要移动偏移量 offset = 0; Current_Level--; } } } else { //电梯停止 if (++r == 8) r = 0; //到达下一个数字 } }

51单片机接收程序优化:8*8 LED 显示电梯楼层

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

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