|
爱科技、爱创意、爱折腾、爱极致,我们都是技术控
您需要 登录 才可以下载或查看,没有账号?立即注册
x
麻烦高手给看看哪里出问题了,调不出来。
#include<pic.h>
//#include<intrins.h>
__CONFIG(0X3B31);
#define uchar unsigned char
#define uint unsigned int
#define nop() asm("nop")
void Delay_us(uint i);
#define SCL RB1 //SHUJU
#define SDA RB2 //SHIZHONG
#define SCL_H SCL = 1
#define SCL_L SCL = 0
void Tube_DisNum(uint Num);
#define SDA_H SDA = 1
#define SDA_L SDA = 0
void Delay_ms(uint x);
void I2CStart(void);
void I2Cask(void) ;
void I2CStop(void);
void TM1650_Set(uchar add,uchar dat);
void I2CWrByte(uchar oneByte);
//uchar Scan_Key(void);
uchar CODE[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0~9显示代码
//uchar CODE[11] = {0xFC,0x84,0xBA,0xAE,0xC6,0x6E,0x7E,0xA4,0xFE,0xEE,0x00}; //0~9显示代码
/******************delay*****************/
void Delay_ms(uint x)
{
int i,j;
for(i=0;i<x;i++)
{
for(j=0;j<71;j++);
}
}
void Tube_DisNum(uint Num)
{
uchar Temp[4];
/*数据分离*/
Temp[0] = Num%1000/100;
Temp[1] = Num%100/10;
Temp[2] = Num%10;
Temp[3] = Num%10;
/*显示*/
TM1650_Set(0x68, CODE[Temp[0]]);
I2Cask();
I2CStop();
TM1650_Set(0x6A, CODE[Temp[1]]);
I2Cask();
I2CStop();
TM1650_Set(0x6C, CODE[Temp[2]]);
I2Cask();
I2CStop();
TM1650_Set(0x6E, CODE[Temp[3]]);
I2Cask();
I2CStop();
}
void main()
{
TRISB=0x00;
PORTB=0X00;
TRISC=0X00;
TRISD=0X00;
Delay_us(150);
//uchar key;
Delay_us(1);
PORTD=0Xff;
Delay_ms(500);
Delay_us(50);
TM1650_Set(0x48,0x31);//为5级亮度,开显示八段显示方式,后一个字节中高位用于亮度,低位用于七段或八段显示方式和开关显示
Delay_us(150);
//如:0x71为七级亮度,八段显示方式,开显示;0x79为为七级亮度,七段显示方式,开显示
TM1650_Set(0x68,CODE[0]);
Delay_us(50);
TM1650_Set(0x6A,CODE[0]);
Delay_us(50);
TM1650_Set(0x6C,CODE[0]);
Delay_us(50);
TM1650_Set(0x6E,CODE[0]);
while(1)
{
Tube_DisNum(22);//随便显示个数
}
}
void Delay_us(uint i) //us延时
{
for(;i>0;i--)
{
nop();
nop();
nop();
nop();
nop();
}
}
void I2CStart(void)//开始信号
{
SCL_H;
Delay_us(5);
SDA_H;
Delay_us(5);
SDA_L;
Delay_us(5);
}
void I2Cask(void) //ACK信号
{
uchar timeout = 1;
SCL_H;
Delay_us(5);
SCL_L;
while((SDA)&&(timeout<=100))
{
timeout++;
}
Delay_us(5);
SCL_L;
}
void I2CStop(void) //停止信号
{
SCL_H;
Delay_us(5);
SDA_L;
Delay_us(5);
SDA_H;
Delay_us(5);
}
/******************
void I2CWrByte(uchar oneByte) //写一个字节高位在前,低位在后
{
uchar i;
SCL_L;
Delay_us(1);
for(i=0;i<8;i++)
{
oneByte<<=1;
SDA = CARRY;
SCL_L;
Delay_us(5);
SDA_H;
Delay_us(5);
SCL_L;
}
}
*************/
/*********************/
void I2CWrByte(uchar oneByte) //写一个字节高位在前,低位在后
{
uchar i;
SCL_H;
Delay_us(5);
// SDA_H;
// Delay_us(1);
// SDA_L;
// Delay_us(1);
for(i=0;i<8;i++)
{
if( oneByte & 0x80 )
{
SDA_H;
SCL_L;
Delay_us(10);
SCL_H;
Delay_us(10);
SCL_L;
Delay_us(5);
}
else {
SDA_L;
SCL_L;
Delay_us(10);
SCL_H;
Delay_us(10);
SCL_L;
oneByte <<=1;
}
}
}
/**************************不要了***
uchar Scan_Key(void) // 按键扫描
{
uchar i;
uchar rekey=0;
I2CStart();
I2CWrByte(0x49);//读按键命令
I2Cask();
//DIO_H;
for(i=0;i<8;i++)
{
CLK_H;
rekey = rekey<<1;
if(DIO)
{
rekey++;
}
Delay_us(5);
CLK_L;
}
I2Cask();
I2CStop();
return(rekey);
}
**************************/
void TM1650_Set(uchar add,uchar dat) //数码管显示
{
//写显存必须从高地址开始写
I2CStart();
I2CWrByte(add); //第一个显存地址
I2Cask();
I2CWrByte(dat);
I2Cask();
I2CStop();
}
|
|