//Descriptions: 數碼管實驗
#define MAIN_Fosc 11059200L //定義主時鐘
#include "15W4KxxS4.H"
#define uint unsigned int
#define uchar unsigned char
sbit s3=P5^4;
uchar code fseg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar code segbit[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
uchar disbuf[4]={0,0,0,0};
uchar code LED_0F[] =
{// 0 1 2 3 4 5 6 7 8 9 A b C d E F -
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8C,0xBF,0xC6,0xA1,0x86,0xFF,0xbf
};
/**********************
引腳別名定義
***********************/
sbit TM1637_DIO = P2^0; //串行數據輸入
sbit TM1637_CLK = P2^1; //時鐘脈沖信號——上升沿有效
// 全局變量
//uchar LED[8]; //用于LED的8位顯示緩存
uchar NumDis[24]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0X6F,\
0x77,0x7C,0x39,0x5E,0x79,0x71,\
0x08,0x48,0x49,\
0x76,0x38,0x0E,0x50,0x37};//0123456789ABCDEF一二三HLJRS
#define TM1637_DIO_IN() {P2M0 = 0; P2M1 = 0; } //設置TM1637_DIO引腳為準雙向口(輸入)
#define TM1637_DIO_OUT() {P2M0 = 0x01; P2M1 = 0;} //設置TM1637_DIO引腳為輸出口
#define TM1637_READ_DIO TM1637_DIO == 1 //讀取TM1637_DIO口的狀態
/**************************************
功能描述:延時函數
入口參數:uint x ,該值為1時,延時1ms
返回值:無
***************************************/
void delay_ms(uint x)
{
uint j,i;
for(j=0;j<x;j++)
{
for(i=0;i<1100;i++);
}
}
/**************************************
功能描述:延時函數
入口參數:uint x ,該值為1時,延時us
返回值:無
***************************************/
void delay_us(uint n)
{
uint j,i;
for(j=0;j<n;j++)
{
for(i=0;i<7;i++);
}
}
/**************************************
功能描述:TM1637開始函數
入口參數:無
返回值:無
***************************************/
void TM1637_Start(void)
{
TM1637_DIO_OUT();
TM1637_CLK = 1;
TM1637_DIO = 1;
delay_us(2);
TM1637_DIO = 0;
}
/**************************************
功能描述:TM1637應答函數
入口參數:無
返回值:無
***************************************/
void TM1637_Ack(void)
{
TM1637_DIO_IN();
TM1637_CLK = 0;
delay_us(5); //在第8個時鐘下降沿之后延時5us,開始判斷ACK信號
while(TM1637_READ_DIO);
TM1637_CLK = 1;
delay_us(2);
TM1637_CLK = 0;
}
/**************************************
功能描述:TM1637停止函數
入口參數:無
返回值:無
***************************************/
void TM1637_Stop(void)
{
TM1637_DIO_OUT();
TM1637_CLK = 0;
delay_us(2);
TM1637_DIO = 0;
delay_us(2);
TM1637_CLK = 1;
delay_us(2);
TM1637_DIO = 1;
}
/**************************************
功能描述:向TM1637寫一個字節
入口參數:uchar oneByte
返回值:無
***************************************/
void TM1637_WriteByte(uchar oneByte)
{
uchar i;
TM1637_DIO_OUT();
for(i=0;i<8;i++)
{
TM1637_CLK = 0;
if(oneByte&0x01) //低位在前
{
TM1637_DIO = 1;
}
else
{
TM1637_DIO = 0;
}
delay_us(3);
oneByte=oneByte>>1;
TM1637_CLK = 1;
delay_us(3);
}
}
/**************************************
功能描述:寫顯示寄存器
入口參數:無
返回值:無
***************************************/
void TM1637_NixieTubeDisplay(void)
{
uchar i;
TM1637_Start();
TM1637_WriteByte(0x40);//40H顯示地址自加1模式
TM1637_Ack();
TM1637_Stop();
TM1637_Start();
TM1637_WriteByte(0xC0); //設置首地址
TM1637_Ack();
for(i=0;i<6;i++) //地址自加,不必每次都寫地址
{
TM1637_WriteByte(0xff); //送數據
TM1637_Ack();
}
TM1637_Stop();
TM1637_Start();
TM1637_WriteByte(0x8f); //開顯示,最大亮度
TM1637_Ack();
TM1637_Stop();
}
/**************************************
功能描述:向指定地址顯示一個字節內容
入口參數:uchar ch,uchar p
返回值:無
***************************************/
void TM1637_NixieTubeDisplayChar(uchar ch,uchar p)//分別代表數碼管的位數以及所顯示的數字
{
if(ch>23) ch=0;//防止數組越界
TM1637_Start();
TM1637_WriteByte(0x44);//0x44固定模式有利于控制顯示位,0x40則采用顯示地址自加模式這里不使用
TM1637_Ack();
TM1637_Stop();
TM1637_Start();
TM1637_WriteByte(0xC0+p);//0X00地址開始顯示
TM1637_Ack();
TM1637_WriteByte(NumDis[ch]);//顯示
TM1637_Ack();
}
/***********************
功能描述:主函數
入口參數:無
返回值:無
************************/
int main()
{
uint Distance=30;
uint Speed=10;
uchar ch=0, p=0;
/////////////////////////////////////////////////
//注意: STC15W4K32S4系列的芯片,上電后所有與PWM相關的IO口均為
// 高阻態,需將這些口設置為準雙向口或強推挽模式方可正常使用
//相關IO: P0.6/P0.7/P1.6/P1.7/P2.1/P2.2
// P2.3/P2.7/P3.7/P4.2/P4.4/P4.5
/////////////////////////////////////////////////
P0M1 = 0; P0M0 = 0; //設置P0.0~P0.7為準雙向口
P1M1 = 0; P1M0 = 0; //設置P1.0~P1.7為準雙向口
P2M0 = 0; P2M1 = 0; //設置P2.0~P2.7為準雙向口
P3M1 = 0; P3M0 = 0; //設置P3.0~P3.7為準雙向口
P4M1 = 0; P4M0 = 0; //設置P4.0~P4.7為準雙向口
P5M1 = 0; P5M0 = 0; //設置P5.0~P5.7為準雙向口
TM1637_NixieTubeDisplay();
while(1)
{
TM1637_NixieTubeDisplayChar(0,1);
TM1637_NixieTubeDisplayChar(0,0);
TM1637_NixieTubeDisplayChar(Distance/10,2);
TM1637_NixieTubeDisplayChar(Distance%10,3);
if(s3==0)
{TM1637_NixieTubeDisplayChar(Speed/10,2);
TM1637_NixieTubeDisplayChar(Speed%10,3);
delay_ms(5000);
}
}
}
|