四位一体的共阳数码管中sbit MOSIO=P2^2; sbit R_CLKa=P2^3; sbit S_CLKa=P2^4;什么意思?
2023-06-07 07:57:59
TAG:
sbi
- 蓓蓓
-
这个其实很好理解,程序是不能乱改的,主要要看你单片机引脚的连线和数码管如何连接的。
sbit dula=P2^6;这个表示dula变量控制单片机P2口第6脚的电平高低,同理wela;
P0=0xfe;表示P0口八个引脚上的电平为11111110;你再根据这些电平值就可以判断数码管会发生怎样的变化,同样可以反推,你想数码管显示什么数字就可以通过设置P0口P2口这些引脚的电平,主要问题是你要搞清楚单片机引脚电平的高低和数码管显示的逻辑,代码其实很简单。
- cloudcone
-
这三个变量可能是控制着锁存器或者译码器之类的芯片,并不是直接控制数码管
- 可乐
-
sbit MOSIO=P2^2; sbit R_CLKa=P2^3; sbit S_CLKa=P2^4;什么意思?
我也是这个没弄明白、请问你现在知道了吗?能否给我讲一下、谢谢了
- 瑞瑞爱吃桃
-
你这个程序是一位显示的吧,而且P0口应该接了锁存器之类的器件
- max笔记
-
这个程序简直就是莫名其妙
- 真可
-
你懂了给我们讲讲啊
- gitcloud
-
加QQ详细回答... 1095696200
单片机dula和diola什么意思
这不是单片机中的关键字。是有人自己瞎编的,如此而已。2023-06-06 13:17:482
单片机 LCD为什么要关闭dula,wela
/****************************************************************************************************************** 你这个51学习板是不是郭天祥老师的学习板,或者兼容郭老师学习板,dula=0, weila=0是用锁存74HC573 用来锁存数码管显示的,你写LCD程序所以用不着锁存,LCD数据端口是直接接到P0口德,如果你不把dula=0, weila=0关掉,那么数码管就会亮。****************************************************************************************************************/2023-06-06 13:17:574
苗族人大多都姓什么
苗族有两种姓氏,一种是苗姓,一种是汉姓。苗姓原本固有的;汉姓是后业输入的。因为过去苗族没有文字书写自己的苗姓,却用汉字书写汉姓,以致使人误认为只有汉姓,而不知有苗姓。 苗姓是“子父连名制”。或“子祖连名制”。黔东南支的苗姓是“子父连名”。例如某人的苗名叫做“xa”(夏),其父苗名叫“ju”(久),那么这个人的苗族姓名就是“xaju”(夏久)。川黔滇支和湘西支的苗姓是“子祖连名”或“子父祖”连名。例如某人的苗名叫“du”(都),他的社父苗名叫“la”(拉),那么这个人的苗族姓名就是“dula”(都拉);假如他的高祖或始祖苗名叫“wu”(乌),那么这个人的苗姓名又是“dulawu”(都拉乌)。2023-06-06 13:18:071
#include sbit dula=P2^6; sbit wela=P2^7;看到很多程序都用dula,wela,它们有中文意思吗?
dula 段选wela 位选这个是可以随意定义的,只要不与系统中冲突,有些人就直接写成 duan 和 wei ,是一样的。一般用于接了锁存器的数码管显示,sbit dula=P2^6 表示某个锁存器的锁存端在P2的第7接口上。 对了,另外提一句,这是C写的单片机程序。2023-06-06 13:18:131
dula=1;dula=0;两句写在一起是什么意思,为什么要这样写。还有wela=1;wela=0;也是一样。
你这是C语言还是什么语言啊2023-06-06 13:18:215
单片机用keil编中,wela和dula是什么意思
郭天翔视频看多了吧,一个变量而已,位拉和段拉。把代码放上来更好解释2023-06-06 13:18:352
89c52单片机的wela引脚跟dula引脚在哪,求高手帮忙!
任意IO口都可以定义,并不是固定的哪个脚,一般郭天祥是这样定义的吧,你在好好看看他的教程,应该是数码管那块的,定义的锁存端2023-06-06 13:18:443
void main中 dula=0; wela=0; 分别代表什么意思
void main(){ P0=0; dula=1; dula=0; P0=0xc0; wela=1; wela=0; while(1) { P3=0xfe; temp=P3; temp=temp&0xf0; if(temp!=0xf0) { delay(5); temp=P3; temp=temp&0xf0; if(temp!=0xf0) { switch(temp) { case 0xe0:num=1; break; case 0xd0:num=2; break; case 0xb0:num=3; break; case 0x70:num=4; } P0=table[num-1]; dula=1; dula=0; } } }}再试试看。2023-06-06 13:18:512
求解释单片机数码管显示的一段程序
位选和段选的程序,是根据锁存器的工作原理来编的一般的锁存器如74LS373或573是在锁存引脚高电平时,8个输入端和8个输出端直通,在下降沿时数据被锁存,所以程序中每送一次数据就有 wela=1; wela=0;或 dula=1; dula=0;由于是动态扫描,实际上是一位一位轮换显示,所以每次数码管只亮一个如 P0=0xbf; 化成二进制1011 11112023-06-06 13:19:001
下面红外解码的数码管显示程序中 sbit dula=P2^6; sbit wela=P2^7;分别是什么意思
上面的sbit dula=P2^6; sbit wela=P2^7;分别是什么意思??--为引脚,定义一个变量名称。这里的P2^6和P2^7和IO口的P2^6,P2^7有什么关系??--它们就是它们。dula和wela是用来显示键值所用的数码管的段和位吗?--看程序,它们都干些什么,就知道了。把他们定义成P2^6和P2^7和数码管段与位所连接的IO口有关系吗?--有关、无关,去看电路图。另外uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};是显示这些码代表的键?--这些,是显示数字用的。--是不是代表键,你执行程序,就看出来了。还是用这些码所代表的数码管的段和位或者别的什么的来显示按键值?--试试看。--有些程序,都是瞎编,显示什么,作者自己,都不清楚。2023-06-06 13:19:071
51单片机锁存器控制数码管问题
应该是这样的 你先打开段选 然后输入你要显示的数字,关闭段选 打开位选 选择用哪一个数码管来显示 然后关闭位选 这个程序应该是这样的吧 dula=1; P0=table[a]; dula=0; wela=1; P0=0xfe; wela=0; delay(5) ;这之后再选择别的数码管点亮 这样就达到动态显示的效果了前面说错了 有锁存器的话是可以用同一个IO口就能达到动态显示的目的了2023-06-06 13:19:271
按下16个矩阵键盘依次在数码管上显示1-16的平方。如按下第一个显示1,第二个显示4...
uchar b,bai,shi,ge;改为uchar bai,shi,ge;uint b;uchar 最大值2552023-06-06 13:19:372
数码管前三位显示一个跑表从000到999之间以一秒的速度运行,按下一个独立键盘跑表停止,松手跑表继续运行
前3 位是什么概念?2023-06-06 13:19:442
ds18b20 如何读取温度
好好研究一下数据手册。重点是它的通信协议。你只要按照数据手册上写的通信协议给18B20发送指令就可以了。使用18B20一定要根据你的晶振精确控制好延时。还有就是数据线上要加一个10K左右的上拉电阻。我觉得和使用其它芯片差不多,只是通信协议略有不同。误差无限大我不知道你指的是什么?这个是数字芯片,得到的直接就是数字信号了。得到的数字乘以分辨率0.0625就是温度了。读18B20不要太频繁,太频繁芯片容易升温,测得的温度偏高。2023-06-06 13:19:522
关于单片机c语言中位选段选的问题
低电平有效啊,你直接给他个高电平他没法工作,存储不了数据2023-06-06 13:20:053
C语言单片机编程。详解下面两段代码,解释区别,以及后面的代码载入后问题原因。
我刚开始接触单片机,这个问题我还真不会,坐等答案2023-06-06 13:20:134
看下面一个程序:用中断扫描显示函数,然后用数码管显示出来。
2023-06-06 13:20:211
单片机c语言求救 我做一个4*4的按键扫描, row=P3&0xf0; P3=row|0x0f; col=P3&0x0f; 看不懂中间那句
row=P3&0xf0; 意思是:屏蔽低4位,只取出高4位的值,高4位是多少与完后还是多少。也就是列值 P3=row|0x0f; 意思是:P3口读会现在按下哪个键的值col=P3&0x0f; 意思是:同第一句一样屏蔽高4位,取第四位值。也就是行值。2023-06-06 13:20:281
51单片机 流水灯实现10S,10S后流水灯关闭
#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit dula=P2^6;sbit wela=P2^7;uchar pp,miao=10,aa;uchar code table[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};void delay(uint z) //即延时约z毫秒{ uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--);}void display(uchar num)/*数码管显示函数*/{ uchar shi,ge; shi= num / 10; ge = num % 10; P0=table[shi]; dula=1; dula=0; P0=0xfe; wela=1; wela=0; delay(2); P0=0xff; wela=1; wela=0; P0=table[ge]; dula=1; dula=0; P0=0xfd; wela=1; wela=0; delay(2); P0=0xff; wela=1; wela=0;}void main()/*主函数*/{ TMOD = 0x01; TH0 = (65536 - 45872) / 256; TL0 = (65536 - 45872) % 256; EA = 1; ET0 = 1; TR0 = 1; aa = 0xfe; while(1) { display(miao); //显示在数码管上 P1 = aa; if(pp == 20) { pp = 0; miao--; } if(miao > 0) { if (pp % 10 == 0) aa = _crol_(aa, 1); } else { TR0 = 0; aa = 0xff; } }}/*中断函数*/void T0_time()interrupt 1{ TH0=(65536-45872)/256; //50ms中断一次 TL0=(65536-45872)%256; pp++;}试试看。2023-06-06 13:20:383
郭天祥单片机,为什么delay(3)可以而delay(4)不行????
是编译通不过,还是执行不正常?2023-06-06 13:20:453
sbit DULA = P2^6; sbit WELA = P2^7; WELA=1; P0=0xfe; WELA=0; P0=0xff; DULA=1; P0=0xfe; DULA=0;
共阴极的得0x00消隐2023-06-06 13:21:042
这个中断函数是怎样执行的,他的触发条件是什么??
楼主 你好这个程序和一般的中断程序的分析是一样的。前面初始化完定时器和中断后,就开始进入while循环。当定时器的计数为零时就进入中断函数中执行,执行完以后又跳回中断处继续运行而中断函数中具体实现的功能就是让num这个变量每过一秒自增1,直到68秒后再复位回0.while中就是通过判断num这个变量来控制交通灯。。你应该是想知道while循环中执行到哪会突然产生中断,跳到去中断函数。。具体的中断点应该是不定的,但肯定是在while循环中。因为定时器减一是一个硬件过程,和你程序下的运行过程是独立开的,所以while中的每一句都有可能成为断点。 这也随之产生误差,不过误差应该是在um量级里面, 所以不影响实际的运用。2023-06-06 13:21:121
c语言程序问题,,,下面程序里边的delayms(5)起什么作用啊,求大神解答,在线等
消隐的作用数码管显示过后熄灭并不会马上变黑,要延时等待完全熄灭,不延时的话会有上一次显示的效果,导致显示有重影2023-06-06 13:21:212
四位数码管如何显示
图上管脚定义标的很详细,不知你想要数码管显示什么,2023-06-06 13:21:292
sbitrs=p2^6是什么意思
sbitdula=P2^6是申明U1锁存器的锁存端wela=1是U2锁存器开启dula=1是U1锁存器打开dula=0是U1锁存器关闭2023-06-06 13:21:421
1.数码管前三位显示一个跑表,从000到999之间以1%秒速度运行,
....2023-06-06 13:21:513
c语言在线翻译
wuhensoft这个字母什么意思2023-06-06 13:22:005
数码管前三位显示一个跑表, 从000到999之间以1%秒的速度运行, 当按下一个独立键盘时跑表停止
你看不懂,说明他是错的。程序是void main() {init();while(1){ display(bai,shi,ge); if(s2==0) { delay(10); if(s2==0) { TR0=0; while(!s2) display(bai,shi,ge); TR0=1; } } if(s3==0) { delay(10); if(s3==0) { TR0=0; while(!s3) display(bai,shi,ge); TR0=1; } } if(s4==0) { delay(10); if(s4==0) { TR0=0; while(!s4) display(bai,shi,ge); TR0=1; } } if(s5==0) { delay(10); if(s5==0) { TR0=0; while(!s2) display(bai,shi,ge); TR0=1; } } }}对于你的显示模块,某人不太明白。也不知道你的wela和dula是什么意思。如果显示模块没有错误的话,那么按下键后就可停止计数,直到松开2023-06-06 13:22:162
单片机C语言问题
按下第三个按键后num1就一直为3,所以在主程序的switch处会一直执行init()函数,使num一直为02023-06-06 13:22:251
下面有一段C++的程序 有谁能帮我解释一下吗 谢谢了我怎么就没看出来哪里写0到99循环了
temp++; if(temp==100) { temp=0; } bai=temp/100; shi=temp%100/10; ge=temp%10; }temp不断加1,shi得到十位数,ge得到个位数,加到100时又从0开始2023-06-06 13:22:322
一个很简单的keil的C语言编程错误,求大侠指点哪里错了
uVision2是个相当古老的软件。源文件命名最好不要包含中文,最好遵循8.3命名格式。2023-06-06 13:22:545
请教51单片机前辈们一个关于定时器的问题,中断程序响应以后定时器不是得归零么,为什么我的TL0不是0呢。
TH0=(65536-50000)/256;//重新装初值,因为中断响应后自动清零,开始下一轮计数因为这个代码执行也需要时间,而此刻定时器已经开始重新计时了.所以为了精确最好直接赋值,TH0=60.2023-06-06 13:23:094
单片机串口AD显示
邮箱发给我,我给你一个电子档,可以解释这个,,2023-06-06 13:23:194
AT89S52的T2定时器如何用,如何初始化,定时器中断如何用,最好能举一个实例。
以前弄得,试试吧#include <reg52.H>#include <INTRINS.H>#define uchar unsigned char#define uint unsigned int#define LED_DATA P0sbit DULA=P2^6;sbit WELA=P2^7;sbit LED=P1^7;uchar timer2_ctr,num;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0}; // 0 1 2 3 4 5 6 7 8 9 A B C D E F -//24MHz晶振延时x毫秒函数void delay_ms(uint xms){ uint x,y; for(x=xms; x>0; x--) for(y=248; y>0; y--);}//初始化主函数void init_main(){ DULA=0; //关闭数码管显示 WELA=0; RCAP2H=(0xFFFF-50000)/256; RCAP2L=(0xFFFF-50000)%256; //24MHz晶振下定时25ms,自动重装 TH2=RCAP2H; TL2=RCAP2L; //定时器2赋初值 T2CON=0; //配置定时器2控制寄存器,这里其实不用配置,T2CON上电默认就是0,这里赋值只是为了演示这个寄存器的配置 T2MOD=0; //配置定时器2工作模式寄存器,这里其实不用配置,T2MOD上电默认就是0,这里赋值只是为了演示这个寄存器的配置 IE=0xA0; //1010 0000开总中断,开外定时器2中断,可按位操作:EA=1; ET2=1; TR2=1; //启动定时器2}//数码管显示3位数:0-255void display(uchar num){ uchar gw,sw,bw; bw=num/100; sw=num%100/10; gw=num%10; LED_DATA=0XFE; //1111 1110 WELA=1; _nop_();_nop_(); WELA=0; LED_DATA=table[bw]; DULA=1; _nop_();_nop_(); DULA=0; delay_ms(3); LED_DATA=0XFD; //1111 1101 WELA=1; _nop_();_nop_(); WELA=0; LED_DATA=table[sw]; DULA=1; _nop_();_nop_(); DULA=0; delay_ms(3); LED_DATA=0XFB; //1111 1011 WELA=1; _nop_();_nop_(); WELA=0; LED_DATA=table[gw]; DULA=1; _nop_();_nop_(); DULA=0; delay_ms(3); }void main(){ init_main(); while(1) { display(num); } }void timer2() interrupt 5{ TF2=0; //!!!注意!!! 定时器2必须由软件对溢出标志位清零,硬件不能清零,这里与定时器0和定时器1不同!!! timer2_ctr++; if(timer2_ctr>=40) //定时25ms×40=1000ms即1秒钟,这里模拟一个60秒秒表 { timer2_ctr=0; LED=~LED; num++; if(num>=60) { num=0; } }}2023-06-06 13:23:281
用c语言编译单片机提示错误undefined identifier怎么改呀,大佬们?
错误很多…wela这个符号没有定义过,类似的还有dula。p0这个符号没有定义过。C语言是要区分大小写的,你是不是想要写P0…2023-06-06 13:23:384
关于单片机数码管的小问题
你好,数码管显示的时候频率比较快,人眼分辨不了,所以要加个延时给人眼缓冲一下。2023-06-06 13:23:483
单片机数码管问题
P0=j,j=0xff,j--,肯定错了啊。位选指令写错了。位选应该是0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,位编码不是j自减1的顺序。2023-06-06 13:23:552
在线急等答案,关于51单片机编程的,keil提示有个错误,我看不出来,老师帮忙
仔细看错误信息,说的多明显了。。。参数不匹配,你的实参是unsigned int 而形参是unsigned char2023-06-06 13:24:033
51单片机定时器中断函数,定时器,还有while()这三个之间是怎么跳转,工作流程是什么呢?
①TR0=1;//启动定时器0 这就是 定时器开始 工作了。②程序配置了 定时器的 中断时间为 50ms(12MHz晶振),也就是每隔 50ms 就进入一次中断函数。进入中断后,程序又重新给定时器 定时 50ms,同时 对 中断次数 进行 记录(tt++)。主程序只要查询 记录值(tt),就能知道 定时器 中断了多少次了。③主函数的 while(1)表示 系统是个 循环系统,一直在 循环,不结束。当 定时器 产生中断时,就会 暂停 主函数,这就称为 中断。等 中断执行结束后,又 会的 主函数 被打断的 地方,继续执行主函数的 内容。2023-06-06 13:24:101
最简单51单片机红外编码获取问题
Tc=TH0*256+TL0;相当于TC=TH0<<8+TL0明白没?2023-06-06 13:24:173
error C183: unmodifiable lvalu单片机编程错误指向dula=1;和dula=0;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}最后需要加分号2023-06-06 13:24:361
51单片机 ,用C语言编程 通过独立按键控制蜂鸣器和静态数码管,
U0001f914U0001f914U0001f914U0001f914U0001f914U0001f9142023-06-06 13:24:464
用2位数码管显示矩阵键盘值C语言
#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit dula=P2^6;sbit wela=P2^7;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0};uint jzjp();void shumaguan(uint shu);void delay(uint z);void init();void main(){ init(); while(1) {shumaguan(jzjp()); }}void init(){}void delay(uint z){ uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--);}void shumaguan(uint shu){ uchar bai,shi,ge; bai=shu/100; shi=shu%100/10; ge=shu%10;dula=1; P0=table[bai]; dula=0; P0=0xff; wela=1; P0=0xfe; wela=0; delay(5);dula=1; P0=table[shi]; dula=0; P0=0xff; wela=1; P0=0xfd; wela=0; delay(5);dula=1; P0=table[ge]; dula=0; P0=0xff; wela=1; P0=0xfb; wela=0; delay(5);}uint jzjp(){ uint shu,num; uchar temp; P3=0xfe; temp=P3; temp=P3&0xf0; if(temp!=0xf0) { delay(5); if(temp!=0xf0) { temp=P3; switch(temp) { case 0xee:num=1*1; break; case 0xde:num=2*2; break; case 0xbe:num=3*3; break; case 0x7e:num=4*4; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; shumaguan(shu); } } } P3=0xfd; temp=P3; temp=P3&0xf0; if(temp!=0xf0) { delay(5); if(temp!=0xf0) { temp=P3; switch(temp) { case 0xed:num=5*5; break; case 0xdd:num=6*6; break; case 0xbd:num=7*7; break; case 0x7d:num=8*8; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; shumaguan(shu); } } } P3=0xfb; temp=P3; temp=P3&0xf0; if(temp!=0xf0) { delay(5); if(temp!=0xf0) { temp=P3; switch(temp) { case 0xeb:num=9*9; break; case 0xdb:num=10*10; break; case 0xbb:num=11*11; break; case 0x7b:num=12*12; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; shumaguan(shu); } } } P3=0xf7; temp=P3; temp=P3&0xf0; if(temp!=0xf0) { delay(5); if(temp!=0xf0) { temp=P3; switch(temp) { case 0xe7:num=13*13; break; case 0xd7:num=14*14; break; case 0xb7:num=15*15; break; case 0x77:num=16*16; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; shumaguan(shu); } } } return num;}2023-06-06 13:25:031
用动态扫描方法和定时器1在数码管的前三位显示出秒表,精确到1%秒,即后两位显示1%秒,一直循环下去。
我来帮帮你!2023-06-06 13:25:123
按下16个矩阵键盘依次在数码管上显示1-16的平方。如按下第一个显示1,第二个显示4...
参考答案 博学正直诚信!(励志名言 www2023-06-06 13:25:222
单片机C语言编程——关于按键改变循环流水灯流向(切换运行状态)
1. 把a定位为bit类型,a=~a,改为a = !a;if(a=1)改为if(a),if(a==0)改为if(!a);不知道你的编译器,keil4里,不需修改a的类型,只需将a=~a,改为a = !a即可。2. 把num定义为 signed char;或者把if(num<0)改为if(num==255),不要同时把num改为signed char又把if(num<0)改为if(num==255),只选一个。2023-06-06 13:25:414
求51单片机大神指教IIC总线AT24C02使用。有某个地方不懂。//是关于开机记忆。
void main(){init();sec=read_add(2);//问题就在此处,无论写什么地址,都在数码管上面没有显示。if(sec>100) //若将此处去掉,则没有记忆功能。sec=0; // TMOD=0x01;ET0=1;EA=1;/*************************************************************************************************************** sec = read_add(2); //这里是sec 读取I2C指定2地址的数据,仔细看下面代码 write_add(2,sec); //这里是吧sec写入指定地址2里面,所以上面必须从地址2里面读取数据。if(sec>100) //若将此处去掉,则没有记忆功能。sec=0; // 这一块就是往I2C指定地址写入数值应该0 - 100数值,你把这里去掉了,没有往I2C写入数值你说能读出来数据吗还会有记忆功能吗。***************************************************************************************************************/TH0=(65536-45872)/256;TL0=(65536-45872)%256;TR0=1;while(1) {display(sec/100,sec/10,sec%10);if(write==1) //{ //write=0; //write_add(2,sec); //}}}/*************************************************/void time0() interrupt 1{TH0=(65536-45872)/256;TL0=(65536-45872)%256;tcont++;if(tcont==20){tcont=0;sec++;write=1; //if(sec>100)sec=0;}}2023-06-06 13:25:481
单片机温度检测的程序?
需要详细点。温度传感器用什么?PT100?18b20?显示用什么?液晶?段显?2023-06-06 13:25:572
用c语言编程,用数码管同时显示1-6或自己的学号后六位这6个数字,并让显示的数字循环移动起来
#include<reg52.h>#define uint unsigned int #define uchar unsigned char sbit dula=P2^6;sbit wela=P2^7;uchar num;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void delay(uint z);void main(){ wela=1;//11101010 P0=0xea; wela=0; while(1) { for(num=0;num<16;num++) { dula=1; P0=table[num]; dula=0; delay(1000); } }}void delay(uint z){ uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); }2023-06-06 13:26:111
单片机键盘扫描 这个东西怎么写 我这个为啥不行 P3=0xfd; temp=P3;temp=temp&0xf0;不大明白
P3口是IO口,假设先让P3=0xff,然后你通过某种方式让单片机的P3的其中一个IO接地,然后再移开地,那么那个刚开始的低电平不会变为高电平,还是为低电频,原理就是这样。例如P1.1=1,P1.2=0,这时你把P1.1和P1.2连一起,P1.1就变成0了,移开P1.2也不会是高电平,除非软件从新置一。你的三个语句问题temp=P3,假设P3=0xf2,那么temp就=0xf2;temp=temp&0xf0;意思是两个相与,例如temp=0x0f,temp=temp&0xf0之后temp=0x00;例如temp=0xee,temp=temp&0xf0之后temp=0xe0;而对于P3=fd,因为P3有八个IO输出1和0,你把2进制换成16进制就是P3=0x多少。例如:P3=0xfe,则P3.7输出为0,其他为1.另外给你一个我编的简单程序,有些别人编写的程序有些过于冗长与繁琐,不方便学习。自己编写能比较懂。程序功能,你最多能按下11个数,这些数被存入数组,当你按下确定按钮时,这些数就被P0口以8个灯泡连续显示。按下删除键,则可从新输入上一个数。输入时,每按下一个键,P1.7的灯泡会量一次,告诉你输入成功了。如果你的开发板P3是键盘,P1有灯,那么你可以复制粘贴试试我的程序。具体哪个是确定,哪个是取消,你试试就知道。#include<reg51.h>#define uchar unsigned char#define uint unsigned intvoid delayms(uint s);void cc();uint tel_while,tel_switch;uint num=0;uchar Tel[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};main(){ tel_while=1; while(tel_while) { P3=0xFE;tel_switch=P3;cc(); P3=0xFD;tel_switch=P3;cc(); P3=0xFB;tel_switch=P3;cc(); P3=0xF7;tel_switch=P3;cc(); }for(num=0;num<11;num++){P0=Tel[num];delayms(300);}}void delayms(uint s){ uint a,b; for(a=s;a>0;a--){for(b=1200;b>0;b--);}}void cc(){ switch(tel_switch) { case 0xEE:Tel[num]=0x31;P1=0xFE;num++;delayms(200);P1=0xff;break; case 0xED:Tel[num]=0x32;P1=0xFE;num++;delayms(200);P1=0xff;break; case 0xEB:Tel[num]=0x33;P1=0xFE;num++;delayms(200);P1=0xff;break; case 0xDE:Tel[num]=0x34;P1=0xFE;num++;delayms(200);P1=0xff;break; case 0xDD:Tel[num]=0x35;P1=0xFE;num++;delayms(200);P1=0xff;break; case 0xDB:Tel[num]=0x36;P1=0xFE;num++;delayms(200);P1=0xff;break; case 0xBE:Tel[num]=0x37;P1=0xFE;num++;delayms(200);P1=0xff;break; case 0xBD:Tel[num]=0x38;P1=0xFE;num++;delayms(200);P1=0xff;break; case 0xBB:Tel[num]=0x39;P1=0xFE;num++;delayms(200);P1=0xff;break; case 0x7E:tel_while=0;delayms(200);break; case 0x7D:Tel[num]=0x30;P1=0xFE;num++;delayms(200);P1=0xff;break; case 0x7B:num--;P1=0xFE;delayms(200);P1=0x00;break;default:; }}2023-06-06 13:26:321