TA的每日心情 | 擦汗 2019-4-8 08:56 |
---|
签到天数: 372 天 连续签到: 15 天 [LV.9]以坛为家II
|
本帖最后由 xxxxwangchao 于 2018-2-26 13:12 编辑
放假回来终于有时间用涂鸦的板子干点什么了,手里正好有tm1637的数码管,看了代码涂鸦板子的有网络校时的功能,
所以今天就做个显示网络的时钟吧。
首先我们要驱动tm1637,看规格书知道怎么用才行,属于类i2c的协议功能。具体大家自己查看。
然后在板子上找2个闲置的gpio口。加上vcc gnd一共四线。
代码如下
//STmcu的延时
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD = 9*nus;
SysTick->VAL=0X00;//清空计数器
SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源
do
{
temp=SysTick->CTRL;//读取当前倒计数值
}while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
void delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD = 9000*nms;
SysTick->VAL=0X00;//清空计数器
SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源
do
{
temp=SysTick->CTRL;//读取当前倒计数值
}while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
//找到2个闲置的gpio口
#define DIO_OFF() GPIO_ResetBits(GPIOB,GPIO_Pin_13)
#define DIO_ON() GPIO_SetBits(GPIOB,GPIO_Pin_13)
#define CLK_OFF() GPIO_ResetBits(GPIOB,GPIO_Pin_15)
#define CLK_ON() GPIO_SetBits(GPIOB,GPIO_Pin_15)
//io口初始化
void MYI2C_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStruct);
DIO_OFF();
CLK_OFF();
}
//数码管显示的数组0-9
static unsigned char LED[10] = {0x3f,0x06,0x5b,0x4f,//0,1,2,3
0x66,0x6d,0x7d,0x07,//4,5,6,7
0x7f,0x6f//8,9
};
/**********************************************
//IIC Start
**********************************************/
void I2CStart(void) //1637 开始
{
CLK_ON();
DIO_ON();
delay_us(2);
DIO_OFF();
}
/**********************************************
//IIC Stop
**********************************************/
void I2CStop(void) // 1637 停止
{
CLK_OFF();
delay_us(2);
DIO_OFF();
delay_us(2);
CLK_ON();
delay_us(2);
DIO_ON();
}
void I2Cask(void) //1637 应答
{
CLK_OFF();
delay_us(5);
CLK_ON();
delay_us(3);
CLK_OFF();
}
/**********************************************
// 通过I2C总线写一个字节
**********************************************/
void I2CWrite_Byte(unsigned char oneByte)
{
unsigned char i;
for(i=0;i<8;i++)
{ CLK_OFF();
if(oneByte&0x01)
{
DIO_ON();
}
else
{
DIO_OFF();
}
delay_us(3);
oneByte=oneByte>>1;
CLK_ON();
delay_us(3);
}
}
//显示函数
void TimeDisplay(unsigned char a,unsigned char b)
{
static unsigned char flag=0;
I2CStart();
I2CWrite_Byte(0x40);
I2Cask();
I2CStop();
I2CStart();
I2CWrite_Byte(0xc0);
I2Cask();
I2CWrite_Byte(LED[a/10]);
I2Cask();
if(flag ==0){
I2CWrite_Byte(LED[a%10]);
flag = 1;
}
else{
I2CWrite_Byte((LED[a%10])|0x80);
flag = 0;
}
I2Cask();
I2CWrite_Byte(LED[(b%60)/10]);
I2Cask();
I2CWrite_Byte(LED[(b%60)%10]);
I2Cask();
I2CStop();
I2CStart();
I2CWrite_Byte(0x8f);
I2Cask();
I2CStop();
}
这样就可以操控数码管显示了,
然后在打开开发板的网络校时定义
然后在main.c里定义2个全局变量让校时函数赋值。
unsigned char mm=0;
unsigned char ss=0;
校时函数里 涂鸦都提示了需要自己实现。
这样在main的while循环里就可以用网络时间显示了,我加了2个delay让冒号2秒显示一次
注意要用网络校时得调用系统时间函数去得到
void main()
{
......
//RGB上电控制
RGB_Power_Control();
MYI2C_Init();
while(1)
{
wifi_uart_service();
Key_Scan();
wifi_work_state_led();
delay_ms (500);
mcu_get_system_time();
TimeDisplay(ss,mm);
delay_ms (500);
......
}
看看效果图吧
弄个动图不知道能不能显示
这是最简单的方法了,没有网络就尴尬了,后续加上本地timer的计时。有2个按键可以用来校时。
|
|