直接上图
?共阴数码管由这个3-8译码器控制亮灭,74HC138这个芯片数电里有,具体就不说了。
CBA三个I/O口控制数码管,然后P0的8个I/O口控制abcdefgdp
?CBA:000->Y0,001->Y1,010->Y2,011->Y3,100->Y4,101->Y5.110->Y6,111->Y7
具体代码如下:
#include "reg52.h"
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
/* 函数声明 */
void delay_ms(int n);//延时1ms
void delay_us(int i);//延时10us
void smg_weixuan();//选择数码管
void smg_show_1();//0-f
void smg_show_2();//01234567
void smg_show_3();//0-9
void smg_show_4();//00-99
void smg_show_5();//000-999
void smg_show_6();//显示相同数字
/* 变量声明 */
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;
u8 smgduan[16] = {0x3f,0x06,0x5b,0x4f, //0 1 2 3
0x66,0x6d,0x7d,0x07, //4 5 6 7
0x7f,0x6f,0x77,0x7c, //8 9 A b
0x39,0x5e,0x79,0x71}; //C d E F 共阴
/*
*函数名称:main()
*函数功能:执行函数
*输入参数:无
*返回参数:无
*注意事项:
*/
void main()
{
while(1)
{
smg_show_6();
}
}
/*
*函数名称:delay_ms()
*函数功能:延时1ms
*输入参数:n
*返回参数:无
*注意事项:
*/
void delay_ms(int n)
{
int j;
while(n--)
{
for(j = 0;j <= 125;j++);
}
}
/*
*函数名称:delay_us()
*函数功能:延时10us
*输入参数:i
*返回参数:无
*注意事项:
*/
void delay_us(int i)
{
while(i--);
}
/*
*函数名称:smg_weixuan()
*函数功能:选择第几个数码管
*输入参数:i
*返回参数:无
*注意事项:
*/
void smg_weixuan(u8 i)
{
switch(i)
{
case 1:LSA = 0;LSB = 0;LSC = 0;break;
case 2:LSA = 0;LSB = 0;LSC = 1;break;
case 3:LSA = 0;LSB = 1;LSC = 0;break;
case 4:LSA = 0;LSB = 1;LSC = 1;break;
case 5:LSA = 1;LSB = 0;LSC = 0;break;
case 6:LSA = 1;LSB = 0;LSC = 1;break;
case 7:LSA = 1;LSB = 1;LSC = 0;break;
case 8:LSA = 1;LSB = 1;LSC = 1;break;
default:break;
}
}
/*
*函数名称:smg_show_1()
*函数功能:单个数码管显示0-F
*输入参数:无
*返回参数:无
*注意事项:
*/
void smg_show_1()
{
u16 i;
smg_weixuan(1);
P0 = 0x00;
for(i = 0;i < 16;i++)
{
P0 = smgduan[i];
delay_ms(200);
P0 = 0X00;
}
}
/*
*函数名称:smg_show_2()
*函数功能:数码管显示01234567
*输入参数:无
*返回参数:无
*注意事项:
*/
void smg_show_2()
{
u16 i;
for(i = 0;i < 8;i++)
{
smg_weixuan(i+1);
P0 = smgduan[i];
delay_ms(1);
P0 = 0x00;
}
}
/*
*函数名称:smg_show_3()
*函数功能:数码管显示0-9
*输入参数:无
*返回参数:无
*注意事项:
*/
void smg_show_3()
{
u8 i;
smg_weixuan(1);
for(i = 0;i < 10;i++)
{
P0 = smgduan[i];
delay_ms(100);
P0 = 0x00;
delay_us(10);
}
}
/*
*函数名称:smg_show_4()
*函数功能:数码管显示00-99
*输入参数:无
*返回参数:无
*注意事项:
*/
void smg_show_4()
{
u8 i,j,k;
for(k = 0;k < 10;k++)//百位
{
for(j = 0;j < 10;j++)//个位
{
for(i = 0;i < 20;i++)//每个数字的显示次数
{
smg_weixuan(1);
P0 = smgduan[j];
delay_ms(3);//扫描时间,去掉数字变暗并且数字速度快
P0 = 0x00;//消影
delay_us(10);
smg_weixuan(2);
P0 = smgduan[k];
delay_ms(3);//范围在2ms-5ms内可看清,超过5数码管开始闪烁,小于2则数字不易看清
P0 = 0x00;
delay_us(10);
}
}
}
}
/*
*函数名称:smg_show_5()
*函数功能:数码管显示000-999
*输入参数:无
*返回参数:无
*注意事项:
*/
void smg_show_5()
{
u8 i,j,k,l;
for(i = 0;i < 10;i++)//百位
{
for(j = 0;j < 10;j++)//十位
{
for(k = 0;k < 10;k++)//个位
{
for(l = 0; l < 20;l++)//每个数字的显示次数
{
smg_weixuan(1);
P0 = smgduan[k];//个位
delay_ms(3);
P0 = 0x00;
delay_us(10);
smg_weixuan(2);
P0 = smgduan[j];//十位
delay_ms(3);
P0 = 0x00;
delay_us(10);
smg_weixuan(3);
P0 = smgduan[i];//百位
delay_ms(3);
P0 = 0x00;
delay_us(10);
}
}
}
}
}
/*
*函数名称:smg_show_6()
*函数功能:数码管显示相同数字
*输入参数:无
*返回参数:无
*注意事项:
*/
void smg_show_6()
{
u16 i,j,k;
for(i = 0;i < 16;i++)
{
for(j = 0;j < 800;j++)
{
for(k = 1;k < 9;k++)
{
P0 = smgduan[i];
smg_weixuan(k);
// P0 = 0x00;
// delay_us(1);
}
}
}
}
?
?
?
|