八个灯接在单片机的P1口(P0,P2,P3,P4都一样)while(1){ delay(你想要延时的时间);P1=0xff;delay(你想要延时的时间);P1=0;} 注意led最好加驱动,不然单片机会坏的。
1:首先设定一个变量i,可以是从0到3循环的变化,2:再检测一个经过消抖处理的按键,按一下,即i+1 3:当i值为各个值时,执行相应的变换花样。流水灯参考程序 include include define uchar unsigned char uchar j,tmp
include
//0xfe = 1111 1110,//说明连接在P3.0端口的按键被按下,显示对应的数字然后跳出循环case 0xfd:P0=dofly_table[2];LED1=0;break;//调用表中的第三个//元素 0xa4 下标 0 才表示数组中的第一个元素case 0xfb:P
跪求!!!STC89C52单片机,用八个按键控制分别控制八个LED灯的代码(C语言)
3、创建C语言主函数。设计unsigned char k=0;变量。4、添加循环效果。5、点亮灯,通过k++,改变效果。6、添加延迟效果,单片机就可以控制8个灯依次亮,全亮了,然后再依次灭。
CJNE A,#7, LED7_ON CJNE A,#8, LED8_ON LJMP LOP LED1_ON: MOV P0,#0FEH //亮一个灯 LJMP LOP LED2_ON: MOV P0,#0FDH //亮一个灯 LJMP LOP LED3_ON: MOV P0,#0F8H //亮一个灯
include
sbit key=P1^1;//按键IO,按下低电平 void main(){ while(key);//等待按键按下 P2=0;//8个LED接在P2口的8个IO上,低电平点亮 }
C51单片机编程 求按下1次按键 8盏LED灯全亮源程序
MOV P0,#00H LCALL DELAY MOV P0,#0FFH LCALL DELAY DJNZ R2,LOOP SJMP $DELAY: MOV R4,#200DLY: MOV R5,#250 DJNZ R5,$ DJNZ R4,DLY RET END
P1=b;//P1口接8个LED灯 delay(200);b=_crol_ (b,1);} } void delay(unsigned int z){ unsigned int i;for(;z>0;z--) //延迟时间自己算吧 for(i=110;i>0;i--);} 用汇编写这个容易点 main: mo
while(1){ P3=0xfe;//第一个灯亮 delay();//延时 P3=0xfd;//第二个灯亮 delay();P3=0xfb;//第三个灯亮 delay();P3=0xf7;//第四个灯亮 delay();P3=0xef;//第五个灯亮 delay();P3=0xdf;//第六
假设P1接8 个LED,高电平时LED点亮,主程序如下:void main(void){ uchar i;while(1){ for(i=0;i<7;i++){ P1=1<>i;delay_ms(500);} } }
unsigned LED,i;LED = 0xfe;EA = 0;while(1){ for(i=0;i<7;i++){delay(100);LED = (LED<<1)|0x01;P3 = LED;} for(i=0;i<7;i++){delay(100);LED = (LED>>1)|0x80;P3 = LED;} } } 汇
4、添加循环效果。5、点亮灯,通过k++,改变效果。6、添加延迟效果,单片机就可以控制8个灯依次亮,全亮了,然后再依次灭。
while(1){ P0=0xfe;DelayMS(150);for(s=8;s>1;s--){ P0=_crol_(P0,1); //P0 的值向左循环移动 DelayMS(150);} P0=0x00;DelayMS(150);p0=0xff;DelayMS(150);
单片机用汇编做一个控制8个LED灯泡从左到右依次点亮,最后全部亮,再全部熄灭后重复前面的过程
const uchar led[]={0x01,0x01,0x04,0x08,0x10,0x20,0x40,0x80};void delay(){ uchar i;for(i=0;i<10;i++){;} } void keyscan(){ uchar a,b,c,i;P3=0x0f;a=P3;delay();P3=0xf0;b=P3;delay
八个灯接在单片机的P1口(P0,P2,P3,P4都一样)while(1){ delay(你想要延时的时间);P1=0xff;delay(你想要延时的时间);P1=0;} 注意led最好加驱动,不然单片机会坏的。
//0xfe = 1111 1110,//说明连接在P3.0端口的按键被按下,显示对应的数字然后跳出循环case 0xfd:P0=dofly_table[2];LED1=0;break;//调用表中的第三个//元素 0xa4 下标 0 才表示数组中的第一个元素case 0xfb:P
switch(P1){ case 0xfe:P0=0x01;break;case 0xfd:P0=0x02;break;case 0xfb:P0=0x04;break;case 0xf7:P0=0x08;break;case 0xef:P0=0x10;break;case 0xdf:P0=0x20;break;case 0xbf:P0=0x40;break;case 0x
八个按键可以用00-ff表达就是说如果按键为P2的话就可以P2=0x00此时无按键输出,0x01为第一个按键按下。但是要按照具体的外围情况来写 switch(local){ case 0:P2=0x01;P3=0x01;break;case 1:P2=0x02;P3=0x02;bre
void delay(unsigned int a){ unsigned int i,j;for(i=0;i
单片机中用矩阵键盘的8个按键分别控制8个LED,当按下时亮,松手时灭,用switch语句
sbit S16 = P3^5; //接在P30口的按钮 sbit S15 = P3^4;sbit S14 = P3^6;sbit S13 = P3^7;//有按键控制时要加防抖动处理 void main (void){ unsigned int a = 0; //定义变量 while(1) {
// 单片机控制八个led灯, 仿真实例 可以改为 各种花样。include
1:首先设定一个变量i,可以是从0到3循环的变化,2:再检测一个经过消抖处理的按键,按一下,即i+1 3:当i值为各个值时,执行相应的变换花样。流水灯参考程序 include include define uchar unsigned char uchar j,tmp
先写矩阵读取,在写LED的工作模式,调用对应工作模式就好了
}} void main(void){// Write your code hereunsigned char ct=100;while (1) //主循环{switch(P1) //P1口作为独立按键输入端,检测端口电平并做如下判断{case 0xfe:P0=dofly_table[1];LED0=0;break;//0x
define uchar unsigned charconst tab[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d};const uchar led[]={0x01,0x01,0x04,0x08,0x10,0x20,0x40,0x80};void delay(){ uchar i;for(i=0;i<10;i++){;
用52单片机的4x4矩阵键盘的前八个键分别控制8个LED灯
#include #define uchar unsigned char void delay(unsigned int a) { unsigned int i,j; for(i=0;i<a;i++) for(j=0;j<120;j++); } uchar kbscan(void) { unsigned char sccode,recode; P1=0x0f; //发0扫描,列线输入 if ((P2 & 0x0f) != 0x0f) //有键按下 { delay(20); //延时去抖动 if ((P1&0x0f)!= 0x0f) { sccode = 0xef; //逐行扫描初值 while((sccode&0x01)!=0) { P1=sccode; if((P1&0x0f)!=0x0f) { recode=(P1&0x0f)|0xf0; return((~sccode)+(~recode)); } else sccode=(sccode<<1)|0x01; } } } P0=0xff; return 0; //无键按下,返回0 } main() { unsigned char key; while(1) { key=kbscan(); switch(key) { case 0x11:P0=0xfe;break; case 0x12:P0=0xfd;break; case 0x14:P0=0xfb;break; case 0x18:P0=0xf7;break; //+ case 0x21:P0=0xef;break; case 0x22:P0=0xdf;break; case 0x24:P0=0xbf;break; case 0x28:P0=0x7f;break; //- default:break; } } }[已完成!]电路图如下, #include #include unsigned char code table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};void delay_ms(unsigned int ct) //延时{unsigned int t,i;for(i=0;i<ct;i++){t=115;while(--t);}} void main(void){// Write your code hereunsigned char ct=100;while (1) //主循环{switch(P1) //P1口作为独立按键输入端,检测端口电平并做如下判断{case 0xfe:P0=dofly_table[1];LED0=0;break;//0xfe = 1111 1110,//说明连接在P3.0端口的按键被按下,显示对应的数字然后跳出循环case 0xfd:P0=dofly_table[2];LED1=0;break;//调用表中的第三个//元素 0xa4 下标 0 才表示数组中的第一个元素case 0xfb:P0=table[3];LED2=0; break;case 0xf7:P0=table[4];LED3=0;break;case 0xef:P0=table[5];LED4=0;break;case 0xdf:P0=table[6];LED5=0;break;case 0xbf:P0=table[7];LED6=0;break;case 0x7f:P0=table[8];LED7=0;break;default:break; //如果都没按下,直接跳出}//主循环中添加其他需要一直工作的程序}} //如果帮到你的话,点一个赞吧!硬件电路工程师-帝国卫兵Tt
为了去除按键抖动.因为机械是非常灵敏的,对于人来说,按键有两个状态 ,松开和按下,但是在两个即将触碰到的瞬间,电气设备会产生抖动结果就是设备感觉你非常快的按下松开按下松开.这可能造成你的软件错误.比如你按下按键,有一个变量就自增1,而抖动会让你感觉你按下了一次但是变量自增了N次. 延时是为了使机器在按键抖动的时候不去做任何响应从而去除按键抖动.而这个延时人是感觉不出来的.
四个按键,定义如下: KEY1 BIT P3.0 KEY2 BIT P3.1 KEY3 BIT P3.2 KEY4 BIT P3.3 按键处理程序: ;----------------------------------- READ_KEY: JB KEY1, K2 CALL DELAY JB KEY1, K2 JNB KEY1, $ PUSH ACC INC 75H MOV A, 75H CJNE A, #10, ZINT01 MOV 75H, #0 ZINT01: POP ACC JMP K_EXIT ;--------------- K2: JB KEY2, K3 CALL DELAY JB KEY2, K3 JNB KEY2, $ PUSH ACC INC 76H MOV A, 76H CJNE A, #10, ZINT01 MOV 76H, #0 ZINT01: POP ACC JMP K_EXIT ;--------------- K3: JB KEY3, K4 CALL DELAY JB KEY3, K4 JNB KEY3, $ PUSH ACC DEC 75H MOV A, 75H CJNE A, #255, ZINT03 MOV 75H, #9 ZINT03: POP ACC JMP K_EXIT ;--------------- K4: JB KEY4, K_EXIT CALL DELAY JB KEY4, K_EXIT JNB KEY4, $ PUSH ACC DEC 76H MOV A, 76H CJNE A, #255, ZINT04 MOV 76H, #9 ZINT04: POP ACC K_EXIT: RET ;--------------- DELAY: DJNZ R7, $ DJNZ R7, $ RET ;-----------------------------------
#include #define uchar unsigned char #define uint unsigned int sbit k1=P3^5; void delay_ms(uint xms) { int i, j; for(i=0;i<xms;i++) {for(j=0;j<7;j++);} } void main() { P0=0xFF; k1=1; while(1) { if(k1==0) { uchar led=0xfe; uchar i; for(i=0;i<8;i++) { P0=led; delay_ms(500); led=(led_<<1)|0x01; } } } }
题目不说清楚,真害人 1、是用一个I/O口接了8个LED(当然不是,是某一P口)?是用哪一P口? 2、然后呢?(单片机不会休息的) 3、是用定时器?(还没学到定时器课程吧?)还是延时子程序? 4、是汇编语言程序?还是C语言程序?
电路(图)不合适 1、P0口应该用于输出,你可以接LED,且负极接管脚,正极接VCC. 2、按键任意接P1~P3 仅告诉这些!!
/******************************************************* * 程序名称:hc595.c * 程序功能:595的应用文件 * 程序作者:吴鉴鹰 * 创建时间:2014-3-10 * 修改时间: * 程序版本:V0.1 ******************************************************/ /* * 包含头文件 */ #include "inc/hc595.h" #include "reg51.h" /* * 定义引脚 */ /* 时钟信号线引脚定义 */ sbit HC595CLK = P0^5; /* 片选信号线引脚定义 */ sbit HC595RCK = P0^6; /* 数据输入引脚定义 */ sbit HC595DATA = P0^7; /****************************************************** * 函数名称:SendData * 函数功能:74HC595数据的发送 * 入口参数:unsigned int uiDataOne, unsigned int uiDataTwo * 出口参数:void *******************************************************/ void SendData(unsigned int uiDataOne, unsigned int uiDataTwo) { unsigned int i = 0; /* 将片选信号置为低电平 */ HC595RCK = 0; /* 输入第一个数据:uiDataOne */ for (i = 0; i < 8; i++) { /* 给出脉冲信号,首先将CLK置为0 */ HC595CLK = 0; if (0 != (uiDataOne & 0x80)) { HC595DATA = 1; } else { HC595DATA = 0; } /* 给出脉冲信号,首先将CLK置为1 */ HC595CLK = 1; /* 准备第二个数据 */ uiDataOne = uiDataOne << 1; } /* 输入第二个数据:uiDataTwo */ for (i = 0; i < 8; i++) { /* 给出脉冲信号,首先将CLK置为0 */ HC595CLK = 0; if (0 != (uiDataTwo & 0x80)) { HC595DATA = 1; } else { HC595DATA = 0; } /* 给出脉冲信号,首先将CLK置为1 */ HC595CLK = 1; /* 准备第二个数据 */ uiDataTwo = uiDataTwo << 1; } /* 将片选信号置为高电平 */ HC595RCK = 1; }