|
程序是某一個(gè)寶買的4位共陽(yáng)數(shù)碼管模塊(帶兩塊595)資料改的,原程序只能顯示4位整數(shù)(少一位都會(huì)出錯(cuò)),我改成了能動(dòng)態(tài)顯示0~9999任意帶小數(shù)點(diǎn)的實(shí)數(shù),隨便幾位,實(shí)測(cè)都完美顯示(比如原數(shù)3.14159、顯示3.141,原數(shù)3.02、顯示3.020)!
有喜歡的拿走。。。
單片機(jī)代碼附上
#include <reg52.h> //頭文件
#include <intrins.h>
#define uchar unsigned char // 數(shù)據(jù)類型簡(jiǎn)化-起別名
#define uint unsigned int
uchar i, duan, wei,dw;
uint num;
float x= 24.15; //0~9999任意實(shí)數(shù)
static uchar WEI;
sbit DIO = P1^4;
sbit R_CLK = P1^3;
sbit S_CLK = P1^2;
uchar code smgduan[] = {0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xfd,0xff,0xfe}; //{0,1,2,3,4,5,6,7,8,9,-,全滅,.}
uchar code smgwei[] = {0x10,0x20,0x40,0x80};
void display(num)
{
if (x>=0 && x<10) {num=x*1000;dw=0;}
if (x>=10 && x<100) {num=x*100;dw=1;}
if (x>=100 && x<1000) {num=x*10;dw=2;}
if (x>=1000 && x<10000) {num=x*1;dw=3;}
switch(WEI)
{
case 0 :
if (dw==0)
{duan = smgduan[num / 1000 % 10]& smgduan[12] ; break; }
else duan = smgduan[num / 1000 % 10];break;
case 1 :
if (dw==1)
{ duan = smgduan[num / 100 % 10]& smgduan[12] ; break; }
else duan = smgduan[num / 100 % 10]; break;
case 2 :
if (dw==2)
{ duan = smgduan[num / 10 % 10]& smgduan[12] ; break; }
else duan = smgduan[num / 10 % 10]; break;
case 3 :
if (dw==3)
{ duan = smgduan[num % 10]& smgduan[12] ; break; }
else duan = smgduan[num % 10]; break;
}
for(i = 0; i < 8; i ++)
{
S_CLK = 0;
R_CLK = 0;
if(duan & 0x01) DIO = 1;
else DIO = 0;
S_CLK = 1;
duan >>= 1; //從最低位讀入
}
wei = smgwei[WEI];
for(i = 0; i < 8; i ++)
{
S_CLK = 0;
R_CLK = 0;
if(wei & 0x01) DIO = 1;
else DIO = 0;
S_CLK = 1;
wei >>= 1;
}
R_CLK = 1;
WEI ++;
if(WEI == 4) WEI = 0;
}
void timer0Init() //定時(shí)器0初始化
{
EA = 1; //打開(kāi)總中斷
ET0 = 1;//打開(kāi)定時(shí)器0中斷
TR0 = 1; //啟動(dòng)定時(shí)器0
TMOD |= 0X01; //定時(shí)器工作模式1,16位定時(shí)模式
TH0 = 0xf5;
TL0 = 0x33; //定時(shí)3ms
}
void main()
{
timer0Init();
while(1);
}
void timer0() interrupt 1 //定時(shí)器中斷服務(wù)函數(shù)
{
TH0 = 0xf5;
TL0 = 0x33; //定時(shí)3ms
display(num);
}
|
評(píng)分
-
查看全部評(píng)分
|