stm32 f103用TM1637驱动数码管
其中读键部分,无符号变量参与右移运算,然后把无符号返回成有符号变量。因为是改的TM1638的程序,不知道为毛他这么搞,所以把类型改成有符号的了,结果出错。搞了半天才搞明白:有符号变量右移的时候,如果是正数左边填0,如果是负数,左边填1。这是基础的东西,结果搞了半天。接下来还得复习一下C语言了。
接线啥的参考手册。TM1637和TM1638不一样,TM1638驱动共阴数码管比较方便,TM1637驱动共阳数码管比较方便。另外TM1637供电电压是5V,高电平低值为0.7VDD,也就是3.5V,而我这个f103是3.3V的,但是很多端口都耐受5V,所以找了一个可以耐受5V的端口,用开漏输出,上拉10k电阻,顺便还可以直接读键。另外那个数码管的时钟点,真的是麻烦,TM1637的SG口只有8个,偏偏这两个时钟点的阳极是连在公共点上的,所以只好再浪费一或二个单片机IO口了。时钟点部分没有写,反正也简单的。下面是TM1637.c的内容。很简略,下次用得上的时候再说。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
#include "TM1637.h" #include "delay.h" #include "usart.h" /*********************define and global variables*********************************************/ #define CLK GPIO_Pin_10 //clock line #define DIO GPIO_Pin_11 //data line #define Set(x) GPIO_SetBits(GPIOB,(x)) //Sets the selected data port bits #define Reset(x) GPIO_ResetBits(GPIOB,(x)) //Resets the selected data port bits #define Get(x) GPIO_ReadInputDataBit(GPIOB,(x)) //Read the specified input port pin uint16_t const tm_dat[2][14]={{'0','1','2','3','4','5', //the char and its segment code '6','7','8','9','.','-','_',' '}, {0x3F,0x06,0x5B,0x4F,0x66,0x6D, 0x7D,0x07,0x7F,0x6F,0x80,0x40, 0x08,0x00}}; void RCC_Config(){ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); } void GPIO_Config(){ GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin=CLK|DIO; GPIO_Init(GPIOB,&GPIO_InitStructure); Set(CLK); Set(DIO); } void TM1637_start() { delay_us(1); Reset(DIO); } void TM1637_ack() { delay_us(1); Reset(CLK); Set(DIO); while(Get(DIO)); Reset(DIO); Set(CLK); delay_us(1); Reset(CLK);// } void TM1637_stop() { delay_us(1); Set(CLK); delay_us(1); Set(DIO); } void Write_Byte(uint8_t byte){ uint8_t i=0; for(i=0;i<8;i++){ Reset(CLK); if(byte&0x01){ Set(DIO); }else{ Reset(DIO); } Set(CLK); byte>>=1; } } void Write_Cmd(uint8_t cmd) { TM1637_start(); Write_Byte(cmd); TM1637_ack(); TM1637_stop(); } void Write_Dat(uint8_t addr,uint8_t dat){ TM1637_start(); Write_Byte(0xc0|addr); TM1637_ack(); Write_Byte(dat); TM1637_ack(); TM1637_stop(); } int8_t Read_Key(){ uint8_t i=0; uint8_t temp=0x00; TM1637_start(); Write_Byte(0x42); TM1637_ack(); Set(DIO); delay_us(5); for(i=0;i<8;i++){ Set(CLK); temp>>=1; if(Get(DIO)){ temp|=0x80; } delay_us(5); Reset(CLK); delay_us(5); } TM1637_ack(); TM1637_stop(); temp=-(int8_t)temp-8; if((int8_t)temp==-7) temp=0; return temp; } void TM1637_SendData(uint8_t i,char * str){ int j=0,k=0; unsigned char chr; Write_Cmd(0x44); for(;i<8;i++){ k=0; for(j=0;j<14;j++){ if(*str==tm_dat[0][j]){ chr=tm_dat[1][j]; k=1; break; } } if(k==0) chr=0x00; if(*(str+1)=='.'){ chr|=0x80; Write_Dat(i,chr); str++; }else{ Write_Dat(i,chr); } str++; if(*str=='\0')break; } } void TM1637_SendIntData(uint8_t i,int num) { char a; a = num + '0'; TM1637_SendData(i,&a); } void TM1637_Init(){ int i=0; RCC_Config(); GPIO_Config(); Write_Cmd(0x8a); Write_Cmd(0x44); for(i=0;i<6;i++){ Write_Dat(i,0x00); } } |