uint16_t ADC_Converter(void) { uint32_t i; //用于12位数字的计数 uint16_t result = 0; //时序图参见文档的12页。 CONV_H(); Delay_nop(SHORT_DELAY); CONV_L(); // CONV下降沿表示转换启动。 Delay_nop(SHORT_DELAY); CLK_H(); // 先连续两个时钟脉冲,满足时序要求 Delay_nop(SHORT_DELAY); CLK_L(); Delay_nop(SHORT_DELAY); CLK_H(); Delay_nop(SHORT_DELAY); CLK_L(); for(i=0;i<12;i++) // 第三个脉冲开始读取12位的转换内容。 { CLK_H(); Delay_nop(SHORT_DELAY); if( DAT_READ() ) result |= 0x0001; else result &= 0xfffe; CLK_L(); Delay_nop(SHORT_DELAY); result <<= 1; } CLK_H(); Delay_nop(SHORT_DELAY); CLK_L(); // 最后发两个脉冲满足16位的时钟对齐。 Delay_nop(SHORT_DELAY); CLK_H(); Delay_nop(SHORT_DELAY); CLK_L(); Delay_nop(SHORT_DELAY); CONV_H(); // 表示转换结束。 return(result); //返回值 }
u8 SPI_write_byte(u8 byte) { u8 i; for(i=0;i<8;i++) { if(byte & 0x80) MOSI_H(); else MOSI_L(); byte = (byte << 1); CLK_H(); byte |= READ_MISO; CLK_L(); } return(byte); }
static void write_TM1616(u8 data) { u8 data_temp = data; u8 i; for(i=0;i<8;i++) { if((data_temp&0x01)!=0) //send from lower bit { DIN_H(); } else { DIN_L(); } CLK_L(); //TM1616 read data as clk positive edge ndelay(1); CLK_H(); ndelay(1); data_temp = data_temp>>1; } }
static void show_4_num(u8 data1,u8 data2,u8 data3,u8 data4) { DIN_H(); CLK_H(); STB_H(); ndelay(1); write_TM1616_command(0x00); #ifdef LOCK_ADDR write_TM1616_command(0x44); write_TM1616_data_mod0(0xc0,NUM[data1]); write_TM1616_data_mod0(0xc2,NUM[data2]); write_TM1616_data_mod0(0xc4,NUM[data3]); write_TM1616_data_mod0(0xc6,NUM[data4]); #endif #ifdef INC_ADDR write_TM1616_command(0x40); write_TM1616_data_mod1(0xc0,NUM[data1],NUM[data2],NUM[data3],NUM[data4]); #endif sunxi_d7s_display_on(); }