//使用STC15W404S单片机测试成功驱动TM1650芯片的4位共阴数码管显示电路 //陈永飞于2016.1.18 #include<reg52.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int sbit CLK = P3^2; sbit DIO = P3^3; #define CLK_H CLK = 1 #define CLK_L CLK = 0 #define DIO_H DIO = 1 #define DIO_L DIO = 0 void TM1650_Set(uchar add,uchar dat); uchar Scan_Key(void); uchar CODE[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0~9显示代码 void main() { uchar key; TM1650_Set(0x48,0x51);//为5级亮度,开显示八段显示方式,后一个字节中高位用于亮度,低位用于七段或八段显示方式和开关显示 //如:0x71为七级亮度,八段显示方式,开显示;0x79为为七级亮度,七段显示方式,开显示 TM1650_Set(0x68,CODE[0]); TM1650_Set(0x6A,CODE[5]); TM1650_Set(0x6C,CODE[1]); TM1650_Set(0x6E,CODE[4]); while(1) ; { key = Scan_Key(); //第一个按键按下 if(key == 0x44) //此键值和数据手册上对应 { TM1650_Set(0x6E,CODE[1]);//显示1 } //第二个按键按下 if(key == 0x4c) { TM1650_Set(0x6E,CODE[2]); } //第三个按键按下 //TM1650_Set(0x6E,CODE[3]); } } void Delay_us(uint i) //us延时 { for(;i>0;i--) { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } } void I2CStart(void)//开始信号 { CLK_H; DIO_H; Delay_us(5); DIO_L; } void I2Cask(void) //ACK信号 { uchar timeout = 1; CLK_H; Delay_us(5); CLK_L; while((DIO)&&(timeout<=100)) { timeout++; } Delay_us(5); CLK_L; } void I2CStop(void) //停止信号 { CLK_H; DIO_L; Delay_us(5); DIO_H; } void I2CWrByte(uchar oneByte) //写一个字节高位在前,低位在后 { uchar i; CLK_L; Delay_us(1); for(i=0;i<8;i++) { oneByte = oneByte<<1; DIO = CY; CLK_L; Delay_us(5); CLK_H; Delay_us(5); CLK_L; } } uchar Scan_Key(void) // 按键扫描 { uchar i; uchar rekey; 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(); } |
|