本帖最后由 springvirus_589595149 于 2023-12-30 12:38 编辑

看到闲置不用的体重计,电子人必须得有点想法!!!  段码屏的功耗不算大,可以弄个桌面小时钟 !!!

计划总体方案为ATmega16L + HT1621 + RX8025T+ 段码屏 + 旋转编码器
以下为体重计实物图(补拍):
image.png


体重计带的显示屏,一般都是段码屏,而且是定制类的显示模组,能显示冒号之类的,首先拆下
2.jpg

3.jpg


用到的几大板块,来个合影,分别是HT1621转接板,ATmega16L的主控板,外壳盒子里的垫衬板,还有屏
4.jpg


将屏安装在外壳盒子的前面板上
5.jpg

开窗处漏出的为从屏处用烙铁改装的T型头,加热焊接的斑马纸到转接板的排针
6.jpg

安装好的垫衬板,开关,旋转编码器

7.jpg

主控板安装测试,板子本身是做其他的,这里也属于废物利用
8.jpg

焊接RX8025T和相关线路
RX8025T是个精度很不错的RTC,除了具有I2C接口,通过pin7的FOE上拉到VCC,可以输出32.768KHz的信号,很适合改装各种表的32.768KHz的信号输入

image.png

image.png

寄存器地址和介绍如下:

image.png
9.jpg

焊接ATmega16L 的DIP40座
10.jpg

焊接旋转编码器引线
11.jpg

焊接HT1621的相关引线,一些用软线+焊点,一些用杜邦线+排针连接
HT1621用来驱动段码屏,通过CS RD WR DATA的组合与MCU通信
image.png

image.png

读时序:
image.png

写时序:
image.png

指令集如下:
image.png

image.png

12.jpg

充电宝放置位置和空间进行测试
13.jpg

再次核对各自的位置和空间
14.jpg

总装,进行调试
15.jpg

先把屏点亮,摸清屏的真值表并进行记录
18.jpg

最后调试程序,直到读取和显示,调节时间正常,合盖完工
17.jpg

本作品的关键点如下:

1.  HT1621对屏的驱动,尤其是控制位和数据位的写入
本作品的屏为4 COM,从屏的玻璃处看到4个并排的黑点就是COM,剩下的都是SEG了
HT1621最多支持4个COM,32个SEG的驱动,初始化代码如下:
        ht1621_cs_high();
        ht1621_write_high();
        ht1621_data_high();
        ht1621_delay(1000);

        
        //1. turn on system oscillator
        ht1621_write_cmd(CMD_SYS_ENABLE);

        //2. system clock source, on-chip RC oscillator
        ht1621_write_cmd(CMD_RC_256K);

        //3. 1/3 bias  1/4 duty
        ht1621_write_cmd(CMD_13_BIAS_4_COM);

        //4. turn on lcd bias generator
        ht1621_write_cmd(CMD_LCD_ON);


2. RTC RX8025T的驱动,本次使用了模拟I2C,便于移植

起始和终止信号函数如下:

static void RX8025_IIC_Start(void)
{   
        /* IIC start condition*/
    RX8025_SDA_OUTPUT();
    RX8025_SCL_LOW();
    Delayus(DELAY2US);
    RX8025_SDA_HIGH();
    Delayus(DELAY2US);
    RX8025_SCL_HIGH();
    Delayus(DELAY2US);
    RX8025_SDA_LOW();
    Delayus(DELAY2US);
    RX8025_SCL_LOW();
    Delayus(DELAY2US);
        
}


static void RX8025_IIC_Start(void)
{   
        /* IIC start condition*/
    RX8025_SDA_OUTPUT();
    RX8025_SCL_LOW();
    Delayus(DELAY2US);
    RX8025_SDA_HIGH();
    Delayus(DELAY2US);
    RX8025_SCL_HIGH();
    Delayus(DELAY2US);
    RX8025_SDA_LOW();
    Delayus(DELAY2US);
    RX8025_SCL_LOW();
    Delayus(DELAY2US);
        
}

------------------------------------
插播I2C相关:

在90年代中期时,当时新一代单片机中的使用的串口扩展总线接口有MOTOROLA的SPI,NS的Microwire/PLUS和Philips的I2C。其中I2C总线具有标准的规范以及众多的I2C接口的外围器件,形成了较为完善的串行扩展总线。时至今日,很多例如EEPROM,RTC等类型芯片仍然还在大量使用I2C作为通信接口。使用逻辑分析仪可以抓取到带有上位机已分析完成的数据通讯过程,非常直观方便。下面再来复习下I2C总线。
I2C总线包括时钟线SCL和数据线SDA,二者都是双向传输线。总线空闲备用时二者都必须保持高电平,只有关闭I2C总线时才使SCL钳位在低电平。在标准I2C模式下,数据传输速率可达100kbit/s,高速模式下可达400kbit/s。
I2C总线有两种时序状态被定义为起始信号和终止信号。
起始信号:在时钟线保持高电平时,数据线出现由高电平到低电平的跳变,为起始信号,表示启动I2C总线。
终止信号:在时钟线保持高电平时,数据线出现由低电平到高电平的跳变,为终止信号,表示停止I2C总线。
二者都是由主控制器产生。

image.png

I2C总线信号对于信号时长时序都有严格要求,如下表:


image.png

通信时,起始信号后就紧跟着1个字节的寻址字节(包括7位地址位+1位方向位(0写,1读))。
主控制器写操作:


image.png

主控制器读操作:

image.png


主控制器的读写操作, 在一次数据传输过程中需要改变传送方向的操作,此时,起始信号和寻址字节都会重复一次,但两次读写方向正好相反:

image.png

总结如下:
1. 无论何种方式的起始,停止,都是由主控制器发送,数据字节的传送方向则遵循寻址字节中方向位的规定。
2. 寻址字节只表明器件地址及传输方向,器件内部的n个数据地址由器件设计者在该器件的I2C总线数据操作格式中指定第一个数据字节作为器件内的单元地址,且设置地址
自动加减功能,以减少单元地址的寻址操作。
3. 每个字节的传输都必须有应答信号或者非应答信号跟随。
4. I2C总线的被控器在接收到起始信号后,都必须复位它们的总线逻辑,以便对将要开始的被控器地址的传输做预处理。

实际的数据过程可参考RX8025的抓取数据进行结合学习,如下:
I2C数据1.jpg

I2C数据2.jpg



------------------------------------



3. 旋转编码器的驱动,每2ms调取一次识别函数,自带的按键识别使用状态机,每10ms调取一次

u8 Encoder_A_B_Scan(void)
{

        static unsigned char Last_encoder_b;
        static unsigned char Last_encoder_a;
        
        static unsigned char Curr_encoder_b;
        static unsigned char Curr_encoder_a;

        unsigned char uret8 = ROTATE_STOP;

        
        Curr_encoder_a = ENCODER_A;

        Curr_encoder_b = ENCODER_B;



        if(Last_encoder_a == 1 && Last_encoder_b == 1 &&
                Curr_encoder_a == 1 && Curr_encoder_b == 0)
        //zhengzhuan
        {
                uret8 = ROTATE_CLOCKWISE;
        }
        else if(Last_encoder_a == 1 && Last_encoder_b == 1 &&
                Curr_encoder_a == 0 && Curr_encoder_b == 1)
        //fanzhuan
        {        
                uret8 = ROTATE_COUNTERCLOCKWISE;
        }
        else
        //no rotation
        {
               
                uret8 = ROTATE_STOP;
        }


        Last_encoder_a = Curr_encoder_a;
        Last_encoder_b = Curr_encoder_b;

        return uret8;
        

}


利用逻辑分析仪抓取的I2C数据,可以看到0x64为写地址,0x65为读地址,分别读取0x00(秒寄存器)往后的3个字节,秒分小时,
读取0x04(日寄存器)往后的3个字节,日月年
逻辑分析仪抓取RX8025 I2C数据.jpg

作品的整个原理框图为
原理框图.jpg


BOM清单如下:

image.png

编译器使用远古版CVAVR
image.png

烧录工具也使用的远古版SP200S增强版
19.jpg



image.png

视频在这:


最后上程序,就一个main.c,附件只能传TXT
main - 副本.txt (55.94 KB, 下载次数: 5)
全部回复 2
  • 221 主题
  • 5085 帖子
  • 8275 积分
身份:版主
E币:8735
废物利用,节约就是环保。
放在桌面、床头,实用,日久天长,触景生情
  • 0 主题
  • 485 帖子
  • 1850 积分
身份:LV4 高级技术员
E币:2381
回复楼主
您需要登录后才可以评论 登录 立即注册