#include
/*
**********************************************************************
* 本地数据类型/宏定义
**********************************************************************
*/
typedef signed char int8; //8位有符号字符型
typedef signed int int16; //16位有符号整型
typedef signed long int32; //32位有符号长整型
typedef unsigned char uint8; //8位无符号字符型
typedef unsigned int uint16; //16位无符号整型
typedef unsigned long uint32; //32位无符号长整型
/*
**********************************************************************
* 单片机IO口位定义
**********************************************************************
*/
sbit DATA_A_595 = P1^0; //74HC595 串行数据输入引脚
sbit SHIFT_CLOCK_595 = P1^4; //74HC595 移位寄存器时钟信号输入引脚
sbit LATCH_CLOCK_595 = P2^3; //74HC595 锁存器时钟信号输入引脚
sbit duanxuan = P2^5; //数码管驱动芯片74HC573 段选
sbit weixuan = P2^6; //数码管驱动芯片74HC573 位选
/*
**********************************************************************
* 本地全局变量/数组定义
**********************************************************************
*/
uint8 zifu_test; //自加变量 测试我们编码表
uint8 code zifu[19]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89,0x7f,0xbf}; //共阳数码管编码表
/*
**********************************************************************
* 函数原型声明
**********************************************************************
*/
void delay(uint16 x_ms); //延迟 x_ms*1 毫秒
void write_byte_74hc595(uint8 dat); //给595芯片写一字节数据函数
void delay_100us(uint16 x_100us); //延迟 x_100*100 微秒
void Disp_smg_number(uint8 x_smg,uint8 count_smg,uint32 number,uint16 time);//把一个任意的八位数以内的十进制数,通过动态扫描显示在数码管上,可以指定扫描时间
/*********************************************************************
*函数名称:main
*函数功能:主函数
*函数调用:
*参数列表:无
*返 回 值:无
*结 果:
*备 注:
*********************************************************************/
void main(void)
{
P1=0XFF;
write_byte_74hc595(0X40); //给595芯片写一字节数据函数
write_byte_74hc595(0X00); //给595芯片写一字节数据函数 关掉595被控制的所有功能
zifu_test = 0; //自加变量 测试我们编码表
while(1)
{
/***************************************************************************************************
//数码管消斗试验
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =zifu[1]; //数码管段码显示 0 zifu_test自加变量 测试我们编码表
duanxuan = 1; //数码管驱动芯片74HC573 段选
duanxuan = 0; //数码管驱动芯片74HC573 段选
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =0X01; //数码管段码显示 0
weixuan = 1; //数码管驱动芯片74HC573 位选
weixuan = 0; //数码管驱动芯片74HC573 位选
delay(1000); //延迟 x_ms*1 毫秒
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =zifu[2]; //数码管段码显示 0 zifu_test自加变量 测试我们编码表
duanxuan = 1; //数码管驱动芯片74HC573 段选
duanxuan = 0; //数码管驱动芯片74HC573 段选
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =0X02; //数码管段码显示 0
weixuan = 1; //数码管驱动芯片74HC573 位选
weixuan = 0; //数码管驱动芯片74HC573 位选
delay(1000); //延迟 x_ms*1 毫秒
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =zifu[3]; //数码管段码显示 0 zifu_test自加变量 测试我们编码表
duanxuan = 1; //数码管驱动芯片74HC573 段选
duanxuan = 0; //数码管驱动芯片74HC573 段选
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =0X04; //数码管段码显示 0
weixuan = 1; //数码管驱动芯片74HC573 位选
weixuan = 0; //数码管驱动芯片74HC573 位选
delay(1000); //延迟 x_ms*1 毫秒
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =zifu[4]; //数码管段码显示 0 zifu_test自加变量 测试我们编码表
duanxuan = 1; //数码管驱动芯片74HC573 段选
duanxuan = 0; //数码管驱动芯片74HC573 段选
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =0X08; //数码管段码显示 0
weixuan = 1; //数码管驱动芯片74HC573 位选
weixuan = 0; //数码管驱动芯片74HC573 位选
delay(1000); //延迟 x_ms*1 毫秒
/********************************************************************************************/
/****************************************************************************************
//验证影子产生的原因
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =zifu[1]; //数码管段码显示 0 zifu_test自加变量 测试我们编码表
duanxuan = 1; //数码管驱动芯片74HC573 段选
duanxuan = 0; //数码管驱动芯片74HC573 段选
// delay(1); //延迟 x_ms*1 毫秒 放大影子显现,验证我们的理论
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =0X01; //数码管段码显示 0
weixuan = 1; //数码管驱动芯片74HC573 位选
weixuan = 0; //数码管驱动芯片74HC573 位选
//delay(4); //延迟 x_ms*1 毫秒
delay_100us(1); //延迟 x_100*100 微秒
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =zifu[2]; //数码管段码显示 0 zifu_test自加变量 测试我们编码表
duanxuan = 1; //数码管驱动芯片74HC573 段选
duanxuan = 0; //数码管驱动芯片74HC573 段选
// delay(1); //延迟 x_ms*1 毫秒 放大影子显现,验证我们的理论
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =0X02; //数码管段码显示 0
weixuan = 1; //数码管驱动芯片74HC573 位选
weixuan = 0; //数码管驱动芯片74HC573 位选
//delay(4); //延迟 x_ms*1 毫秒
delay_100us(1); //延迟 x_100*100 微秒
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =zifu[3]; //数码管段码显示 0 zifu_test自加变量 测试我们编码表
duanxuan = 1; //数码管驱动芯片74HC573 段选
duanxuan = 0; //数码管驱动芯片74HC573 段选
// delay(1); //延迟 x_ms*1 毫秒 放大影子显现,验证我们的理论
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =0X04; //数码管段码显示 0
weixuan = 1; //数码管驱动芯片74HC573 位选
weixuan = 0; //数码管驱动芯片74HC573 位选
//delay(4); //延迟 x_ms*1 毫秒
delay_100us(1); //延迟 x_100*100 微秒
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =zifu[4]; //数码管段码显示 0 zifu_test自加变量 测试我们编码表
duanxuan = 1; //数码管驱动芯片74HC573 段选
duanxuan = 0; //数码管驱动芯片74HC573 段选
// delay(1); //延迟 x_ms*1 毫秒 放大影子显现,验证我们的理论
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =0X08; //数码管段码显示 0
weixuan = 1; //数码管驱动芯片74HC573 位选
weixuan = 0; //数码管驱动芯片74HC573 位选
//delay(4); //延迟 x_ms*1 毫秒
delay_100us(1); //延迟 x_100*100 微秒
//****************************************************************************************/
//数码管消影
/* duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =zifu[1]; //数码管段码显示 0 zifu_test自加变量 测试我们编码表
duanxuan = 1; //数码管驱动芯片74HC573 段选
duanxuan = 0; //数码管驱动芯片74HC573 段选
// delay(1); //延迟 x_ms*1 毫秒 放大影子显现,验证我们的理论
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =0X01; //数码管段码显示 0
weixuan = 1; //数码管驱动芯片74HC573 位选
weixuan = 0; //数码管驱动芯片74HC573 位选
//delay(4); //延迟 x_ms*1 毫秒
delay_100us(1); //延迟 x_100*100 微秒
//******************************************************************************************
//消影
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =0X00; //数码管位选清零
weixuan = 1; //数码管驱动芯片74HC573 位选
weixuan = 0; //数码管驱动芯片74HC573 位选
//******************************************************************************************
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =zifu[2]; //数码管段码显示 0 zifu_test自加变量 测试我们编码表
duanxuan = 1; //数码管驱动芯片74HC573 段选
duanxuan = 0; //数码管驱动芯片74HC573 段选
// delay(1); //延迟 x_ms*1 毫秒 放大影子显现,验证我们的理论
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =0X02; //数码管段码显示 0
weixuan = 1; //数码管驱动芯片74HC573 位选
weixuan = 0; //数码管驱动芯片74HC573 位选
//delay(4); //延迟 x_ms*1 毫秒
delay_100us(1); //延迟 x_100*100 微秒
//******************************************************************************************
//消影
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =0X00; //数码管位选清零
weixuan = 1; //数码管驱动芯片74HC573 位选
weixuan = 0; //数码管驱动芯片74HC573 位选
//******************************************************************************************
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =zifu[3]; //数码管段码显示 0 zifu_test自加变量 测试我们编码表
duanxuan = 1; //数码管驱动芯片74HC573 段选
duanxuan = 0; //数码管驱动芯片74HC573 段选
// delay(1); //延迟 x_ms*1 毫秒 放大影子显现,验证我们的理论
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =0X04; //数码管段码显示 0
weixuan = 1; //数码管驱动芯片74HC573 位选
weixuan = 0; //数码管驱动芯片74HC573 位选
//delay(4); //延迟 x_ms*1 毫秒
delay_100us(1); //延迟 x_100*100 微秒
//******************************************************************************************
//消影
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =0X00; //数码管位选清零
weixuan = 1; //数码管驱动芯片74HC573 位选
weixuan = 0; //数码管驱动芯片74HC573 位选
//******************************************************************************************
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =zifu[4]; //数码管段码显示 0 zifu_test自加变量 测试我们编码表
duanxuan = 1; //数码管驱动芯片74HC573 段选
duanxuan = 0; //数码管驱动芯片74HC573 段选
// delay(1); //延迟 x_ms*1 毫秒 放大影子显现,验证我们的理论
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =0X08; //数码管段码显示 0
weixuan = 1; //数码管驱动芯片74HC573 位选
weixuan = 0; //数码管驱动芯片74HC573 位选
//delay(4); //延迟 x_ms*1 毫秒
delay_100us(1); //延迟 x_100*100 微秒
//******************************************************************************************
//消影
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =0X00; //数码管位选清零
weixuan = 1; //数码管驱动芯片74HC573 位选
weixuan = 0; //数码管驱动芯片74HC573 位选
//******************************************************************************************
*/
// Disp_smg_number(1,8,12345678,15);//数码管显示12375678 把任意一个八位以内的十进制数,在数码管上x坐标任意位置,任意扫描时间,通过动态扫描显示
Disp_smg_number(3,6,198866,15);//数码管显示198866
}
}
/*********************************************************************
*函数名称:write_byte_74hc595
*函数功能:74HC595芯片数据输入
*函数调用:write_byte_74hc595(uint8 dat);
*参数列表:dat
*返 回 值:无
*结 果:把一个字节数 dat 写到 74HC595芯片的八个输出引脚上
*备 注:dat 数据对应的功能
蜂鸣器 0X04 继电器 0X80
时钟芯片片选 0X10 流水灯 0X40
*********************************************************************/
void write_byte_74hc595(uint8 dat) //给595芯片写一字节数据函数
{
uint8 i;
for(i=0;i<8;i++)
{
DATA_A_595 =(dat<
SHIFT_CLOCK_595 = 0; //74HC595 移位寄存器时钟信号输入引脚
SHIFT_CLOCK_595 = 1; //74HC595 移位寄存器时钟信号输入引脚
}
LATCH_CLOCK_595 = 0; //74HC595 锁存器时钟信号输入引脚
LATCH_CLOCK_595 = 1; //74HC595 锁存器时钟信号输入引脚
}
/*********************************************************************
*函数名称:delay
*函数功能:延时函数
*函数调用:delay(uint16 x_ms);
*参数列表:x_ms
*返 回 值:无
*结 果:延迟时间=1* x_ms(毫秒)
*备 注:
*********************************************************************/
void delay(uint16 x_ms) //延迟 x_ms*1 毫秒
{
uint16 i,j;
for(i=x_ms;i>0;i--)
for(j=114;j>0;j--);
}
/*********************************************************************
*函数名称:delay_100us
*函数功能:延时函数
*函数调用:delay(uint16 x_100us);
*参数列表:x_100us
*返 回 值:无
*结 果:延迟时间=100* x_100us(微秒)
*备 注:
*********************************************************************/
void delay_100us(uint16 x_100us) //延迟 x_100*100 微秒
{
uint16 i,j;
for(i=x_100us;i>0;i--)
for(j=11;j>0;j--);
}
/*********************************************************************
*函数名称:Disp_smg_number
*函数功能:把任意一个八位以内的十进制数,在数码管上x坐标任意位置,任意扫描时间,通过动态扫描显示
*函数调用:void Disp_smg_number(uint8 x_smg,uint8 count_smg,uint32 number,uint16 time);
*参数列表:
uint8 x_smg 数码管写入位置X坐标 取值范围1-8
uint8 count_smg 写入几位十进制数 取值范围1-8
uint32 number 写入的十进制数值 取值范围0-99999999
uint16 time 动态扫描时间 延迟时间 = time*100us
*返 回 值:无
*结 果:在八位数码管任意位置通动态扫描写一个八位以内的任意数
*备 注:
共阳数码管编码表
十六进制:0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89,0x7f,0xbf
显示字符: 0 1 2 3 4 5 6 7 8 9 A b C D E F H . -
共阳数码管从左至右,依次位选编码数据
十六进制 : 0X01 0X02 0X04 0X08 0X10 0X20 0X40 0X80
数码管编号: 1 2 3 4 5 6 7 8
*********************************************************************/
void Disp_smg_number(uint8 x_smg,uint8 count_smg,uint32 number,uint16 time)
{
uint8 i;
uint8 number1[8]; //定义一个存储八位数的每一位的数字用的数组
uint8 code zifu[19]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89,0x7f,0xbf};
uint8 code wei_dat[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //定义八位数码管位选数据数组
number1[0] = number % 10; //个
number1[1] = number % 100 / 10; //十
number1[2] = number % 1000 / 100; //百
number1[3] = number % 10000 / 1000; //千
number1[4] = number % 100000 / 10000; //万
number1[5] = number % 1000000 / 100000; //十万
number1[6] = number % 10000000 / 1000000; //百万
number1[7] = number % 100000000 / 10000000; //千万
for(i=0;i < count_smg;i++)
{/*
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =zifu[number1[count_smg-i-1]]; //数码管段码显示 0 zifu_test自加变量 测试我们编码表
duanxuan = 1; //数码管驱动芯片74HC573 段选
duanxuan = 0; //数码管驱动芯片74HC573 段选
// delay(1); //延迟 x_ms*1 毫秒 放大影子显现,验证我们的理论
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =wei_dat[x_smg+i-1]; //数码管段码显示 0
weixuan = 1; //数码管驱动芯片74HC573 位选
weixuan = 0; //数码管驱动芯片74HC573 位选
//delay(4); //延迟 x_ms*1 毫秒
delay_100us(time); //延迟 x_100*100 微秒
//******************************************************************************************
//消影
duanxuan = 0; //数码管驱动芯片74HC573 段选
weixuan = 0; //数码管驱动芯片74HC573 位选
P0 =0X00; //数码管位选清零
weixuan = 1; //数码管驱动芯片74HC573 位选
weixuan = 0; //数码管驱动芯片74HC573 位选
//****************************************************************************************** */
//********************************************************************
//数码管段选写入
duanxuan = 0; //数码管驱动芯片74hc573 段选
weixuan = 0; //数码管驱动芯片74hc573 位选
P0=zifu[number1[count_smg-i-1]]; //数码管段选显示0 段码数据
duanxuan = 1; //数码管驱动芯片74hc573 段选
duanxuan = 0; //数码管驱动芯片74hc573 段选
//********************************************************************
//数码管位选写入
duanxuan = 0; //数码管驱动芯片74hc573 段选
weixuan = 0; //数码管驱动芯片74hc573 位选
P0=wei_dat[x_smg+i-1]; //数码管段选显示0 段码数据
weixuan = 1; //数码管驱动芯片74hc573 位选
weixuan = 0; //数码管驱动芯片74hc573 位选
//********************************************************************
delay_100us(time);
//delay(smg_time); //延迟 x_ms*1 毫秒
//********************************************************************
//消影
duanxuan = 0; //数码管驱动芯片74hc573 段选
weixuan = 0; //数码管驱动芯片74hc573 位选
P0=0x00; //数码管段选显示0 段码数据
weixuan = 1; //数码管驱动芯片74hc573 段选
weixuan = 0; //数码管驱动芯片74hc573 段选
//********************************************************************
}
}