51单片机按键控制数码管程序
51单片机数码管编程题
51单片机数码管编程题一、概述51单片机是一种广泛应用于嵌入式系统的微控制器,它具有丰富的I/O端口和定时器资源,可以方便地与数码管等显示器件连接,实现数字和字符的显示。
数码管编程是51单片机应用开发中一项重要的技能,需要掌握基本的数字电路知识和单片机编程技巧。
二、编程要求本次编程任务是实现一个简单的数码管显示程序,要求能够控制数码管依次显示数字0-9,并且能够在数码管熄灭时进行清零操作。
同时,需要考虑到数码管的显示亮度、闪烁等问题,可以通过调整LED 的亮灭时间来实现。
三、编程思路1. 硬件连接:首先需要将数码管与单片机的I/O端口进行连接,可以使用7段数码管译码器芯片(如74LS379)来实现译码和驱动。
同时,需要为数码管和译码器芯片加上适当的电压和地线。
2. 程序设计:根据要求,程序需要包括显示数字、清零和调整亮度的功能。
可以使用定时器中断的方式来实现定时控制数码管的显示和熄灭。
具体来说,可以定义一个数组来存储数字的编码,然后在中断服务程序中依次取出数组中的数字编码,通过I/O端口输出到数码管上。
同时,可以使用另一个数组来存储清零和调整亮度的控制信号,通过I/O端口输出到数码管驱动芯片上。
3. 调试与优化:在程序编写完成后,需要进行调试和优化,确保数码管的显示效果和亮度达到要求。
可以使用调试器将程序下载到单片机中进行测试,也可以使用示波器和万用表等工具来测量数码管驱动芯片的输出信号和电压是否正常。
四、代码实现以下是一个简单的51单片机数码管显示程序示例:```c#include <reg52.h> //包含51单片机寄存器定义的头文件//定义数码管数字编码数组unsigned char code dongsu[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};void delay(unsigned int time) //延时函数{unsigned int i, j;for(i = 0; i < time; i++)for(j = 0; j < 1275; j++);}void display(unsigned char num) //数码管显示函数{P2 = dongsu[num]; //将数字编码输出到数码管上EA = 1; //开启全局中断ET0 = 1; //开启定时器0中断TF0 = 0; //清除定时器0溢出标志位while(!TF0); //等待定时器中断触发EA = 0; //关闭全局中断}void main() //主函数{while(1) //循环显示数字{display(0); //显示数字0delay(100); //延时一段时间display(1); //显示数字1delay(100); //延时一段时间display(2); //显示数字2delay(100); //延时一段时间display(3); //显示数字3delay(50); //短时间延时后熄灭数码管并清零P2 = 0xff; //清零操作,将所有I/O端口设置为高电平 while(P2 != 0xff); //等待I/O端口电平变化完成}}```以上代码实现了基本的数码管显示功能,可以根据实际需求进行修改和优化。
51单片机+74HC595驱动数码管程序
51单片机+74HC595驱动数码管程序这里是电路图:完整的源码和图纸下载地址:51hei/bbs/dpj-20392-1.html下面是51 单片机驱动74hc595 芯片的程序:#include //包含51 单片机的头文件#include #define uint unsigned int#define uchar unsigned char//sbit sin_595 =P1;//sbit rclk_595 =P1;//sb it sclk_595 =P1 ;//sbit s_clr =P1;sb it a_cp_595 =P2; //串行移位时钟脉冲sh_cp_595sbit b_cp_595 =P2;//输出锁存器控制脉冲st_cp_595//sbit _oe_595 =P1 ; //8 位并行输出使能/禁止(高阻态)sbit ds_595=P2 ; //串行数据输入extern uchar datas[6]; //存放6 个数码管的显示数字uchar ledcode[]={0xC0,// 00xF9,// 10xA4,// 20xB0,// 30x99,// 40x92,// 50x82,// 60xF8,// 70x80,// 80x90,// 90x88,// A0x83,// B0xC6,// C0xA1,// D0x86,// E0x8E// F};void delay(uint z){uint t1,y;for(t1=z;t1>0;t1--)for(y=110;y>0;y--);}voidled_display(void){ uchar i,j; bit testb; uchar bdata movebit[6]; uchar bdata test; //_oe_595=0; //选中数码管for(i=0;i<6;i++) movebit[i]=ledcode[datas[i]]; // P1=0; delay(1); for(i=0;i<6;i++) //数据移位{ test=movebit[i]; for(j=0;j<8;j++) { testb=test&0x80; test=test<<1; if(testb) { ds_595=1; } else {ds_595=0; }a_cp_595=1; a_cp_595=0; } //数据移位} b_cp_595=0; b_cp_595=1; b_cp_595=0;} tips:感谢大家的阅读,本文由我司收集整编。
51单片机键盘数码管显示(带程序)
期中大作业学院:物理与电子信息工程学院课题:【利用8255和51单片机实现数码管显示按键数值的程序】要求:【4*4矩阵键盘,按0到15,数码管上分别显示0~9,A~F】芯片资料:8255:8255是Intel公司生产的可编程并行I/O接口芯片,有3个8位并行I/O口。
具有3个通道3种工作方式的可编程并行接口芯片(40引脚)。
其各口功能可由软件选择,使用灵活,通用性强。
8255可作为单片机与多种外设连接时的中间接口电路。
8255作为主机与外设的连接芯片,必须提供与主机相连的3个总线接口,即数据线、地址线、控制线接口。
同时必须具有与外设连接的接口A、B、C口。
由于8255可编程,所以必须具有逻辑控制部分,因而8255内部结构分为3个部分:与CPU连接部分、与外设连接部分、控制部分。
8255特性:1.一个并行输入/输出的LSI芯片,多功能的I/O器件,可作为CPU总线与外围的接口。
2.具有24个可编程设置的I/O口,即3组8位的I/O口,分别为PA口、PB口和PC 口。
它们又可分为两组12位的I/O口:A组包括A口及C口(高4位,PC4~PC7),B组包括B口及C口(低4位,PC0~PC3)。
A组可设置为基本的I/O口,闪控(STROBE)的I/O闪控式,双向I/O三种模式;B组只能设置为基本I/O或闪控式I/O两种模式,而这些操作模式完全由控制寄存器的控制字决定.引脚说明RESET:复位输入线,当该输入端处于高电平时,所有内部寄存器(包括控制寄存器)均被清除,所有I/O口均被置成输入方式。
CS:芯片选择信号线,当这个输入引脚为低电平时,即CS=0时,表示芯片被选中,允许8255与CPU进行通讯;CS=1时,8255无法与CPU做数据传输。
RD:读信号线,当这个输入引脚为低电平时,即CS=0且RD=0时,允许8255通过数据总线向CPU发送数据或状态信息,即CPU从8255读取信息或数据。
WR:写入信号,当这个输入引脚为低电平时,即CS=0且WR=0时,允许CPU将数据或控制字写入8255。
51单片机数码管显示程序设计
练习3主程序参考:
ORG 0000H LJMP START ORG 000BH LJMP T0SERV ;T0中断入口 ORG 0030H START: MOV SP,#50H ;初始化堆栈 LCALL INIT ;初始化 MOV DISBUF,#0 MOV DISBUF+1,#1 MOV DISBUF+2,#2 MOV DISBUF+3,#3 MOV DISBUF+4,#4 MOV DISBUF+5,#0 MOV FLASH,#11000000B MOV R0,#0 LOOP: MOV DISBUF+5,R0 LCALL DELAY INC R0 CJNE R0,#10,LOOP MOV R0,#0 AJMP LOOP
恢复现场
返回
动态显示参考程序1:定义变量
;--------------------------------------------------------;动态显示程序 ;--------------------------------------------------------;全局变量定义 FLAG EQU 20H ;标志位 DISSEG EQU P0 ;显示段驱动 DISBIT EQU P2 ;显示位驱动P2.7-P2.2 DISBUF EQU 21H ;显示缓冲区首地址21H-26H DISBITBUF EQU 27H ;当前显示位计数器0-5 FLASH EQU 28H ;闪烁控制xxxxxx00,将x=1闪烁,=0不闪 ;小数点的处理: ;若显示‘3’,缓冲区放‘3’,若显示‘3.’,缓冲区放‘3+80H’, 最高位为1 S_PULSE EQU FLAG.0 ;秒脉冲 CNT_2D5MS EQU 2FH ;2.5MS计数器 CNT_10MS1 EQU 30H ;10MS计数器 CN_0D5S EQU 31H ;0.5秒计数器 ;----------------------------------------------------------
51单片机(四位数码管的显示)程序
51单片机(四位数码管的显示)程序基于单片机V1或V2实验系统,编写一个程序,实现以下功能:1)首先在数码管上显示“P_ _ _”4个字符;2)等待按键,如按了任何一个键,则将这4个字符清除,改为显示“0000”4个字符(为数字的0)。
最佳答案下面这个程序是4x4距阵键盘,LED数码管显示,一共可以到0-F显示,你可以稍微改一下就可以实现你的功能了,如还有问题请发信息,希望能帮上你!#include<at89x52.h>unsigned char codeDig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1 ,0x86,0x8e}; //gongyang数码管0-F 代码unsigned char k; //设置全局变量k 为键盘的键值/************************************键盘延时函数****************************/void key_delay(void) //延时函数{int t;for(t=0;t<500;t++);}/************************************键盘扫描函数******************************/void keyscan(void) //键盘扫描函数{unsigned char a;P2 = 0xf0; //键盘初始化if(P2!=0xf0) //有键按下?{key_delay(); //延时if(P2!=0xf0) //确认真的有键按下?{P2 = 0xfe; //使行线P2.4为低电平,其余行为高电平key_delay();a = P2; //a作为缓存switch (a) //开始执行行列扫描{case 0xee:k=15;break;case 0xde:k=11;break;case 0xbe:k=7;break;case 0x7e:k=3;break;default:P2 = 0xfd; //使行线P2.5为低电平,其余行为高电平a = P2;switch (a){case 0xed:k=14;break;case 0xdd:k=10;break;case 0xbd:k=6;break;case 0x7d:k=2;break;default:P2 = 0xfb; //使行线P2.6为低电平,其余行为高电平a = P2;switch (a){case 0xeb:k=13;break;case 0xdb:k=9;break;case 0xbb:k=5;break;case 0x7b:k=1;break;default:P2 = 0xf7; //使行线P2.7为低电平,其余行为高电平a = P2;switch (a){case 0xe7:k=12;break;case 0xd7:k=8;break;case 0xb7:k=4;break;case 0x77:k=0;break;default:break;}}}break;}}}}/****************************** ***主函数*************************************/ void main(void){while(1){keyscan(); //调用键盘扫描函数switch(k) //查找按键对应的数码管显示代码{case 0:P0=Dig[0];break;case 1:P0=Dig[1];break;case 2:P0=Dig[2];break;case 3:P0=Dig[3];break;case 4:P0=Dig[4];break;case 5:P0=Dig[5];break;case 6:P0=Dig[6];break;case 7:P0=Dig[7];break;case 8:P0=Dig[8];break;case 9:P0=Dig[9];break;case 10:P0=Dig[10];break;case 11:P0=Dig[11];break;case 12:P0=Dig[12];break;case 13:P0=Dig[13];break;case 14:P0=Dig[14];break;case 15:P0=Dig[15];break;default:break; //退出}}}/**********************************end***************************************/。
max7219驱动数码管程序(51单片机+STM32 MAX7219数码管程序案例)
SPI1_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB; //高位MSB在先
SPI1_InitStructure.SPI_CPOL = SPI_CPOL_High; //选择了串行时钟的稳态,时钟悬空高
*功能:STM32_SPI1硬件配置初始化
*入口参数:无
*出口参数:无
*说明:STM32_SPI1硬件配置初始化,使用3V3
****************************************************************************/
void SPI1_Init(void)
SPI1_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;//数据捕获于第二个时钟沿
SPI1_InitStructure.SPI_NSS = SPI_NSS_Soft;CPolynomial = 7;//CRC值计算的多项式
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOA,GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;//SPI1相关引脚
51单片机hc595控制一位数码管
/*用hc595控制数码管,显示键盘的值*/#include<reg52.h>#define unchar unsigned char#define unint unsigned intunchar temp,num;sbit scl=P3^6;sbit sda=P3^4;sbit rclk=P3^5; //寄存器时钟unchar code table[]={0x40,0xf9,0x24,0x30,0x99,0x12,0x02,0xf8,0x00,0x10,0xbf,0xb9,0xb6,0}; //数码管编码void delay1()//短延时{;;}void delay(int z) //长延时{int a,b;for(a=0;a<110;a++)for(b=0;b<z;b++);}void init()//初始化{scl=1;sda=1;rclk=0;}void start()//开始条件{scl=1;delay1();sda=1;delay1();sda=0;delay1();}void stop()//停止{scl=1;delay1();sda=0;delay1();sda=1;delay1();}void write(unsigned char temp)//写{int i;start();for(i=0;i<8;i++){scl=0;rclk=0;delay1();sda=(bit)(temp&0x80);delay1();scl=1;delay1();delay1();temp<<=1;} rclk=1;stop();}//键盘扫描unchar scan(){// unchar num,temp;// num=17;P2=0xfd;temp=P2;temp=temp&0xf0;while(temp!=0xf0){P2=0xfd;temp=P2;temp=temp&0xf0;delay(10);while(temp!=0xf0){temp=P2;temp=temp&0xf0;switch(temp){case 0xe0:num=1;break;case 0xd0:num=2;break;case 0xb0:num=3;break;case 0x70:num=4;break;}while(temp!=0xf0){temp=P2;temp=temp&0xf0;}// display(num-1);}}P2=0xfb;temp=P2;temp=temp&0xf0;while(temp!=0xf0){P2=0xfb;temp=P2;temp=temp&0xf0;delay(10);while(temp!=0xf0){temp=P2;switch(temp){case 0xeb:num=5;break;case 0xdb:num=6;break;case 0xbb:num=7;break;case 0x7b:num=8;break;}while(temp!=0xf0){temp=P2;temp=temp&0xf0;}//display(num-1);}}P2=0xf7;temp=P2;temp=temp&0xf0;while(temp!=0xf0){P2=0xf7;temp=P2;temp=temp&0xf0;delay(10);while(temp!=0xf0){temp=P2;switch(temp){case 0xe7:num=9;break;case 0xd7:num=10;break;case 0xb7:num=11;break;case 0x77:num=12;break;}while(temp!=0xf0){temp=P2;temp=temp&0xf0;}// display(num-1);//delay(100);}}return num;}/*void display(unchar num) {P0=table[num-1];delay(10);} */void main()//主函数{init();delay1();while(1)//大循环{write(table[scan()]);}}。
51单片机4位数码管秒表代码
主题:51单片机4位数码管秒表代码内容:1. 介绍51单片机51单片机是一种通用的单片机系列,广泛应用于各种电子设备中。
它具有稳定性好、成本低、易于编程等优点,因此备受电子爱好者和专业工程师的青睐。
2. 4位数码管秒表4位数码管秒表是一种常见的电子计时器,通过LED数码管显示出当前的时间,可以用于各种计时应用,比如比赛计时、实验计时等。
3. 代码编写以下是一段简单的51单片机4位数码管秒表代码:```c#include <reg52.h>#include <intrins.h>// 数码管位选端口sbit wei1 = P2^2;sbit wei2 = P2^3;sbit wei3 = P2^4;sbit wei4 = P2^5;// 数码管显示段选端口sbit se2 = P0^2;sbit se1 = P0^3;sbit se4 = P0^4;sbit se3 = P0^5;unsigned char code smgduan[17] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00}; // 显示0~9,A,b,C,d,E,F,无的值void delay(unsigned int i) { // 延时while(i--);}void display(unsigned char *tab) { // 数码管显示 unsigned char i;for(i=0; i<7; i++) {P0=0; // 清除段选,以选中所显示的数码管 switch(i) { //确定位选case(0):wei1=0;wei2=wei3=wei4=1;break;case(1):wei2=0;wei1=wei3=wei4=1;break;case(2):wei3=0;wei1=wei2=wei4=1;break;case(3):wei4=0;wei1=wei2=wei3=1;break;default:break;}P0=tab[i]; //段码输出delay(5); // 数码管微秒级延迟}}void m本人n() {unsigned char a=0,b=0,c=0,d=0; //时钟的4位数据 unsigned int i=0;wei1=wei2=wei3=wei4=1; //段选、位选初始化while(1) {a++; // 微秒级的计数if(a==100) { //达到100a=0; b++; //b加1if(b==60) { //当b=60时b=0; c++; //c加1if(c==60) { //当c=60时c=0; d++; //d加1if(d==24) { //当d=24时d=0; //归零}}}}display(smgduan+d10); //显示个秒wei1=1;wei2=wei3=wei4=0; //位选delay(500); //延时display(smgduan+c/10+10); //显示十秒wei2=1;wei1=wei3=wei4=0; //位选delay(500); //延时display(smgduan+b10); //显示个分wei3=1;wei1=wei2=wei4=0; //位选delay(500); //延时display(smgduan+b/10+10); //显示十分wei4=1;wei1=wei2=wei3=0; //位选delay(500); //延时if(i++==200) { //当i=200时i=0;}}}```4. 代码分析该代码通过对51单片机的引脚进行控制,实现了4位数码管秒表的计时功能。
51单片机-数码管显示
} void delay(int x) {
int i,j; for(i=0;i<x;i++)
for(j=1;j<120;j++); }
LED字型显示代码表
段符号
十六进制代码
显示 dp
g
f
e
d
c
b
a 共阴极 共阳极
0
0
1
0
2
0
3
0
4
0
5
0
6
0
7
0
8
0
9
0
A0
b
0
C0
d
0
E0
F
0
H0
P0
0
1
1
1
1
1
1
3FH
C0H
0
0
0
0
1
1
0
06H
F9H
1
0
1
1
0
1
1
5BH
A4H
1
0
0
1
1
1
1
4FH
B0H
1
1
0
0
1
Hale Waihona Puke 1066H
99H
1
1
0
1
1
0
1
6DH 92H
1
1
1
1
1
0
1
7DH
1. 静态显示的特点
静态显示就是单片机将所要显示的数据送出去后,数码管始终显示 该数据(不变),到下一次显示时,再传送一次新的显示数据。
51单片机用k1到k3控制数码管移位显示
功能:1.按下K1时加1计数并增加显示位,
2.按下K2时减1计数并减少显示位,
3.按下K3时清零。
#include<reg51.h> //头文件
#define uchar unsigned char //把uchar定义为usigned char为后面定义的时候方便
buffer[keycount-1]=keycount;//按下K1时加1计数并增加显示位
break;
case 0xfd: if(keycount>0) buffer[--keycount]=10;//当P1=0xfd时即P1.1=0,即k2按下
break;按下K2时减1计数并减少显示位
case 0xfb: buffer[0]=0;
#define uint unsigned int
uchar code acode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//其阳极数码管0到9的数字,即为段码
uchar code index[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//位码
{
uchar i;
for(i=0;i<8;i++)
{
P0=0xff;//消除对P0口的影响
P0=acode[buffer[i]];//P0口为连接数码管的端口
P2=index[i];//位选
delay(2) main()//主程序
{
uchar i,key1,keycount=0;//定义变量i,key1,keycount
51单片机 电机控制 输入速度 七段数码管显示 汇编程序
51单片机电机控制输入速度七段数码管
显示汇编程序
简介
本文档介绍了使用51单片机控制电机的方法,以及如何通过输入设置速度,并使用七段数码管显示相关信息的汇编程序。
电机控制
在使用51单片机控制电机之前,需要连接合适的电机驱动模块,并将其与单片机进行连接。
通过控制电机驱动模块的引脚,可以实现电机的正转、反转、停止等功能。
输入速度
可以通过外部的输入设备(如按键、旋钮等)来设置电机的速度。
通过读取输入设备的状态,可以在程序中动态地调整电机的速度。
七段数码管显示
可以通过七段数码管来显示相关信息,如电机的速度、转速等。
通过控制七段数码管的引脚,可以实现在数码管上显示相应的数字
或字符。
汇编程序
使用51汇编语言编写程序,通过设置相应的控制寄存器和引
脚状态,可以实现电机的控制和数码管的显示。
汇编程序需要包括
以下几个方面的功能:
- 初始化相关引脚和寄存器
- 读取输入设备的状态
- 根据输入设备的状态设置电机的速度
- 控制电机的正转、反转、停止等操作
- 更新七段数码管显示的内容
总结
本文档介绍了51单片机控制电机的方法,以及通过输入设备
设置速度和使用七段数码管显示信息的汇编程序。
通过合理地编写
汇编程序,可以实现电机的精确控制和相关信息的显示。
以上是本文档的大致内容,希望对您有所帮助。
51单片机数码管的程序代码
}
3.依次流水作业
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit line= P1^3; //点阵
sbit led= P1^2;
duan=1; P0=table[shi]; _nop_();
//显示十位
_nop_(); _nop_(); duan=0; P0=0xff; wei=1; P0=0xFb; wei=0; delay(3);
duan=1; P0=table[ge]; _nop_(); _nop_(); _nop_(); duan=0; P0=0xff; wei=1; P0=0xF7; wei=0; delay(3);
unsigned char code weisn[]=
{
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uint y,s,a,b;
void delay ( uint);
void main ()
{
P0=0X00;
line=0;//关闭点阵
P0=0xff; led=0;//关闭 led
5,DS18B20 温度计程序代码
#include "reg52.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
sbit ds=P1^4; //18B20 信号端口 sbit duan=P1^0; //数码管段码控制端
基于51单片机按键 长按短按效果 源程序
基于51单片机按键长按短按效果源程序[复制链接] *实验名称:多位数按键加减**晶振:12MHZ*内容:按键加减数字,多个数码管显示,使用定时器做数码管动态扫描**并区别长按短按效果,完全可以应用的实际生产中** ---------------------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义sbit KEY_ADD=P3^3; //定义按键输入端口S17sbit KEY_DEC=P3^2; //S18#define DataPort P1 //定义数据端口程序中遇到DataPort则用P1替换sbit LATCH1=P2^0;//定义锁存使能端口段锁存sbit LATCH2=P2^1;//位锁存sbit P35 = P3^5;//这是为了关闭开发板上的点阵实际应用去掉unsigned char code HEYAO_DuanMa[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//显示段码值89unsigned char code HEYAO_WeiMa[]={0x1,0x2,0x4,0x8,0x10,0x20,0x40,0x80};//分别对应相应的数码管点亮,即位码unsigned char TempData[8]={0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};//存储显示值的全局变量void DelayUs2x(unsigned char t);//函数声明void DelayMs(unsigned char t);void Init_Timer0(void);void Display(unsigned char FirstBit,unsigned char Num);/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char num=0,key_press_num;P35=0; //这是为了关闭开发板上的点阵实际应用去掉KEY_ADD=1; //按键输入端口电平置高KEY_DEC=1;Init_Timer0();while(1) //主循环{if(!KEY_ADD) //如果检测到低电平,说明按键按下{DelayMs(10); //延时去抖,一般10-20msif(!KEY_ADD) //再次确认按键是否按下,没有按下则退出{while(!KEY_ADD){key_press_num++;DelayMs(10); //10x200=2000ms=2sif(key_press_num==200) //大约2s{key_press_num=0; //如果达到长按键标准//则进入长按键动作while(!KEY_ADD) //这里用于识别是否按//键还在按下,如果按//下执行相关动作,否则退出{if(num<99) //加操作num++;//即时把显示数据处理,如果去掉下面2//句处理信息,实际上看不到渐变效果,//而是看到跳变效果//用户可以自行屏蔽测试//分解显示信息,如要显示68,则=6 68%10=8TempData[0]=HEYAO_DuanMa[num/10];TempData[1]=HEYAO_DuanMa[num%10];DelayMs(50);//用于调节长按循环操作//的速度,可以自行调整此值以便达到最佳效果}}}key_press_num=0;//防止累加造成错误识别if(num<99) //加操作num++;}}if(!KEY_DEC) //如果检测到低电平,说明按键按下{DelayMs(10); //延时去抖,一般10-20msif(!KEY_DEC) //再次确认按键是否按下,没有//按下则退出{while(!KEY_DEC){key_press_num++;DelayMs(10);if(key_press_num==200) //大约2s{key_press_num=0;while(!KEY_DEC){if(num>0) //减操作num--;//分解显示信息,如要显示68,则=6 68%10=8TempData[0]=HEYAO_DuanMa[num/10];TempData[1]=HEYAO_DuanMa[num%10];DelayMs(50);//用于调节长按循环操作的速度}}}key_press_num=0;//防止累加造成错误识别if(num>0) //减操作num--;}}//分解显示信息,如要显示68,则=6 68%10=8TempData[0]=HEYAO_DuanMa[num/10];TempData[1]=HEYAO_DuanMa[num%10];// Display(0,8); //显示全部8位//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------uS延时函数,含有输入参数unsigned char t,无返回值unsigned char是定义无符号字符变量,其值的范围是0~255这里使用晶振12M,精确延时请使用汇编,大致延时xx如下T=tx2+5 uS------------------------------------------------*/void DelayUs2x(unsigned char t){while(--t);}/*------------------------------------------------mS延时函数,含有输入参数unsigned char t,无返回值unsigned char是定义无符号字符变量,其值的范围是0~255这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}显示函数,用于动态扫描数码管输入参数FirstBit表示需要显示的第一位,如赋值2表示从第三个数码管开始显示如输入0表示从第一个显示。
51单片机:独立按键与矩阵按键控制数码管
51单⽚机:独⽴按键与矩阵按键控制数码管⼀,独⽴按键注意⼀下⼏点>按下的时候,电压被拉低,所以IO⼝要传低电平( 0x0 )>按下的时候要消除抖动 ( 延时10ms ),在判断,是否还是低电平,再做业务处理下⾯这段程序,就是通过⼀个独⽴按键连接到p1⼝,控制静态数码管的⼀段进⾏亮和灭的切换。
#include <reg52.h>sbit key_control = P1^0;sbit led = P0^0;typedef unsigned char u8;typedef unsigned int u16;void delay( u16 i ){while( i-- );}void key_press(){if( key_control == 0x0 ) {delay( 1110 );if( key_control == 0x0 ){led = ~led;}while( !key_control );}}void main (){/*while( 1 ){if( key_control == 0x0 ) {delay( 1110 ); //⼤概10msif ( key_control == 0x0 ) {led = 1;}}else if( key_control == 0x1 ) {delay( 1110 );if ( key_control == 0x1 ) {led = 0;}}}*/led = 0;while( 1 ) {key_press();}}⼆,当按键⽐较多的时候,⽤矩阵按钮,因为如果不⽤矩阵按钮,⼀个独⽴按键需要⼀个IO⼝,浪费资源。
如: 16个独⽴按键需要16个io⼝,⽽16个矩阵按键(4x4,⼀共8个管脚)需要8个IO⼝下⾯的程序,通过16个矩阵按钮,控制静态数码管,显⽰0~F#include <reg52.h>#define GPIO_DIG P0 //段选数码管#define GPIO_KEY P1 //矩阵按键typedef unsigned char u8;typedef unsigned int u16;void delay( u16 i ){while( i-- );}u8 key_value;//静态数码管段码u8 character [16] = { 0xC0, 0xF9 , 0xA4 , 0xB0 , 0x99 , 0x92,0x82 , 0xF8 , 0x80 , 0x90 , 0x88 , 0x83,0xC6 , 0xA1 , 0x86 , 0x8E};void key_down(){u8 count = 0;//⾏列扫描判断哪个键被按下GPIO_KEY = 0x0F; //⾼四位全部输出低电平,低四位输出⾼电平-->判断被按下的按钮所在的列if( GPIO_KEY != 0x0F ) { //有按键按下delay( 1110 ); //消除抖动if( GPIO_KEY != 0x0F ){switch( GPIO_KEY ){case0x07:key_value = 0; //矩阵第1列的按钮被按下break;case0x0B:key_value = 1; //矩阵第2列的按钮被按下break;case0x0D:key_value = 2; //矩阵第3列的按钮被按下break;case0x0E:key_value = 3; //矩阵第4列的按钮被按下break;}GPIO_KEY = 0xF0; //⾼四位输出⾼电平,低四位输出低电平-->判断被按下的按钮所在的⾏switch( GPIO_KEY ){case0x70:key_value = key_value; //矩阵第1⾏的按钮被按下break;case0xB0:key_value = key_value + 4; //矩阵第2⾏的按钮被按下break;case0xD0:key_value = key_value + 8; //矩阵第3⾏的按钮被按下break;case0xE0:key_value = key_value + 12; //矩阵第4⾏的按钮被按下break;}GPIO_DIG = character[key_value];//如果⼀直按下按键,等待500ms,强制退出while( ( count < 50 ) && ( GPIO_KEY != 0xF0 ) ) {count++;}}}}void main (){while( 1 ) {key_down();}}。
51单片机(四位数码管的显示)程序
51单片机(四位数码管的显示)程序基于单片机V1或V2实验系统,编写一个程序,实现以下功能:1)首先在数码管上显示“P_ _ _”4个字符;2)等待按键,如按了任何一个键,则将这4个字符清除,改为显示“0000”4个字符(为数字的0)。
最佳答案下面这个程序是4x4距阵键盘,LED数码管显示,一共可以到0-F显示,你可以稍微改一下就可以实现你的功能了,如还有问题请发信息,希望能帮上你!#include<at89x52.h>unsigned char codeDig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1 ,0x86,0x8e}; //gongyang数码管0-F 代码unsigned char k; //设置全局变量k 为键盘的键值/************************************键盘延时函数****************************/void key_delay(void) //延时函数{int t;for(t=0;t<500;t++);}/************************************键盘扫描函数******************************/void keyscan(void) //键盘扫描函数{unsigned char a;P2 = 0xf0; //键盘初始化if(P2!=0xf0) //有键按下?{key_delay(); //延时if(P2!=0xf0) //确认真的有键按下?{P2 = 0xfe; //使行线P2.4为低电平,其余行为高电平key_delay();a = P2; //a作为缓存switch (a) //开始执行行列扫描{case 0xee:k=15;break;case 0xde:k=11;break;case 0xbe:k=7;break;case 0x7e:k=3;break;default:P2 = 0xfd; //使行线P2.5为低电平,其余行为高电平a = P2;switch (a){case 0xed:k=14;break;case 0xdd:k=10;break;case 0xbd:k=6;break;case 0x7d:k=2;break;default:P2 = 0xfb; //使行线P2.6为低电平,其余行为高电平a = P2;switch (a){case 0xeb:k=13;break;case 0xdb:k=9;break;case 0xbb:k=5;break;case 0x7b:k=1;break;default:P2 = 0xf7; //使行线P2.7为低电平,其余行为高电平a = P2;switch (a){case 0xe7:k=12;break;case 0xd7:k=8;break;case 0xb7:k=4;break;case 0x77:k=0;break;default:break;}}}break;}}}}/****************************** ***主函数*************************************/ void main(void){while(1){keyscan(); //调用键盘扫描函数switch(k) //查找按键对应的数码管显示代码{case 0:P0=Dig[0];break;case 1:P0=Dig[1];break;case 2:P0=Dig[2];break;case 3:P0=Dig[3];break;case 4:P0=Dig[4];break;case 5:P0=Dig[5];break;case 6:P0=Dig[6];break;case 7:P0=Dig[7];break;case 8:P0=Dig[8];break;case 9:P0=Dig[9];break;case 10:P0=Dig[10];break;case 11:P0=Dig[11];break;case 12:P0=Dig[12];break;case 13:P0=Dig[13];break;case 14:P0=Dig[14];break;case 15:P0=Dig[15];break;default:break; //退出}}}/**********************************end***************************************/。
51单片机hc595控制一位数码管
/*用hc595控制数码管,显示键盘的值*/#include<reg52.h>#define unchar unsigned char#define unint unsigned intunchar temp,num;sbit scl=P3^6;sbit sda=P3^4;sbit rclk=P3^5; //寄存器时钟unchar code table[]={0x40,0xf9,0x24,0x30,0x99,0x12,0x02,0xf8,0x00,0x10,0xbf,0xb9,0xb6,0}; //数码管编码void delay1()//短延时{;;}void delay(int z) //长延时{int a,b;for(a=0;a<110;a++)for(b=0;b<z;b++);}void init()//初始化{scl=1;sda=1;rclk=0;}void start()//开始条件{scl=1;delay1();sda=1;delay1();sda=0;delay1();}void stop()//停止{scl=1;delay1();sda=0;delay1();sda=1;delay1();}void write(unsigned char temp)//写{int i;start();for(i=0;i<8;i++){scl=0;rclk=0;delay1();sda=(bit)(temp&0x80);delay1();scl=1;delay1();delay1();temp<<=1;} rclk=1;stop();}//键盘扫描unchar scan(){// unchar num,temp;// num=17;P2=0xfd;temp=P2;temp=temp&0xf0;while(temp!=0xf0){P2=0xfd;temp=P2;temp=temp&0xf0;delay(10);while(temp!=0xf0){temp=P2;temp=temp&0xf0;switch(temp){case 0xe0:num=1;break;case 0xd0:num=2;break;case 0xb0:num=3;break;case 0x70:num=4;break;}while(temp!=0xf0){temp=P2;temp=temp&0xf0;}// display(num-1);}}P2=0xfb;temp=P2;temp=temp&0xf0;while(temp!=0xf0){P2=0xfb;temp=P2;temp=temp&0xf0;delay(10);while(temp!=0xf0){temp=P2;switch(temp){case 0xeb:num=5;break;case 0xdb:num=6;break;case 0xbb:num=7;break;case 0x7b:num=8;break;}while(temp!=0xf0){temp=P2;temp=temp&0xf0;}//display(num-1);}}P2=0xf7;temp=P2;temp=temp&0xf0;while(temp!=0xf0){P2=0xf7;temp=P2;temp=temp&0xf0;delay(10);while(temp!=0xf0){temp=P2;switch(temp){case 0xe7:num=9;break;case 0xd7:num=10;break;case 0xb7:num=11;break;case 0x77:num=12;break;}while(temp!=0xf0){temp=P2;temp=temp&0xf0;}// display(num-1);//delay(100);}}return num;}/*void display(unchar num) {P0=table[num-1];delay(10);} */void main()//主函数{init();delay1();while(1)//大循环{write(table[scan()]);}}。