关于数码管的一些知识笔记

“写写关于数码管的一些知识笔记”
01段码
1.共阴数码管
2.共阳数码管
02仿真图
元件有:80c51、button、7seg-mpx6-cc(共阴数码管)
数码管:cc是共阴、ca是共阳
03代码结构
晶振频率设置为12mhz,一条指令的执行时间为10μs。
//*****引入头文件#include //*****声明函数和变量、引脚的定义#define u8 unsigned char //8位无符号数#define u16 unsigned int //16位无符号数//*****延时函数的声明 void delay();//*****主函数void main(){ while(1){ }}//*****延时函数:1svoid delay(){ u16 i,j; for(i = 0; i < 1000; i++) for(j = 0; j < 100; j++);}04写入keil的代码
一、共阴数码管显示0~15。
代码如下:
//*****引入头文件#include //*****声明函数和变量、引脚的定义#define u8 unsigned char#define u16 unsigned intsbit button = p1^4; //定义引脚p1^4为按钮的控制引脚//******装有字形码的数组table_cc --这个是共阴极的u8 table_cc[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};//*****延时函数的声明void delay();//*****主函数void main(){ u8 i; p3 = 0x00; //因为是共阴极数码管,p3连接的是数码管的阴极,得置低电平,共阴数码管才能其效果 while(1){ for( i = 0 ; i< 16 ; i++){ p2 = table_cc[i]; delay(); } }}//*****延时函数void delay(){ u16 i,j; for(i = 0; i < 1000; i++) for(j = 0; j < 100; j++);}二、用阳极数码管的字形码通过共阴的数码管显示数字。
【ps:可以将共阴数码管换成共阳数码管,我只是偷懒,不想更换,如果更换了数码管,直接将字形码全部替换掉就行,不用去修改主函数的内容,共阳的主函数和共阴的主函数是一样的】
修改字形码u8 table_cc[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};更换为u8 table_ca[]={ 0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e};完整代码如下:
#include #define u8 unsigned char#define u16 unsigned int//*****装有字形码的数组table_ca --这个是共阳极的u8 table_ca[]={ 0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e};void delay();void main(){ u8 i; p3 = 0x00; while(1){ for( i = 0 ; i< 16 ; i++){ p2 = ~table_ca[i]; //这里改变了,因为是共阴数码管,使用共阳字形码需要将字形码取反 delay(); } }}void delay(){ u16 i,j; for(i = 0; i < 1000; i++) for(j = 0; j < 100; j++);}05加入按键button控制
由图可知,p1^0和p1^4是线与的关系,只有当p1^0与p1^4都为高电平时,结果才为高电平,如果其中有一个为低电平,结果就为低电平。
那么我们怎么样才能判断按键是否按下呢?
答案是:我们将其中一个引脚置为低电平,另外一个置为高电平,如果按键按下了,置为高电平的引脚会输出低电平。
//在初始化前,得先定义控制引脚sbit key = p1^4;首先是将p1^0置为低电平,p1^4置为高电平
// 在main函数里面加上这句话 p1 = 0x10; //按键控制初始化完整代码如下:
#include #define u8 unsigned char#define u16 unsigned intsbit key = p1^4;u8 table_cc[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};void main(){ p3 = 0x00; p1 = 0x10; while(1){ if(key == 0){ p2=table_cc[1]; } }}未按下按键前 ,运行效果如下:
为什么我们没有运行前,它就已经有数字显示了呢,因为我们没有初始化,将p2置为低电平。
将主函数修改为:
void main(){ p3 = 0x00; //片选 p1 = 0x10; //按键初始化 p2 = 0x00; //黑屏 while(1){ if(key == 0){ p2=table_cc[1]; } }}未按下按键前 ,运行效果如下:
按下按键后 ,效果如下:
06题外话
之前的案例是建立在我们的p1端口是没有运行的,是刚刚使用的,刚初始化的,所以我们可以直接将p1赋值为0x10;
但是如果当我们这个p1端口已经在使用中了,我们要在修改p1^0和p1^4的基础下,不变动p1端口的其它引脚的值,那我们应该这样做:
p1 = p1 & 0xfe | 0x10;& 0xfe 是为了将p1^0置为0,使其它引脚电平不变,而 | 0x10 是为了将p1^4 置为 1,使其它引脚电平不变,由此,p1这样赋值。

HarmonyOS 3.1 Release版发布!
NB/笔记本无线网络应用集锦
意法半导体推动智能手机对汽车的连接
BGA返修焊台技术迎来了高速发展契机——智诚精展
2020年5G部署情况 目前存在的风险有哪些
关于数码管的一些知识笔记
广电计量| 电容器基础知识介绍
可编程晶振用于400G高速光模块,频率稳定度达±50ppm
电感下方到底要不要铺铜?
5G toB该从哪里开始?如何去做?
SystemVerilog中的类的继承
工业视觉控制器的工作原理
面对激烈挑战,比亚迪能否持续领跑赢得“智能化”的下半场?
Imagination在AutoSens大会上展示足够精彩,真棒!
如何将PLC设备数据通过物联网网关接入云平台
荣耀V30通过3C认证,支持40W充电功率
微软Surface Book拆解评测:可维修指数低 SSD可更换
真空干燥箱噪声问题分析
无人机有望成为火星探索的关键工具
康佳40周年转型以科技创新为驱动 科技康佳 连接美好