单片机的独立按键学习,实现60秒循环数字的启动暂停与清零
想要学习单片机必须要准备单片机开发板一块,和单片机C语言版本的书籍,我会把每天录制视频的源代码到头条,并且录制相同文章名字视频到西瓜视频,如果你再学习独立按键这一块有不明白的地方可以点开我的头像,进入我的主页,点击视频观看学习。
目前视频录制了9个左右,没学过的结合书本,结合我的视频,都可以学会。
话不多说先上今天的仿真效果图:
然后下面是本仿真图的源代码:如果有错误,请大神指教。
#include<reg52.h> //头文件,把芯片的数据地址编译成C语言可以调用的句子。
#define uchar unsigned char //宏定义 把后面的长句 给他们一个新定义,实现同样的功能。
#define uint unsigned int //宏定义 把后面的长句 给他们一个新定义,实现同样的功能。
sbit dula=P2^0; //把p2.0给他一个新名字叫dula 用于数码管锁存器段选位置
sbit wela=P2^1;//把p2.1给他一个新名字叫wela 用于数码管锁存器位选的位置
sbit key1=P3^0; //同样的,给按键1和按键2分别找两个串行口来对接。
sbit key2=P3^1;
uchar code table[]={0x3f,0x06,0x5b,0x4f, //定义的一个数码管的编码表。
0x66,0x6d,0x7d,0x07, //阴极数码管
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delayms(uint); //延时子程序
void display(uchar,uchar); //显示子程序
void keyscan(); //独立按键子程序
uchar num,shi,ge,num1; //定义四个无符号字符
void main() //主程序
{
TMOD=0x01; //中断确定工作方式,和选择定时器0
TH0=(65536-45872)/256; //装初值,
TL0=(65536-45872)%256; //对这一块不太明白的,可以看我上一个视频
EA=1; //开启总的中断
ET0=1; ////开启定时器/计数器寄存器中断 开启中断具体定时器中断
while(1) //循环式判断,
{
keyscan(); // 调用按键子程序,对按键子程序进项不断地扫描
display(shi,ge);//调用显示子程序,对显示子程序,进行不断地刷新显示
}
}
void display(uchar shi,uchar ge) //显示子函数,并且调用形式参数
{
P0=0x00; //为了在仿真电路让P0口没有其他的数据来影响段选显示的/阴极数码管,高电平有效。让数码管变得干净。
dula=1; //锁存器开
P0=table[shi]; 把十位的数字送到P0
dula=0; //锁存器关闭// 段选位置
P0=0XFF; //低电平有效,让位选的位置变得干净。
wela=1; //位选锁存器开启。//低电平有效。
P0=0xfe;//送入位选的 选位。
wela=0; 位选锁存器关闭。
delayms(5); /延时5毫秒。
P0=0x00;
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfd; //选择数码管的第一个位置 来显示数字
wela=0;
delayms(5);
}
void delayms(uint xms) //延时子程序
{
uint i,j; //定义两个无符号字符
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void keyscan() //今天的重点:按键扫描子程序
{
if(key1==0) //判断按键1 有没有按下
{
delayms(10); //延时10毫秒,延时去抖动
if(key1==0) //在判断一次按键1有没有按下
{
while(!key1); //等待按键释放,如果没有释放那么按键始终等于0,也就是低电平。按键按下去了,
TR0=~TR0; //定时器的开启与关闭,开启 开始计数,关闭就会暂停
}
}
if(key2==0) //判断按键2是否按下
{
delayms(10); //延时去抖动
if(key2==0) //再次判断
{
num1=0;// num1是送给数码管的数值,0-60根据定时器变化的值。
while(!key2);//判断按键2时候松开,没有松开始终等于低电平。
}
}
}
void T0_time() interrupt 1 //定时器的子程序
{
TH0=(65536-45872)/256; //重装初值,这一块如果听不懂,可以去看上个视频。
TL0=(65536-45872)%256;
num++;
if(num==20) //定时器每次50毫秒,这里加个20次的循环,用来凑足1秒钟。
{
num=0;
num1++;
if(num1==60) //给num1进行每一秒钟数值变化送数值。
num1=0;
shi = num1/10; //求模的数,送到shi
ge = num1%10;
}
}
单片机控制数码管显示不同数字
很多电子产品上都有用到数码管来做指示作用,比如电子秤上使用数码管来显示体重,电饭锅上面使用数码管来显示煮饭时间等等。数码管显示的数字是通过单片机控制的,本篇文章为你讲述其中的原理。
文章涉及到的电路图和程序源码大家可以私信作者获取。
想要使用单片机来控制数码管显示不同数字,那么我们先要了解数码管的内部结构以及器驱动原理。数码管可以看成是由8个发光二极管组成,我们分别给这8个数码管编号为a,b,c,d,e,f,g,SP(SP为小数点,七段数码管没有小数点),共阴极数码管就是这8个二极管的阴极连接在一起,共阳极数码管就是这8个二极管的阳极连接在一起。在控制过程中,我们把不同的二极管点亮,数码管就会给我们显示出不同的数字,例如我们把b,c两个二极管点亮,其他二极管熄灭,那么数码管显示的就是数字1;或者我们把a,b,c,d,e,f,6个数码点亮,数码管就给我们显示的是数字0.
接下来我们搭建控制电路图,添加一个7段共阴极数码管,a-g分别接单片机P2.0-P2.6.
看到电路图,我们应该就能想到,只要我们使单片机的P2口输出不同的高低电平,就可以让数码管显示不同的数字。假如我们要显示数字1,那么我们就想要点亮b,c二极管且熄灭其他二极管,所以我们需要将单片机P2.1和P2.2输出高电平,其他的输出低电平,如下图(红色代表高电平,蓝色代表低电平)。
以此类推,其他数字我们也可以显示出来,我们把P2.0-P2.7看成一个从低到高的8位数,其某一位为1则代表其对应的二极管亮,为0就代表其对应的二极管灭,那么我们就可以得到一个表格,该表格代表数码管显示0-F的值,其表格如下:
SEG_ComAnodeTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
我们还是以1来分析,1对应表格中的数字为0x06,我们转换成二进制就是00000110(b),第2和第3位为1,其他位为0,也就是说b,c二极管会亮,其他二极管会灭,所以只要我们把这个数字赋值给P2,那么数码管就会给我显示数字1.
到这里就把共阴极数码管显示原理给大家讲解了,大家可以以此类推,得到共阳极数码管的显示表格。如有不明白的地方,可以把疑惑的地方私信给我,演示程序设有一个按键,系统上电显示0,按键每按下一次,显示的数字加1,加到最大就又回到0开始。
下面给大家讲解一下程序设计思路:定义一个变量u8SegNumber,当按键按下一次,u8SegNumber就+1,然后我们把u8SegNumber的值作为共阴数码管显示表格的下标值,最后把对应的值赋值给单片机的P2口,这样就达到了我们想要的结果。
if(pTIM_Delay(0,200)) //200ms任务
{
if(SysDataVar.u8SegNumber > 15) //防止溢出
SysDataVar.u8SegNumber = 0;
LED = SEG_ComAnodeTable[SysDataVar.u8SegNumber]; //赋值
}
if(pTIM_Delay(1,5)) //5ms任务
{
Key_Sanf(); //按键检测
}
到这里单个数码管显示数字的原理都给大家讲解清楚了,大家可以尝试显示两个数码管,其原理和显示单个数码管不太一样,我也将在下一讲为你讲解,欢迎关注作者,及时获取更新信息。
相关问答
单片机 16个 按键 每个键分别1~16的 数字 ,在数码管 显示 ,为何显...16个按键每个键分别0~15的数字,在数码管显示,#include
通过51单片机控制取得按键的值,利用LCD1602液晶屏的驱动码和操作步骤将数字显示在液晶屏上。由于51单片机需要读取按键的值来获取用户的输入,所以需要通过编写...
51 单片机 矩阵键盘如何实现两个键同时按下的时候 显示 其他 数字 ,用c语言程序实现?定义一个按键缓冲区用普通的按键扫描程序,当扫描到有按键按下的时候。按键键的值写入缓冲区。继续扫描直到完成。然后返回缓冲区地址就可以得到多个按键的数...
单片机 0到9怎么表示?在单片机程序中,数字通常有二进制,十进制和十六进制三种表示法,以数字9为例:二进制写成00001001B,B就是二进制的意思,注意,这个字母不能缺少!十进制写...在...
51 单片机 计算器屏幕不 显示数字 ?如果51单片机计算器屏幕不显示数字,可能有几个原因。首先,检查电源供应是否正常,确保屏幕背光和电源电压稳定。其次,检查屏幕连接是否正确,确保连接线没有...
单片机 数码管 显示数字 怎样不闪烁?原因如下1、适当增加数码管的刷新频率2、看看程序是否有中断之类的,处理时间过长,导致刷新频率存在问题.看视频,应该属于此种问题的可能性大一些.测试方...
单片机 单独 按键 -ZOL问答#defineTIMES(20*3600*2L)//1小时3600秒,这个数字超出65536了,所以强制转换...不会有影响啊,K1,K2,K3按键,分别控制LED1,LED2,LED3;定义...
单片机数字 后面的H表示什么?H表示十六进制。1.在数电领域中,单片机常常使用十六进制来表示数值,H就是十六进制的标志。例如,数字0x10H表示十六进制的10,相当于十进制的16。2.十六进制...
单片机 中 数字 钟需要哪些指令?555定时器,时钟发生器,晶振。..555定时器,时钟发生器,晶振。..
单片机 有几个输入?单片机的输入可以分为数字输入和模拟输入两类。数字输入包括通用输入/输出引脚(GPIO)、串行外设输入口等,可以接受来自外部设备的数字信号。模拟输入则是通过...