|

楼主 |
发表于 2022-5-31 17:06:04
|
显示全部楼层
下面是TM1628及TM1639的驱动代码,我在STM32G431开发板上调试通过的,用在其他开发板可能需要调整CLK的延时时间。
- #include "main.h"
- #include "tm1628.h"
- #include "lcd_5110.h"
- extern uint8_t LD_Buff[16],keyok,keys[5],LD_dsp; //,half,angles;
- extern uint16_t wait,count;
- const uint8_t dig[][2]=
- {
- 0x03,0xf0, //'0'
- 0x02,0x10, //'1'
- 0x02,0xe8, //'2'
- 0x02,0xb8, //'3'
- 0x03,0x18, //'4'
- 0x01,0xb8, //'5'
- 0x01,0xf8, //'6'
- 0x02,0x90, //'7'
- 0x03,0xf8, //'8'
- 0x03,0xb8, //'9'
- 0x03,0x38, //10='Y'
- 0x03,0xd0, //11='M'
- 0x02,0x78, //12='D'
- 0x01,0x58, //13='h'
- 0x00,0x58, //14='m'
- 0x00,0x38, //15='s'
- 0x00,0x08, //16='-'
- 0x00,0x20, //17='_'
- 0x01,0xe8, //18='E'
- 0x03,0x70, //19='V'
- 0x03,0xd8, //20='R'
-
- };
- const uint8_t dig1639[][2]=
- {
- 0x0f,0x03, //'0'
- 0x06,0x00, //'1'
- 0x0b,0x05, //'2'
- 0x0f,0x04, //'3'
- 0x06,0x06, //'4'
- 0x0d,0x06, //'5'
- 0x0d,0x07, //'6'
- 0x07,0x00, //'7'
- 0x0f,0x07, //'8'
- 0x0f,0x06, //'9'
- 0x0e,0x06, //'Y'
- 0x07,0x03, //'M'
- 0x0e,0x05, //'D'
- 0x04,0x0e, //'h'
- 0x04,0x06, //'m'
- 0x0c,0x08, //'s'
- 0x00,0x04, //'-'
- 0x08,0x00, //'_'
-
-
- };
- void Delay_us(uint16_t s)
- {
- uint16_t i,j;
- for(i=0; i<s; i++)
- for(j=0; j<10; j++);
- }
- /***************************************************
- *程 序 名:TM1628_DIO(uint8_t dir)
- *作 用:DIO引脚配置
- *输入参数:dir(0=输出,1=输入)
- *转出参数:无
- ***************************************************/
- void TM1628_DIO(uint8_t dir) //DAT端口配置(根据需要配置成输出或输入模式)
- {
- GPIO_InitTypeDef GPIO_InitStruct;
- if(dir == 0){
- GPIO_InitStruct.Pin = LCD_DIN_Pin; //SDA输出模式、弱上拉
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
- HAL_GPIO_Init(LCD_DIN_GPIO_Port, &GPIO_InitStruct);
- }
- else{
- GPIO_InitStruct.Pin = LCD_DIN_Pin; //SDA输入模式
- GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
- HAL_GPIO_Init(LCD_DIN_GPIO_Port, &GPIO_InitStruct);
- }
- HAL_GPIO_WritePin(LCD_DIN_GPIO_Port,LCD_DIN_Pin,GPIO_PIN_SET);
- }
- /******************************************************
- *程 序 名:TM6128_Data(viod)
- *作 用:将DS_Buff缓冲区14个字节写入TM6128芯片
- * 同时读5个字节的键盘数据到keys[n]
- *输入参数:无
- *返回参数:无
- ******************************************************/
- void TM1628_Data(void)
- {
- uint8_t i,key[5];
- TM1628_DIO(0); //设置DIO为输出
-
- STB_reset(); //拉低STB开始操作
- TM1628_Write(0x02); //设置显示模式(6位11段)
- STB_set(); //结束本命令
-
- STB_reset(); //拉低STB开始操作
- TM1628_Write(0x40); //设置写操作
- STB_set(); //结束本命令
-
- STB_reset(); //拉低STB开始操作
- TM1628_Write(0xc0); //地址从0开始
- Delay_us(1);
-
- for(i=0; i<14; i++){
- TM1628_Write(LD_Buff[i]);
- Delay_us(2); //Twait>2us
- }
- STB_set(); //拉高STB结束写操作
- Delay_us(4);
- STB_reset(); //拉低STB发出显示模式命令
- TM1628_Write(0x8c); //开显示,脉冲宽度11/16
- STB_set(); //拉高STB结束写操作
-
- STB_reset(); //拉低STB发出读键盘命令
- TM1628_Write(0x42); //
- TM1628_DIO(1); //设置sda为输入状态
- STB_reset(); //拉低STB开始读按键
- for(i=0; i<5; i++){
- key[i] = TM1628_Read();
- }
- STB_set(); //拉高STB结束读操作
- TM1628_DIO(0); //设置DIO为输出,以便其他函数使用
- //处理按键
- if(0 == keyok){
- if(key[0]&0x01){ //功能键
- keys[0]++;
- keyok = 1; //设置按键标志
- }
- if(key[0]&0x02){ //预置键
- keys[1]++;
- keyok = 1; //设置按键标志
- }
- if(key[1]&0x01){ //复位键
- keys[2]++;
- keyok = 1; //设置按键标志
- }
- if(key[1]&0x02){ //绿按键
- keys[3]++;
- keyok = 1; //设置按键标志
- }
- }
- }
- /******************************************************
- *程 序 名:TM6128_Read
- *作 用:TM6128芯片读1字节操作
- *输入参数:无
- *返回参数:读到的数据(1bety)
- ******************************************************/
- uint8_t TM1628_Read(void)
- {
- uint8_t dat,i;
- // CLK_reset(); //拉高CLK准备读数据
- for(i=0;i<8;i++){
- CLK_reset(); //拉低CLK
- Delay_us(1); //延时并准备数据
- dat>>=1;
- CLK_set(); //拉高CLK
- if(DIO_read())
- dat|=0x80;
- else
- __NOP();
- Delay_us(1);
- }
- return dat;
- }
- /******************************************************
- *程 序 名:TM6128_Write
- *作 用:TM6128芯片写1字节操作
- *输入参数:要写入的数据(bety)
- *返回参数:无
- ******************************************************/
- void TM1628_Write(uint8_t dat)
- {
- uint8_t i;
-
- //开始写一字节数据(低位先)
- for(i=0;i<8;i++){
- CLK_reset(); //拉低CLK准备写数据
- if(dat&0x01)
- {
- DIO_set();
- }
- else
- {
- DIO_reset();
- }
- Delay_us(1); //延时并准备数据
- CLK_set(); //拉高CLK
- Delay_us(1); //延时并准备数据
- dat = dat>>1;
- }
- }
- /******************************************************
- *程 序 名:Display_Digits(uint16_t value)
- *作 用:TM6128芯片转换显示数码(3位有效数字)
- *输入参数:要显示的数值(value),转换数码存放在LD_Buff中
- *返回参数:无
- ******************************************************/
- void Display_Digits(uint16_t value)
- {
- uint8_t n; //当前位值
-
- n = value / 100;
- LD_Buff[1] = dig[n][0];
- LD_Buff[0] = dig[n][1];
-
- n = value % 100 / 10;
- LD_Buff[3] = dig[n][0];
- LD_Buff[2] = dig[n][1];
-
- n = value % 10;
- LD_Buff[5] = dig[n][0];
- LD_Buff[4] = dig[n][1];
-
- // TM1628_Data();
- }
- /******************************************************
- *程 序 名:Display_DateSet(uint8_t type,uint8_t val)
- *作 用:准备显示日期调整数据
- *输入参数:type(显示类型)
- * val(显示的数值)
- *返回参数:无
- ******************************************************/
- void Display_DateSet(uint8_t type,uint8_t val)
- {
- if(type == 6){ //保存设置'SEV'
- LD_Buff[1] = dig[5][0];
- LD_Buff[0] = dig[5][1];
- LD_Buff[3] = dig[18][0];
- LD_Buff[2] = dig[18][1];
- LD_Buff[5] = dig[19][0];
- LD_Buff[4] = dig[19][1];
- }
- else{
- Display_Digits(val); //先转换数值
- LD_Buff[1] = dig[9+type][0];
- LD_Buff[0] = dig[9+type][1];//首位显示YMDhm
- }
- }
- /*********************************************
- * 函数名称:LD_display(uint8_t dsp,uint16_t val)
- * 函数功能:准备显示ADC转换值
- * 入口参数:dsp 当前显示的内容(1=显示标识U1-、2=显示数值、3=显示标识U2-、4=显示数值)
- * val 要显示的数值
- * 出口参数:无
- * 备注:
- *********************************************/
- void Display_AdcVal(uint8_t type,uint16_t val)
- {
- switch(type){
- case 1:
- LD_Buff[0] = dig[19][1]; //'U'
- LD_Buff[1] = dig[19][0];
- LD_Buff[2] = dig[1][1]; //'1'
- LD_Buff[3] = dig[1][0];
- LD_Buff[4] = dig[16][1]; //'-'
- LD_Buff[5] = dig[16][0];
- break;
- case 2:
- LD_Buff[0] = dig[19][1]; //'U'
- LD_Buff[1] = dig[19][0];
- LD_Buff[2] = dig[2][1]; //'2'
- LD_Buff[3] = dig[2][0];
- LD_Buff[4] = dig[16][1]; //'-'
- LD_Buff[5] = dig[16][0];
- break;
- case 3:
- LD_Buff[0] = dig[19][1]; //'U'
- LD_Buff[1] = dig[19][0];
- LD_Buff[2] = dig[3][1]; //'3'
- LD_Buff[3] = dig[3][0];
- LD_Buff[4] = dig[16][1]; //'-'
- LD_Buff[5] = dig[16][0];
- break;
- default:
- if(val > 999){
- val = val / 10;
- Display_Digits(val); //转换数字码
- LD_Buff[3] |= 0x08; //在第二位加小数点
- }
- else{
- Display_Digits(val); //转换数字码
- LD_Buff[1] |= 0x08; //在第一位加小数点
- }
- }
- }
- /******************************************************
- *程 序 名:TM6139_Data(viod)
- *作 用:将Buf缓冲区14个字节写入TM6128芯片
- * 同时读5个字节的键盘数据到Buf
- *输入参数:无
- *返回参数:无
- ******************************************************/
- void TM1639_Data(void)
- {
- uint8_t i,key[5];
- TM1628_DIO(0); //设置DIO为输出
-
- STB_reset(); //拉低STB开始操作
- TM1628_Write(0x40); //设置写操作
- STB_set(); //结束本命令
-
- STB_reset(); //拉低STB开始操作
- TM1628_Write(0xc0); //地址从0开始
- Delay_us(1);
-
- for(i=0; i<16; i++){
- TM1628_Write(LD_Buff[i]);
- Delay_us(2); //Twait>2us
- }
- STB_set(); //拉高STB结束写操作
- Delay_us(4);
- STB_reset(); //拉低STB发出显示模式命令
- TM1628_Write(0x8c); //开显示,脉冲宽度11/16
- STB_set(); //拉高STB结束写操作
-
- STB_reset(); //拉低STB发出读键盘命令
- TM1628_Write(0x42); //
- TM1628_DIO(1); //设置sda为输入状态
- STB_reset(); //拉低STB开始读按键
- for(i=0; i<5; i++){
- key[i] = TM1628_Read();
- }
- STB_set(); //拉高STB结束读操作
- TM1628_DIO(0); //恢复sda为输出状态
- //处理按键
- if(key[0]&0x01)
- keys[0]++;
- if(key[0]&0x02)
- keys[1]++;
- if(key[1]&0x01)
- keys[2]++;
- if(key[1]&0x02)
- keys[3]++;
- /*
- LCD_write_value(0,3,3,0,1,keys[0]);
- LCD_write_value(30,3,3,0,1,keys[1]);
- LCD_write_value(60,3,3,0,1,keys[2]);
- */
- }
- void display1639(uint16_t val,uint16_t cout)
- {
- uint8_t n; //当前位值
-
- n = val / 100;
- LD_Buff[0] = dig1639[n][0];
- LD_Buff[1] = dig1639[n][1];
-
- n = val % 100 / 10;
- LD_Buff[2] = dig1639[n][0];
- LD_Buff[3] = dig1639[n][1];
-
- n = val % 10;
- LD_Buff[4] = dig1639[n][0];
- LD_Buff[5] = dig1639[n][1];
-
- n = cout / 10000;
- LD_Buff[6] = dig1639[n][0];
- LD_Buff[7] = dig1639[n][1];
-
- n = cout % 10000 / 1000;
- LD_Buff[8] = dig1639[n][0];
- LD_Buff[9] = dig1639[n][1];
-
- n = cout % 1000 / 100;
- LD_Buff[10] = dig1639[n][0];
- LD_Buff[11] = dig1639[n][1];
-
- n = cout % 100 / 10;
- LD_Buff[12] = dig1639[n][0];
- LD_Buff[13] = dig1639[n][1];
-
- n = cout % 10;
- LD_Buff[14] = dig1639[n][0];
- LD_Buff[15] = dig1639[n][1];
-
- // buf[half] |= ld; //给数组奇单元的第4位置1
-
- // TM1639_Data();
- }
复制代码 |
|