数码管动态显示
静态与动态显示
动态显示
动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余晖和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。
数组的定义与引用
数组是一组有序数据的集合,数组中每一个数据都是同一数据类型。数组中的元素可以用数组名和下标来唯一确定。
数组的一般格式定义如下:
数据类型 数组名[常量表达式] = {元素表};
例如:
unsigned char tabel[3] = [0x3F, 0x06, 0x5B,];
P0 = tabel[0]; // P0此时的值为0x3F
数码管动态显示数字 123
#include #include #define uint unsigned int #define uchar unsigned char sbit DU = P2^6;//数码管段选 sbit WE = P2^7;//数码管段选 // 毫秒级延时函数定义 void delay(uint z){ // 毫秒级延时函数定义 uint x, y; for (x = z; x > 0; x--){ for (y = 114; y > 0; y--){ } } } void main(){ // main函数自身会循环 while(1){ /*第一位显示 数字 1*/ P0 = 0XFF; // 清除断码 如果没有为P0 初始化赋值 0XFF,那么 P0的值会是上一个打开段选锁存器过程中赋予的值,执行到这里 会把段选值赋给锁存器中P0,导致数码管显示错误。 WE = 1; // 打开位选锁存器 P0 = 0XFE; // 1111 1110 选通第一位数码管 // P0 = 0X00; // 0000 0000 表示选通所有位数码管 WE = 0; // 锁存位选数据 DU = 1; // 打开段选锁存器 P0 = 0X06; // 0000 0110 显示“1” DU = 0; // 锁存段选数据 delay(5); // 对每次数码管的切换进行 5毫秒延时操作 /*第二位显示 数字 2*/ P0 = 0XFF; // 清除断码 WE = 1; // 打开位选锁存器 P0 = 0XFD; // 1111 1101 选通第二位数码管 // P0 = 0X00; // 0000 0000 表示选通所有位数码管 WE = 0; // 锁存位选数据 DU = 1; // 打开段选锁存器 P0 = 0X5B; // 0101 1011 显示“2” DU = 0; // 锁存段选数据 delay(5); /*第三位显示 数字 3*/ P0 = 0XFF; // 清除断码 WE = 1; // 打开位选锁存器 P0 = 0XFB; // 1111 1011 选通第三位数码管 // P0 = 0X00; // 0000 0000 表示选通所有位数码管 WE = 0; // 锁存位选数据 DU = 1; // 打开段选锁存器 P0 = 0X4F; // 0100 1111 显示“3” DU = 0; // 锁存段选数据 delay(5); } } 数码管动态显示数字 123 (代码优化) #include #include #define uint unsigned int #define uchar unsigned char sbit DU = P2^6;//数码管段选 sbit WE = P2^7;//数码管段选 //共阴数码管段选表0-9 uchar code tabel[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,}; /*==================================== 函数 : delay(uint z) 参数 :z 延时毫秒设定,取值范围0-65535 返回值 :无 描述 :12T/Fosc11.0592M毫秒级延时 ====================================*/ void delay(uint z) { uint x,y; for(x = z; x > 0; x--) for(y = 114; y > 0 ; y--); } /*==================================== 函数 :display(uchar i) 参数 :i 显示数值,取值范围0-255 返回值 :无 描述 :三位共阴数码管动态显示 ====================================*/ void display(uchar i) { uchar bai, shi, ge; bai = i / 100; //236 / 100 = 2 shi = i % 100 / 10; //236 % 100 / 10 = 3 ge = i % 10;//236 % 10 =6 //第一位数码管 P0 = 0XFF;//清除断码 WE = 1;//打开位选锁存器 P0 = 0XFE; //1111 1110 WE = 0;//锁存位选数据 DU = 1;//打开段选锁存器 P0 = tabel[bai];// DU = 0;//锁存段选数据 delay(5); //第二位数码管 P0 = 0XFF;//清除断码 WE = 1;//打开位选锁存器 P0 = 0XFD; //1111 1101 WE = 0;//锁存位选数据 DU = 1;//打开段选锁存器 P0 = tabel[shi];// DU = 0;//锁存段选数据 delay(5); //第三位数码管 P0 = 0XFF;//清除断码 WE = 1;//打开位选锁存器 P0 = 0XFB; //1111 1011 WE = 0;//锁存位选数据 DU = 1;//打开段选锁存器 P0 = tabel[ge];// DU = 0;//锁存段选数据 delay(5); } void main()//main函数自身会循环 { while(1) { display(123); //数码管显示函数 } } 数码管动态显示数字 12345678 (代码优化) #include #include #define uint unsigned int #define uchar unsigned char sbit DU = P2^6;//数码管段选 sbit WE = P2^7;//数码管段选 //共阴数码管段选表0-9 uchar code tabel[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,}; /*==================================== 函数 : delay(uint z) 参数 :z 延时毫秒设定,取值范围0-65535 返回值 :无 描述 :12T/Fosc11.0592M毫秒级延时 ====================================*/ void delay(uint z) { uint x,y; for(x = z; x > 0; x--) for(y = 114; y > 0 ; y--); } /*==================================== 描述 :八位共阴数码管动态显示 ====================================*/ void display(uchar num1, uchar num2, uchar num3, uchar num4, uchar num5, uchar num6, uchar num7, uchar num8) { /*第一位显示*/ P0 = 0XFF;//清除断码 WE = 1;//打开位选锁存器 P0 = 0XFE; //1111 1110 WE = 0;//锁存位选数据 DU = 1;//打开段选锁存器 P0 = tabel[num1];// DU = 0;//锁存段选数据 delay(1); /*第二位显示*/ P0 = 0XFF;//清除断码 WE = 1;//打开位选锁存器 P0 = 0XFD; //1111 1101 WE = 0;//锁存位选数据 DU = 1;//打开段选锁存器 P0 = tabel[num2];// DU = 0;//锁存段选数据 delay(1); /*第三位显示*/ P0 = 0XFF;//清除断码 WE = 1;//打开位选锁存器 P0 = 0XFB; //1111 1011 WE = 0;//锁存位选数据 DU = 1;//打开段选锁存器 P0 = tabel[num3];// DU = 0;//锁存段选数据 delay(1); /*第四位显示*/ P0 = 0XFF; // 清除断码 WE = 1; // 打开位选锁存器 P0 = 0XF7; // 1111 0111 选通第四位数码管 WE = 0; // 锁存位选数据 DU = 1; // 打开段选锁存器 P0 = tabel[num4];// DU = 0; // 锁存段选数据 delay(1); /*第五位显示*/ P0 = 0XFF; // 清除断码 WE = 1; // 打开位选锁存器 P0 = 0XEF; // 1110 1111 选通第五位数码管 WE = 0; // 锁存位选数据 DU = 1; // 打开段选锁存器 P0 = tabel[num5];// DU = 0; // 锁存段选数据 delay(1); /*第六位显示*/ P0 = 0XFF; // 清除断码 WE = 1; // 打开位选锁存器 P0 = 0XDF; // 1101 1111 选通第六位数码管 WE = 0; // 锁存位选数据 DU = 1; // 打开段选锁存器 P0 = tabel[num6];// DU = 0; // 锁存段选数据 delay(1); /*第七位显示*/ P0 = 0XFF; // 清除断码 WE = 1; // 打开位选锁存器 P0 = 0XBF; // 1011 1111 选通第七位数码管 WE = 0; // 锁存位选数据 DU = 1; // 打开段选锁存器 P0 = tabel[num7];// DU = 0; // 锁存段选数据 delay(1); /*第八位显示*/ P0 = 0XFF; // 清除断码 WE = 1; // 打开位选锁存器 P0 = 0X7F; // 0111 1111 选通第八位数码管 WE = 0; // 锁存位选数据 DU = 1; // 打开段选锁存器 P0 = tabel[num8]; DU = 0; // 锁存段选数据 delay(1); } void main()//main函数自身会循环 { while(1) { display(1, 2, 3, 4, 5, 6, 7, 8); //数码管显示函数 } }
上一篇:STC89C52单片机 独立键盘
下一篇:STC89C52单片机 数码管静态显示
设计资源 培训 开发板 精华推荐
- 消息称 AMD 将入局手机芯片领域,采用台积电 3nm 工艺
- 英飞凌推出OptiMOS™ Linear FET 2 MOSFET, 赋能先进的热插拔技术和电池保护功能
- SGMII及其应用
- 贸泽开售用于机器人和机器视觉的 STMicroelectronics B-CAMS-IMX模块
- 三星 Exynos 2600 芯片前景堪忧:良率挑战严峻,有被取消量产风险
- 苹果搁置反垄断报告的请求遭印度监管机构拒绝,案件将继续推进
- 2024年Automechanika Shanghai海量同期活动刷新历届记录,汇聚行业智慧,共谋未来发展
- 企业文化分享 如何培养稀缺的硅IP专业人员?SmartDV开启的个人成长与团队协作之旅
- 恩智浦发布首个超宽带无线电池管理系统解决方案
- 北交大本科生探秘泰克先进半导体开放实验室,亲历前沿高科技魅力