“写写关于数码管的一些知识笔记”
01段码
1.共阴数码管
2.共阳数码管
02仿真图
元件有:80C51、button、7SEG-MPX6-CC(共阴数码管)
数码管:cc是共阴、ca是共阳
03代码结构
晶振频率设置为12MHZ,一条指令的执行时间为10μs。
//*****引入头文件
#include < reg51.h >
//*****声明函数和变量、引脚的定义
#define u8 unsigned char //8位无符号数
#define u16 unsigned int //16位无符号数
//*****延时函数的声明
void Delay();
//*****主函数
void main(){
while(1){
}
}
//*****延时函数:1s
void Delay(){
u16 i,j;
for(i = 0; i < 1000; i++)
for(j = 0; j < 100; j++);
}
04写入keil的代码
一、共阴数码管显示0~15。
代码如下:
//*****引入头文件
#include < reg51.h >
//*****声明函数和变量、引脚的定义
#define u8 unsigned char
#define u16 unsigned int
sbit 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 < reg51.h >
#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 < reg51.h >
#define u8 unsigned char
#define u16 unsigned int
sbit 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这样赋值。
全部0条评论
快来发表一下你的评论吧 !