数码管:
数码管按段数可分为七段数码管和八段数码管,八段数码管多一个DP(小数点)二极管。也可分为共阳极数码管(低电平点亮)和共阴极数码管(高电平点亮)。本开发板上使用的是2个四位一体共阴极数码管。数码管静态显示是控制数码管的每一个引脚,输入一次电平之后可以一直显示直到再一次改变电平,静态显示会增加IO口的使用,结构复杂成本高,但是会减少占用CPU的时间。数码管动态显示通过位选—段选—清零(消影)来通过发光管余辉和人的视觉暂留是我们感觉出每一位同时显示。 通过74HC138译码器(C为高位B为次高位A为低位)输入高电平输出低电平进行位选,然后通过74HC245驱动数码管段选(a为低位,DP为高位)。
//共阴极数码管段码表
0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X77,0X7C,0X39,0X5E,0X79,0X71,0X00
0 1 2 3 4 5 6 7 8 9 A B C D E F 空
//共阳极数码管段码表
0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0X88,0X83,0XC6,0XA1,0X86,0X8E,0XFF
0 1 2 3 4 5 6 7 8 9 A B C D E F 空
1.静态数码管:第二位数码管显示0
#include void main() { P2_2=0;//位选 LED7 P2_3=1; P2_4=1; P0=0x3f;//段选 显示0 while(1) { } } 2.动态数码管:每一位数码管依次显示对应位数 数码管函数1 #include unsigned char NixieNum[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X77,0X7C,0X39,0X5E,0X79,0X71,0X00};//共阴极段码 void shumaguan(unsigned char wei,duan) { P0=0x00;//清零消影 采用delay函数亮度增强 switch(wei)//位选 { case 1:P2_2=1;P2_3=1;P2_4=1;break;//P2_4为高位 case 2:P2_2=0;P2_3=1;P2_4=1;break; case 3:P2_2=1;P2_3=0;P2_4=1;break; case 4:P2_2=0;P2_3=0;P2_4=1;break; case 5:P2_2=1;P2_3=1;P2_4=0;break; case 6:P2_2=0;P2_3=1;P2_4=0;break; case 7:P2_2=1;P2_3=0;P2_4=0;break; case 8:P2_2=0;P2_3=0;P2_4=0;break; } P0=NixieNum[duan];//段选 } 数码管函数2 #include #include "DELAY.h" unsigned char NixieNum[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X77,0X7C,0X39,0X5E,0X79,0X71,0X00};//段码 void shumaguan(unsigned char wei,duan) { switch(wei)//位选 { case 1:P2_2=1;P2_3=1;P2_4=1;break;//P2_4为高位 case 2:P2_2=0;P2_3=1;P2_4=1;break; case 3:P2_2=1;P2_3=0;P2_4=1;break; case 4:P2_2=0;P2_3=0;P2_4=1;break; case 5:P2_2=1;P2_3=1;P2_4=0;break; case 6:P2_2=0;P2_3=1;P2_4=0;break; case 7:P2_2=1;P2_3=0;P2_4=0;break; case 8:P2_2=0;P2_3=0;P2_4=0;break; } P0=NixieNum[duan];//段选 delay(1);//延时1ms稳定图像 清零消影 静态关闭消影 P0=0x00;//清零消影 静态关闭消影 } 主函数 #include #include "shumaguan.h" void main() { while(1) { shumaguan(1,0); shumaguan(2,1); shumaguan(3,2); shumaguan(4,3); shumaguan(5,4); shumaguan(6,5); shumaguan(7,6); shumaguan(8,7); } } 按键: 两端距离长的表示默认是导通状态,距离短的默认是断开状态。如果按键按下,初始导通状态变为断开,初始断开状态变为导通。通常的按键都是机械弹性开关,由于弹性作用,在闭合时不会马上稳定的接通,在断开时也不会马上断开,一般会抖动5-10ms。所以为了消抖,一般由软件消抖20ms。IO口既可以输出也可以输入,当按键按下时IO口电平会被接地,所以我们只需要检测按键什么时候被拉低就可以。 1.独立按键:按下按键对应LED亮灭 按键函数 #include #include "DELAY.h" unsigned char anjian() { unsigned char jianwei=0; if(P3_1==0){delay(20);while(P3_1==0);delay(20);jianwei=1;}//检测按键是否为0,消抖,检测是否松手,消抖 if(P3_0==0){delay(20);while(P3_0==0);delay(20);jianwei=2;} if(P3_2==0){delay(20);while(P3_2==0);delay(20);jianwei=3;} if(P3_3==0){delay(20);while(P3_3==0);delay(20);jianwei=4;} return jianwei; } 主函数 #include #include "anjian.h" void main() { unsigned char i; while(1) { i=anjian(); if(i==1){P2_0=~P2_0;}//如果第一个按下,第一个灯状态取反 if(i==2){P2_1=~P2_1;} if(i==3){P2_2=~P2_2;} if(i==4){P2_3=~P2_3;} } } 矩阵按键: 每一个独立按键都需要借一个IO口,但是矩阵按键会大大减少IO资源的使用。开发板上将 16 个按 键排成 4 行 4 列,第一行将每个按键的一端连接在一起构成行线,第一列将每 个按键的另一端连接在一起构成列线,这样便一共有 4 行 4 列共 8 根线,我们将 这 8 根线连接到单片机的 8 个 I/O 口上,通过程序扫描键盘就可检测 16 个 键。用这种方法我们也可实现 3 行 3 列 9 个键、 5 行 5 列 25 个键、 6 行 6 列 36 个键甚至更多。跟独立按键相同,我们只需要检测按键什么时候被拉低就可以。本次我们采用行扫描的方法使用矩阵按键,并且不要忘记消抖。 1.矩阵按键:按下的每个按键,数码管显示对应键码 矩阵函数 #include #include "DELAY.h" unsigned char juzhen()//行扫描 { unsigned char juzhenNum; P1=0x7f; if(P1_3==0){delay(20);while(P1_3==0);delay(20);juzhenNum=1;} if(P1_2==0){delay(20);while(P1_2==0);delay(20);juzhenNum=2;} if(P1_1==0){delay(20);while(P1_1==0);delay(20);juzhenNum=3;} if(P1_0==0){delay(20);while(P1_0==0);delay(20);juzhenNum=4;} P1=0xbf; if(P1_3==0){delay(20);while(P1_3==0);delay(20);juzhenNum=5;} if(P1_2==0){delay(20);while(P1_2==0);delay(20);juzhenNum=6;} if(P1_1==0){delay(20);while(P1_1==0);delay(20);juzhenNum=7;} if(P1_0==0){delay(20);while(P1_0==0);delay(20);juzhenNum=8;} P1=0xdf; if(P1_3==0){delay(20);while(P1_3==0);delay(20);juzhenNum=9;} if(P1_2==0){delay(20);while(P1_2==0);delay(20);juzhenNum=10;} if(P1_1==0){delay(20);while(P1_1==0);delay(20);juzhenNum=11;} if(P1_0==0){delay(20);while(P1_0==0);delay(20);juzhenNum=12;} P1=0xef; if(P1_3==0){delay(20);while(P1_3==0);delay(20);juzhenNum=13;} if(P1_2==0){delay(20);while(P1_2==0);delay(20);juzhenNum=14;} if(P1_1==0){delay(20);while(P1_1==0);delay(20);juzhenNum=15;} if(P1_0==0){delay(20);while(P1_0==0);delay(20);juzhenNum=16;} return juzhenNum; } 主函数 #include #include "shumaguan.h" #include "juzhen.h" void main() { unsigned char i=0; while(1) { i=juzhen(); shumaguan(1,i); } }
上一篇:51单片机——74HC595、LED点阵、直流电动机C语言入门编程
下一篇:51单片机——LED发光二极管、蜂鸣器C语言入门编程
推荐阅读最新更新时间:2024-11-13 09:43
设计资源 培训 开发板 精华推荐
- EVAL-AD7176-2SDZ,用于 AD7176-2、24 位、250 kSPS Sigma-Delta 模数转换器的评估板
- LTC2943 的典型应用 - 具有温度、电压和电流测量功能的多节电池电量计
- 45W 19V 适配器参考板,采用 SOT-223 封装的 700V CoolMOS™P7 超结 MOSFET
- 使用 ROHM Semiconductor 的 BD46322 的参考设计
- STR-NIS5020-GEVB、Strata Enabled NIS5020 12V、14 m-ohm、10A eFuse 评估板
- 用于电机控制的 MOSFET 功率驱动器
- LT1956IGN-5 双极性输出降压转换器的典型应用电路
- AM1G-0518DH30Z ±18V 1 瓦 DC-DC 转换器的典型应用
- 用于 MCU 系统负载感应的 NCP301LSN26T1 2.6V 电压检测器的典型应用
- LT3470ETS8 3.3V 降压转换器的典型应用电路