数码管动态扫描实用模块范例
时间:10-02
整理:3721RD
点击:
/******************************程序编写者:周朝辉***************************/
//*****************************数码管位码定义*************************************//
//*******************************数码管com口定义**********************************//
#define display_location_1_set P3_3=1
#define display_location_1_clr P3_3=0
#define display_location_2_set P3_2=1
#define display_location_2_clr P3_2=0
#define display_location_3_set P3_1=1
#define display_location_3_clr P3_1=0
#define display_location_4_set P3_0=1
#define display_location_4_clr P3_0=0
//*******************************数码管断码io口定义*******************************//
#define display_1_set P1_4=0
#define display_1_clr P1_4=1
#define display_2_set P1_6=0
#define display_2_clr P1_6=1
#define display_3_set P2_5=0
#define display_3_clr P2_5=1
#define display_4_set P2_3=0
#define display_4_clr P2_3=1
#define display_5_set P2_2=0
#define display_5_clr P2_2=1
#define display_6_set P1_5=0
#define display_6_clr P1_5=1
#define display_7_set P2_6=0
#define display_7_clr P2_6=1
#define display_8_set P2_4=0
#define display_8_clr P2_4=1
uchar bite=1;
//*****************************数码管BCD码值*************************************//
code unsigned char LED_DATA[13] ={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,
// 0 1 2 3 4 5 6 7
0xfe,0xf6,0x02,0x00,0x9e,};//,0x3e,0x9c,0x7a,0x9e,0x8e};
// 8 9 - 消 e c d e f
void scan_io(void) //数码管io口断码扫描
{
if(LED_TABLE & 0x80) display_1_set;else display_1_clr; //a段码控制
if(LED_TABLE & 0x40) display_2_set;else display_2_clr; //b段码控制
if(LED_TABLE & 0x20) display_3_set;else display_3_clr; //c段码控制
if(LED_TABLE & 0x10) display_4_set;else display_4_clr; //d段码控制
if(LED_TABLE & 0x08) display_5_set;else display_5_clr; //e段码控制
if(LED_TABLE & 0x04) display_6_set;else display_6_clr; //f段码控制
if(LED_TABLE & 0x02) display_7_set;else display_7_clr; //g段码控制
if(LED_TABLE & 0x01) display_8_clr;else display_8_clr; //H段码控制
}
void scan_lcd(uint show_data)
{
unsigned char temp_data1;unsigned char temp_data2;unsigned char temp_data3;unsigned char temp_data4;unsigned char LED_TABLE;
//********************数码管1-4全消隐,避免产生鬼影******************************//
display_location_1_clr; //数码管1消隐
display_location_2_clr; //数码管2消隐
display_location_3_clr; //数码管3消隐
display_location_4_clr; //数码管4消隐
display_1_clr;display_2_clr;display_3_clr; //消隐数码屏
display_4_clr;display_5_clr;display_6_clr; //消隐数码屏
display_7_clr;display_8_clr; //消隐数码屏
//*******************************获取各位数值*******************************//
temp_data1=show_data/1000; //获取高一位
temp_data2=show_data%1000/100; //获取高二位
temp_data3=show_data%1000%100/10; //获取高三位
temp_data4=show_data%1000%100%10; //获取高四位
switch(bite) //利用switch开关语句选择扫描各位数码管
{
case 1: //千位
{
bite=2;
display_location_4_set; //开启com端口
//******************************获取查表数值*************************************//
LED_TABLE=LED_DATA[temp_data1]; //获取查表数值
//*******************************************************************************//
break;
}
case 2: //百位
{
bite=3;
display_location_3_set; //开启com端口
//******************************获取查表数值*************************************//
LED_TABLE=LED_DATA[temp_data2]; //获取查表数值
//*******************************************************************************//
break;
}
case 3: //十位
{
bite=4;
display_location_2_set;
//******************************获取查表数值*************************************//
LED_TABLE=LED_DATA[temp_data3]; //获取查表数值
//*******************************************************************************//
break;
}
case 4:
{
bite=1; //个位
display_location_1_set; //开启com端口
//******************************获取查表数值*************************************//
LED_TABLE=LED_DATA[temp_data4]; //获取查表数值
//*******************************************************************************//
break;
}
default:break;
}
scan_io(); //数码管io口断码扫描
}
备注:人眼的动态感知频率为50hz即20ms,所有以上数码管动态扫描程序模块为4位动态扫描,即要保证主循环时间为5ms以内。后续还有很多其它的个人非常经典的程序内容与各位分享 ,相互交流学习可加个人qq 1044340359。另外我想说的是,如果单纯在家电开发行业来说,我不是最牛,但自认为还不错,但关键是我愿意与大家分享交流
//*****************************数码管位码定义*************************************//
//*******************************数码管com口定义**********************************//
#define display_location_1_set P3_3=1
#define display_location_1_clr P3_3=0
#define display_location_2_set P3_2=1
#define display_location_2_clr P3_2=0
#define display_location_3_set P3_1=1
#define display_location_3_clr P3_1=0
#define display_location_4_set P3_0=1
#define display_location_4_clr P3_0=0
//*******************************数码管断码io口定义*******************************//
#define display_1_set P1_4=0
#define display_1_clr P1_4=1
#define display_2_set P1_6=0
#define display_2_clr P1_6=1
#define display_3_set P2_5=0
#define display_3_clr P2_5=1
#define display_4_set P2_3=0
#define display_4_clr P2_3=1
#define display_5_set P2_2=0
#define display_5_clr P2_2=1
#define display_6_set P1_5=0
#define display_6_clr P1_5=1
#define display_7_set P2_6=0
#define display_7_clr P2_6=1
#define display_8_set P2_4=0
#define display_8_clr P2_4=1
uchar bite=1;
//*****************************数码管BCD码值*************************************//
code unsigned char LED_DATA[13] ={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,
// 0 1 2 3 4 5 6 7
0xfe,0xf6,0x02,0x00,0x9e,};//,0x3e,0x9c,0x7a,0x9e,0x8e};
// 8 9 - 消 e c d e f
void scan_io(void) //数码管io口断码扫描
{
if(LED_TABLE & 0x80) display_1_set;else display_1_clr; //a段码控制
if(LED_TABLE & 0x40) display_2_set;else display_2_clr; //b段码控制
if(LED_TABLE & 0x20) display_3_set;else display_3_clr; //c段码控制
if(LED_TABLE & 0x10) display_4_set;else display_4_clr; //d段码控制
if(LED_TABLE & 0x08) display_5_set;else display_5_clr; //e段码控制
if(LED_TABLE & 0x04) display_6_set;else display_6_clr; //f段码控制
if(LED_TABLE & 0x02) display_7_set;else display_7_clr; //g段码控制
if(LED_TABLE & 0x01) display_8_clr;else display_8_clr; //H段码控制
}
void scan_lcd(uint show_data)
{
unsigned char temp_data1;unsigned char temp_data2;unsigned char temp_data3;unsigned char temp_data4;unsigned char LED_TABLE;
//********************数码管1-4全消隐,避免产生鬼影******************************//
display_location_1_clr; //数码管1消隐
display_location_2_clr; //数码管2消隐
display_location_3_clr; //数码管3消隐
display_location_4_clr; //数码管4消隐
display_1_clr;display_2_clr;display_3_clr; //消隐数码屏
display_4_clr;display_5_clr;display_6_clr; //消隐数码屏
display_7_clr;display_8_clr; //消隐数码屏
//*******************************获取各位数值*******************************//
temp_data1=show_data/1000; //获取高一位
temp_data2=show_data%1000/100; //获取高二位
temp_data3=show_data%1000%100/10; //获取高三位
temp_data4=show_data%1000%100%10; //获取高四位
switch(bite) //利用switch开关语句选择扫描各位数码管
{
case 1: //千位
{
bite=2;
display_location_4_set; //开启com端口
//******************************获取查表数值*************************************//
LED_TABLE=LED_DATA[temp_data1]; //获取查表数值
//*******************************************************************************//
break;
}
case 2: //百位
{
bite=3;
display_location_3_set; //开启com端口
//******************************获取查表数值*************************************//
LED_TABLE=LED_DATA[temp_data2]; //获取查表数值
//*******************************************************************************//
break;
}
case 3: //十位
{
bite=4;
display_location_2_set;
//******************************获取查表数值*************************************//
LED_TABLE=LED_DATA[temp_data3]; //获取查表数值
//*******************************************************************************//
break;
}
case 4:
{
bite=1; //个位
display_location_1_set; //开启com端口
//******************************获取查表数值*************************************//
LED_TABLE=LED_DATA[temp_data4]; //获取查表数值
//*******************************************************************************//
break;
}
default:break;
}
scan_io(); //数码管io口断码扫描
}
备注:人眼的动态感知频率为50hz即20ms,所有以上数码管动态扫描程序模块为4位动态扫描,即要保证主循环时间为5ms以内。后续还有很多其它的个人非常经典的程序内容与各位分享 ,相互交流学习可加个人qq 1044340359。另外我想说的是,如果单纯在家电开发行业来说,我不是最牛,但自认为还不错,但关键是我愿意与大家分享交流
感谢大力支持哈
学习了,正想找这类的资料,谢谢小编分享!
必须顶的啊
还会继续关注
学习学习 有没有精简点的代码啊
实际开发中这已经是非常简洁啦,只是宏定义显得比较多,都是为了便于移植修改
多谢小编的好程序,多分享多交流多提高
看看 学习学习 !谢谢!