/按键控制加、减显示00-99(P1接8个独立按键,P10按下为加,P11按下为减,P2 接LED数码管的A- -H并加一个560欧的上拉排阻,P0接数码管DS1- -DS8位选)// 按键控制加、减显示00-99(P1接8个独立按键,P10按下为
include
设计用PLC控制数码管循环显示数字0-9,控制要求如下(1)按下启动按钮后,数码管从0开始显示,1s后显示1,再过1s后显示2,…,显示9,1s后再重新屏示0.如此循环。(2)当按下停止孩钮后,数码管烟灭。7数码营实际上是由7只
delay(7);if(key2==0) { num=0;while(key2==0);} } /*实现定时器1方式1定时1S使得数码管加1显示功能*/ if(key3==0) { delay(7);if(key3==0) { flag = ~flag;while(key3==0);} } }
单片机程序求修改,实现按键控制数码管0-9,急!!!
一、设置延时函数 延时函数在单片机中有着让现实延时的能力,本程序中可以通过采用for循环方式进行延时,具体代码如下:void delay(){ uinti,j;for(i=100;i>0;i--)for(j=1000;j>0;j--);} 二、设置数码管
采用共阴极LED数码管,51单片机P1口输出数据:ORG 0000H JMP MAIN ORG 0100H MAIN:MOV DPTR,#TAB MOV R1,#00H DISP:MOV A,R1 MOVC A,@A+DPTR MOV P1,A LCALL DELAY INC R1 CJNE R1,#0AH,DISP SJMP TAB:
include
while(1){ for(i=8;i>0;i--){ P2=0xff;k=_crol_(k,1);P0=DSY_CODE[8-i];P2=k;DelayMS(3);} } }
假设8个数码管公共端均接地,同时显示1-9\x0d\x0a#include\x0d\x0a#include\x0d\x0a#defineucharunsignedchar\x0d\x0a#defineuintunsignedint\x0d\x0aucharcodeDSY_CODE[]=\x0d\x0a{\x0d\x0a0xc0,0x
51单片机,8个数码管循环显示1-9的C语言程序。
p2.0 = 1; // 2 delay_ms(1000);p2.0 = 0;p2.1 = 1; // 0 delay_ms(1000);p2.1 = 0;p2.2 = 1; // 1 delay_ms(1000);p2.2 = 0;p2.3 = 1; // 4 delay_ms(1000);p2.3 = 0;
key=P1^0;main(){P0=0xff;num=0;while(1) { if(key==0) { while(key==0); P0=led[num]; num++; num%=5; } }}
LED_IO8= 0;delay();} //开始灯全灭 void LED_dengmie(void){ LED_IO1 = 1;LED_IO2 = 1;LED_IO3 = 1;LED_IO4 = 1;LED_IO5 = 1;LED_IO6= 1;LED_IO7= 1;LED_IO8= 1;} main(){ LED_deng
i;while(1) { led=0xfe; for(i=0;i<8;i++) //左到右点亮 { P0=led; led=(led<<1)
1、首先在电脑中新建项目:Keil uVision4 51单片机LED闪烁编程,如下图所示。2、然后设计单片机端口与LED灯相连,如下图所示,输入代码。3、接着创建延迟函数,如下图所示,输入以下代码。4、然后创建C语言主函数,如下图
给你最简单的,看得清楚易懂的,P1口接8位LED,有多种闪烁方式。P2(扫描端在P2口,P3为位选端,注意看代码)口接上两位数码管的话还可以显示00-99的数字:ZHUCX: MOV A,#11111110B MOV P1,A ACALL YANSHI MOV
如何编写一段程序,单片机是51系列的,要求编写8个LED灯有三种以上的闪烁方式,灯闪烁时间0.5S
LJMP MAIN ORG 001BH ;定时器1入口地址 LJMP TIMER1_ISR ORG 0100H MAIN:MOVTMOD,#10H MOVTL1,#0F0H MOVTH1,#0D8H ;赋初值,定时10毫秒 SETBTR1 MOVIE,#88H MOVR2,#20 ;R2的值可以随时修改 MOVR3,#100;100
1、设置定时中断,定时中断时间是5毫秒;2、中断程序完成秒计时,秒数发生变化时,要将秒数对应的显示码放到显示缓冲区;3、每次中断循环显示一位数码管;下面是我曾经写的一个显示程序(显示缓冲区G_Disp_Buf):define
for(t=120;t>0;t--);} void main(){ uchar i=0;P0=0x00;while(1){ P0=~DSY_CODE[i];i=(i+1)%10;/*显示0-9*/ DelayMS(200);} } 下面程序从左到右显示 include
要数码管不停显示,只能用动态显示,但是要看是单片机接数码管是哪个端口,还有是直接接在数码管上还是中间有寄存器,不知74HC595是接在哪的
if(t>500){t=0;led=~led;}//LED闪烁 if(n>1000){n=0;s++;}//如果达到一秒,秒加一 if(s>59){s=0;m++;}//如果达到一分,分加一 if(m>59){m=0;h++;}//如果达到一小时,小时加一 if(h>23){h=
if(n>1000){n=0;s++;}//如果达到一秒,秒加一 if(s>59){s=0;m++;}//如果达到一分,分加一 if(m>59){m=0;h++;}//如果达到一小时,小时加一 if(h>23){h=0;}//如果达到24小时,小时清零 } /***/
用单片机控制一个8段数码管,其循环显示数字0到9,每位数字显示时间为一秒,定时功能用单片机中断显示
int key1,key,disbuf;// 此表为 LED 的字模 0 1 2 3 4 5 6 7 8 9 a b c d e f unsigned char code LED7Code[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,
define uint unsigned int define dataport P1//P1直接驱动数码管的8个阳极 sbit wei1=P3^3;//再有三个管脚接3个三极管驱动数码管的阴极 sbit wei2=P3^4;sbit wei3=P3^5;uint a=0;//中断次数计数,一次50ms,20
;做动态显示也可以,人眼是看不出闪烁的。那样会省点口线,嘿嘿反正你只有2个 数码管没别的东西,就干脆做个静态的咯。怎么也闪烁不了的
define uint unsigned int uchar num=0;//共阴数码管七段码 uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77};void Delay1ms(uint i) //1ms延时程序 { uint j;for(;i>0
51单片机led数码管显示0-99静态程序
兄弟,你刚学的吧,不知道你是大学生还是非大学生的,如果是大学生的话我觉得我不应该回答了,俺只是说方法,不会给什么程序的,当然并不是程序简单我就不写,不是这样的,而是你要弄清电路的工作原理,弄清程序和电路的关系,弄清的硬件,结合程序看就应该能弄清楚了。 数码的显示方式:静态和动态 静态简单,动态是用扫描技术,进行扫描的,就是显示的数据是一样的,不过利用的扫描后,就造成显示的数据不一样了,原因是显示的速度是非常快的,人的眼是分辨不出的。而你的电路采用的静态显示,那么就是数码的共极部分,当然proteus里的数码应该是共阴极的吧,而阳极是送显示的数据,这样显示的方式是静态显示 P0 P2是数码管送显示的数据,当然这两数码管一个显示个位,一个显示十位,那么你要对显示的数据进行处理一下,比如是要显示99: uint a,b; uint k=99; a=99/10;//这里只取十位而已,也就是9 b=99%10//这是求模,相当于数学里说的取余数 然后再将这a和b的数据指向一个数码管显示的代码数组[弄清数码管的显示就知道怎么写出显示代码了] 第一个是个位,先显示个位,数组的运用是利用下标控制的,我们用变量b控制下标。 第二个是十位,也是利用下标控制数组的。 当然这个变量k我们可以先不赋值,让它自增或自减从最大值一直减到最小,就是从99显示到0了, 当然你的电路有些浪费I/O口,两个数码管你把段全部连在一起不就行了,然后把共极各自连接I/O口,利用动态显示,你上图所示的,根本就是静态显示,浪费资源啊,当你在设计产品时是浪费I/O口的, 我认为应该是这样的,这样节省资源,控制也非常方便的,一点儿也不能,这个才是动态显示,利用动态扫描就搞定了,要不然会浪费资源的,俺的基础有限,再说也是自学的,也好久没弄51了,现在在做其经类型的MCU了,兄弟祝你学习有成。 注意要外接上拉电阻的,P0内部没带上拉电阻,要自己接上哦,俺没画上,你做实际产品时不要忘记了。那个lalala有什么用?看程序是在P0口接一个共阳数码管。那同样在P2口再接一个数码管。这样,P0口的数码管显示十位数,P2口的数码管显示个位数。或在P2,P3口各接一个数码管。见下图。 这种接法属于静态显示电路。这个学会后,再练习动态显示电路。
在主函数加一个判断语句就可以。上电复位的函数里吧所有位致零,
硬件电路是什么样的啊? 硬件电路不同 程序也是不一样的 想要得到帮助 就具体说明一下你的硬件 还是硬件也要一同设计呢?
方法: 1:设定一个变量i,可以从0到3循环的变化 2:检测一个经过消抖处理的按键,按一下,i+1 3:当i值为各个值时,执行相应的花样。 流水灯参考程序 #include #include #define uchar unsigned char uchar j,temp; void delay(unsigned int ms) { uchar t; while(ms--) for(t=0;t<123;t++); } void main() { P1=0xff; delay(500); temp=0xfe; //有点怪,led接在P2.3~P2.6 for(j=0;j<4;j++) { P1=temp; delay(500); temp=_crol_(temp,1); } P1=0xff; while(1); }
首先,你的电路图没有给出来,管脚是什么? 其次,我建议还是自己尝试写一写,这个不难,我给你个思路 首先定义变量类似于P1_2 = P1^2这种,先把这八个管脚全部定义好,之后给个for循环,让P1(假设的你LED灯连接的是P1口)口的P1^0~P1^7相关标
仿真图就不上了,按键加在P3.0 #include #include #define uint unsigned int #define uchar unsigned char sbit KEY=P3^0; uchar aa,num,flag; uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; void delay(uint ms) { uchar t; while(ms--) for(t=0;t<123;t++); } void main() { num=0; aa=0; TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; P2=table[0]; while(1) { while(!KEY) { delay(10); if(KEY) { flag++; if(flag==1) TR0=0; if(flag==2) { P2=0x3f; flag=0; } } } if(aa==20) { aa=0; num++; if(num==10) num=0; P2=table[num]; } } } void timer0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; aa++; }
#include #define uchar unsigned char #define uint unsigned int uchar code table[]= { 0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e } ;//共阳极数码管0 为亮 sbit wei=P1^0; void delay(uchar t)//毫秒延 { uint i,j; for(i=0; i<t; i++) for(j=0; j<110; j++); } void display(uchar d) { P1=0x00; wei=1; //第一个数码管点亮 P0=table[d]; } void main() { uchar v,temp; uchar key_l,key_h;// 定义列和行 uchar key; while(1) { P2=0xf0; temp=P2; temp=temp&0xf0; if(temp!=0xf0) //检测到有按键按下 { delay(10);//消抖 if(temp!=0xf0)//再次确认一下有否真的有按下 { temp=P2;//把这次的检测值作为真值 key_l=temp&0xf0; P2=key_l|0x0f;//让低四位置1 1110 1111 temp=P2;//赶紧读取P口值 key_h=temp&0x0f;//得到行值 0000 1110 key=key_l+key_h;//1110 0000 //+ 0000 1110 //ee 1110 1110 } switch(key) { case 0xee:display(0);break; case 0xde:display(1);break; case 0xbe:display(2);break; case 0x7e:display(3);break; case 0xed:display(4);break; case 0xdd:display(5);break; case 0xbd:display(6);break; case 0x7d:display(7);break; case 0xeb:display(8);break; case 0xdb:display(9);break; case 0xbb:display(10);break; case 0x7b:display(11);break; case 0xe7:display(12);break; case 0xd7:display(13);break; case 0xb7:display(14);break; case 0x77:display(15);break; } } } } 把行列扫描的值相加 key=key_l+key_h; 我也是调了很长时间 你要把原理彻底搞明白了 呵呵