- #include <reg51.h>
- #include <intrins.h>
- #include <math.h>
- #include <stdlib.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define nop() _nop_()
- const float ZERO = 0.1;
- uchar key = 16;
- long intValue = 0;
- float pointValue = 0.0;
- float mixValue = 0.0;
- uchar pointPos = 0;
- uchar numCount = 0;
- uchar pointCount = 0;
- uchar intFlag = 0;
- uchar code SEG_DAT[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- uchar code BIT_CS[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
- void display(float floatValue);
-
-
- sbit SH_CP = P0^0; //移位串行时钟脉冲
- sbit DS = P0^1; //串行数据输入
- sbit ST_CP = P0^2; //数据并行输出锁存器控制脉冲
- void delay(uint t)
- {
- uint i,j;
- for(i=0;i<t;i++)
- {
- if (intFlag == 1)
- {
- display(mixValue*100);
- }
- else
- {
- display(mixValue);
- }
- for(j=0;j<120;j++);
- }
- }
- //串行输入子程序
- void Serial_Input_595(uchar dat)
- {
- uchar i;
-
- for (i = 0; i < 8; i++)
- {
- if (dat&0x80) //发送高位
- {
- DS = 1;
- }
- else
- {
- DS = 0;
- }
- dat <<= 1; //次高位左移到高位
- SH_CP = 0; //移位时钟线拉低
- nop();
- nop();
- SH_CP = 1; //DS位上的0或1在移位脉冲上升沿被移入595
- nop();
- nop();
- }
- }
- //并行输出子程序
- void Parallel_Output_595()
- {
- ST_CP = 0;
- nop();
- nop();
- ST_CP = 1; //上升沿将数据送到输出锁存器
- nop();
- nop();
- }
- void display(float floatValue)
- {
- uchar i=0;
- uchar a[6];
- uchar temp;
- long intValue;
- if (floatValue<ZERO)
- {
- numCount = 0;
- pointPos = 0;
- pointCount = 0;
- intValue = 0;
- pointValue = 0;
- mixValue = 0;
- intFlag = 0;
- floatValue = 0;
- }
- switch (pointCount)
- {
- case 0:
- intValue = floatValue;
- break;
- case 1:
- intValue = floatValue*10;
- break;
- case 2:
- intValue = floatValue*100;
- break;
- case 3:
- intValue = floatValue*1000;
- break;
- case 4:
- intValue = floatValue*10000;
- break;
- case 5:
- intValue = floatValue*100000;
- break;
- case 6:
- intValue = floatValue*1000000;
- break;
- default:
- break;
- }
- a[0]=intValue/100000;
- a[1]=(intValue%100000)/10000;
- a[2]=(intValue%10000)/1000;
- a[3]=(intValue%10000%1000)/100;
- a[4]=(intValue%10000%1000%100)/10;
- a[5]=intValue%10;
-
- for(i = 0; i <= 5; i++)
- {
- Serial_Input_595(BIT_CS[i]);
- temp=a[i];
- if (pointPos == 0)
- {
- Serial_Input_595(SEG_DAT[temp]);
- Parallel_Output_595();
- }
- else
- {
- //if (i == (5 + pointPos - numCount))
- if (i == 5 - (numCount - pointPos))
- {
- Serial_Input_595(SEG_DAT[temp]|0x80);
- }
- else
- {
- Serial_Input_595(SEG_DAT[temp]);
- }
- Parallel_Output_595();
- }
- }
- }
- uchar translate(uint keyCode)
- {
- switch(keyCode)
- {
- case 0:
- return '7';
- break;
- case 1:
- return '4';
- break;
- case 2:
- return '1';
- break;
- case 3:
- return 'c';
- break;
- case 4:
- return '8';
- break;
- case 5:
- return '5';
- break;
- case 6:
- return '2';
- break;
- case 7:
- return '0';
- break;
- case 8:
- return '9';
- break;
- case 9:
- return '6';
- break;
- case 10:
- return '3';
- break;
- case 11:
- return '=';
- break;
- case 12:
- return '/';
- break;
- case 13:
- return '*';
- break;
- case 14:
- return '-';
- break;
- case 15:
- return '+';
- break;
- default:
- break;
- }
- }
- void extern0_init(void)
- {
- IT0=1;
- EX0=1;
- EA=1;
- }
- void extern0(void) interrupt 0
- {
- key = translate(P1 & 0x0f);
- if (key <= '9' && key >= '0') //判断按下的键是否为数值
- {
- numCount++;
- if (pointPos == 0)
- {
- intValue = intValue*10 + (key-'0');
- }
- else
- {
- pointCount++;
- switch (pointCount)
- {
- case 1:
- pointValue = pointValue + (key-'0')*0.1;
- break;
- case 2:
- pointValue = pointValue + (key-'0')*0.01;
- break;
- case 3:
- pointValue = pointValue + (key-'0')*0.001;
- break;
- case 4:
- pointValue = pointValue + (key-'0')*0.0001;
- break;
- case 5:
- pointValue = pointValue + (key-'0')*0.00001;
- break;
- case 6:
- pointValue = pointValue + (key-'0')*0.000001;
- break;
-
- }
- }
- mixValue = intValue + pointValue;
-
- if(mixValue>=ZERO && mixValue<=999999.0) //当前数值是否超出限定范围
- {
- }
- else
- {
- numCount = 0;
- pointPos = 0;
- pointCount = 0;
- intValue = 0;
- pointValue = 0;
- mixValue = 0;
- intFlag = 0;
- }
- }
- else
- {
- switch (key)
- {
- case 'c':
- numCount = 0;
- pointPos = 0;
- pointCount = 0;
- intValue = 0;
- pointValue = 0;
- mixValue = 0;
- intFlag = 0;
- break;
- case '=':
- pointPos = numCount; //记录小数点的位置
- break;
- case '-':
- if (pointCount == 0)
- {
- numCount = 0;
- pointPos = -2;
- intFlag = 1;
- }
- while(mixValue>ZERO)
- {
- mixValue = mixValue - 0.254;
- delay(10);
- }
- if (mixValue<=ZERO)
- {
- numCount = 0;
- pointPos = 0;
- pointCount = 0;
- intValue = 0;
- pointValue = 0;
- mixValue = 0;
- intFlag = 0;
- }
- break;
- }
- }
- }
- void main(void)
- {
- extern0_init();
- mixValue = -5;
- while(1)
- {
- if (intFlag == 1)
- {
- display(mixValue*100);
- }
- else
- {
- display(mixValue);
- }
- }
- }
复制代码 全部资料51hei下载地址:
74C922.rar
(84.54 KB, 下载次数: 10)
|