遇到一个问题,如何按键按下既能控制流水灯又能把键值在数码管中显示呢?流水灯500ms的延时,和数码管动态刷新延时小于10ms显示有冲突。
bit和sbit,sfr都是c51扩展的变量类型,不是标准c语言类型1.bit类型的值是一个二进制位,不是0就是1,类似布尔类型
2.sbit大部分是用在寄存器中的,方便对寄存器的某位进行操作的。
sbit led1 = p0^0 把p0端口的第0位命名为led1,方便使用
sbit 位变量名=sfr 名称^变量 位地址值
3.sfr也是一种扩充数据类型:,占用一个内存单元,利用它可以访问51单片机内部的所有特殊功能寄存器。如用sfr p1 = 0x90 指定p1来操作地址为0x90的寄存器
改变流水灯的方向
按键控制流水灯实现的功能:1.key1启动键,首次按下可以产生自上向下的流水灯效果
2.key2停止键,按下可以终止流水灯的运动
3.key3和key4分别产生自上向下和自下向上的流水灯效果
实现的方法:1.利用标志位startflag来控制流水灯的开始和停止,初始化定义为0停止,为1时上电便有流水灯效果。用标志位updownflag控制流水灯的方向,初始化的值0,1来控制自上而下还是从下到上
2.利用移位运算符实现流水灯效果
注意:移位运算符实现循环移位才能实现流水灯的效果
c51库函数自带循环移位的效果:crol 循环左移 _cror_循环右移
按键应用层功能函数
void key_service(){ switch(key_scan()) { case 1: startflag = 1;break;//开始 case 2: startflag = 0;break;//停止 case 3: updownflag =1;break;//向上流水灯 case 4: updownflag =0;break;//向下流水灯 default :break; } if(startflag) { p0 = temp; if(updownflag) { temp = (temp>>1)|0x80; //右移一位 if(temp == 0xff) //条件判断给temp重新赋值,实现循环移位功能 temp = 0x7f; } else { temp = (temp<<1)|0x1;//左移一位 if(temp == 0xff) //条件判断给temp重新赋值,实现循环移位功能 temp = 0xfe; } delayxms(500); } }
自己遇到的一个问题:按键按下既能控制流水灯又能把键值在数码管中显示
2个功能分开都能正确运行
糅合在一起就会出问题。
因为延时500ms数码管动态刷新有问题
void main(){ ledbuf[0]=23; ledbuf[1]=23; ledbuf[2]=23; while(1) { key_service(); didplay_service(); }}void didplay_service(){ switch(key_scan()) { case 1:ledbuf[3]=1;break; case 2:ledbuf[3]=2;break; case 3:ledbuf[3]=3;break; case 4:ledbuf[3]=4;break; default :break; } display(); }如果删除500ms的延时,显示效果是这样的.
加上500ms延时,按键好像失效似的,返回显示的键值也不对,很奇怪的问题。
新品来袭!小米官方自曝平板新品 小米平板3要来了
浅谈集成电路设计自动化技术创新中心的意义、定位及建设任务
车载芯片成品制造的创新机会与发展趋势
新能源汽车连接器壳体 抓住新一轮变革的机遇
百度网盘宣布对存储空间方案做出调整 长时间未登录将调整为100G
基于51单片机按键控制流水灯设计
唯一一个.NET的FTP组件
国网山东电力与浪潮合作共建人工智能电力行业生态
通嘉推高压启动大功率PFC LED控制IC
直流离子风机和交流离子风机分别有什么优缺点
GPT-4只是AGI的火花?LLM终将退场,世界模型才是未来
专为iPhone 15而生 慧能泰新一代2C/2C1A多口协议芯片介绍
魅族16s真机曝光屏幕设计没有任何的开孔
2499到底值不值?华为Nova2评测
基于FPGA的VGA时序彩条信号实现方法及其应用
Linux系统驱动开发之字符设备虚拟设备实验
相变存储器和DC-DC转换器在汽车中的应用
UV打印机速度慢的原因_提高UV打印机速度的办法
全面屏大爆发?iphone8、三星note8、小米mix2后vivo也来跟风了?
单bit信号跨时钟域如何传输?