历史上的今天
今天是:2025年10月19日(星期日)
2022年10月19日 | STC89C52单片机 点亮两个数码管,可以显示 00——10 共 11 个数字
2022-10-19 来源:csdn
手动显示
#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) { /*第一位显示*/ 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); } void main()//main函数自身会循环 { while(1) { display(0, 0); //数码管显示函数 } } 说明: 由于传参的缘故,显示 00——10 共 11 个数字只需要调用 自定义的函数void display(uchar num1, uchar num2) 依次传入: display(0 ,1); display(0 ,2); display(0 ,3); display(0 ,4); display(0 ,5); display(0 ,6); display(0 ,7); display(0 ,8); display(0 ,9); display(1 ,0); 所以以上其它代码不再复制。 自动显示 #include #include #define uint unsigned int #define uchar unsigned char sbit DU = P2^6;//数码管段选 sbit WE = P2^7;//数码管段选 uchar count = 0; // 控制数码管显示的变量 uchar i = 0; // 控制循环次数的变量 //共阴数码管段选表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) { /*第一位显示*/ 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); } /*==================================== 变量 count:负责控制点亮哪2个数码管,例如count 为1 则点亮 01 数码管 描述 :由于同时点亮2个数码管,需要2个数码管不断的循环才能实现2个数码管同时点亮 所以在这里将数码管显示在单片机的代码封装起来,来让我们调用。 ====================================*/ void singlechip_show_num(uchar count){ switch(count){ // 通过 switch case 语句对 数码管的数值进行精准的管理 case 0 : display(0 , 0); break; case 1 : display(0 , 1); break; case 2 : display(0 , 2); break; case 3 : display(0 , 3); break; case 4 : display(0 , 4); break; case 5 : display(0 , 5); break; case 6 : display(0 , 6); break; case 7 : display(0 , 7); break; case 8 : display(0 , 8); break; case 9 : display(0 , 9); break; case 10 : display(1 , 0); break; } } void main()//main函数自身会循环 { while(1) { for (i = 0; i < 200; i++){ // 使点亮的数码管循环 200 次,保证人眼能够看到的数码管是同时显示的。 singlechip_show_num(count); // 调用数码管显示函数 } count++; //每次循环200次结束, count 变量自身+1,单片机显示+1后的数值 if(count == 11){ // 当count 变量 等于11时,我们把变量再重新初始化为0,从0重新开始计数循环 count = 0; } } } 效果显示:
史海拾趣
|
项目简介 江苏省常熟市 吴栋梁 个人原创的《超音频宽频带功率正弦波逆变电源》系电力电子变流技术(SPWM)类的电源引擎, 资质情况为国内领先水平,持 ...… 查看全部问答> |
|
F2812 的IFR究竟是写0清除状态位还是写1清除? F2812的资料介绍中 Note部分:To clear an IFR bit, you must write a one to it, not a zero. 在寄存器各位Description中:Write a 0 to this bit to clear it to 0 and clear the interrupt reques ...… 查看全部问答> |
|
用汇编写了个程序,两个中断同时使用时,程序不响应,设置优先级后还是不响应。但是单个中断调试时有用,想问下大家这个问题该怎么解决,谢谢了 程序如下 ORG 0000H LJMP RESET // &n ...… 查看全部问答> |
|
请网友不要再乱发论坛里已经有的文章和资料,纯粹浪费空间和读者时间 看看论坛里充斥着发了多次的文章和资料,实在没有意思!请网友不要再乱发论坛里已经有的文章和资料,纯粹浪费空间和读者时间… 查看全部问答> |















