数码管的学习,本项目涉及到数码管显示保留不同位小数的floatl类型的小数以及显示整数的方法。
准确的运用的六位数码管正确显示方法。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include <reg51.h>
- #include <intrins.h>
- #include <stdio.h>
- #include <string.h>
- #define u16 unsigned int
- #define u8 unsigned char
- sbit DX=P2^0;
- sbit WX=P2^1;
- void delay_ms(u16 x)//毫秒延时函数
- {u16 i,j;
- for(i=0;i<x;i++)
- for(j=0;j<115;j++);
- }
- u8 code table[]={
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71,0x00}; //共阴数码管编码
- void print_float_LED2(char str[])
- {
- u8 temp;
- int i,j;
- //char str[9] = "11-15-30";
- /*switch(x)
- {
- case 1:sprintf(str,"%.1f",n);break;
- case 2:sprintf(str,"%.2f",n);break;
- case 3:sprintf(str,"%.3f",n);break;
- case 4:sprintf(str,"%.4f",n);break;
- case 5:sprintf(str,"%.5f",n);break;
- } */
- for(j=0;j<95;j++)
- {
- i=strlen(str)-1; //从最低位开始输出
- temp=0x7f;
- while(i>=0)
- {
- P0=0XFF; /*消除P0的值*/
- WX=1; /*位选输入有效*/
- P0=temp; /*输出位选码*/
- WX=0; /*位选锁存*/
- P0=0; /*消除P0的值*/
- DX=1; /*段选输入有效*/
- if(str[i]=='-') { P0=0x40;} /*如果为-,则直接显示-*/
- else P0=table[str[i]-'0']; /*否则,输出不带小数点的段码*/
- DX=0; /*段码锁存*/
- temp=_cror_(temp,1);
- i--;
- delay_ms(1);
- }
- }
- }
- void main()
- {
- char str[8] = "23-59-59";
- print_float_LED2(str);
- while(1)
- {
- str[7] = str[7]+1;
- if(str[7]=='9'+1)
- {
- str[7]='0';
- str[6] = str[6]+1;
- }
- if(str[6]=='6'){
- str[6]='0';
- str[4] = str[4]+1;
- }
- if(str[4]=='9'+1){
- str[4]='0';
- str[3] = str[3]+1;
- }
- if(str[3]=='6')
- {
- str[3]='0';
- str[1] = str[1]+1;
- }
- if(str[0]!='2' && str[1]=='5')
- {
- str[1]='0';
- str[0] = str[0]+1;
- }
-
- if(str[0]=='2' && str[1]=='4')
- {
- str[0] = '0';
- str[1] = '0';
- }
- print_float_LED2(str); //Str[7]的值更新后,再次输出函数
-
- }
- }
复制代码
所有资料51hei提供下载:
数码管学习.7z
(37.53 KB, 下载次数: 22)
|