打印
[STC单片机]

HT1621驱动有没有人使用定时器做SPI通信?

[复制链接]
789|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
LKC134|  楼主 | 2022-4-8 09:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用软件模拟SPI接口通信,发现在大循环内用延时函数就会影响LCD显示一闪一闪的,取消延时函数则正常显示,不知是那里出问题,因为后面的功能要用到CS5460计量芯片显示数据,处理计算这块要费时间,显示肯定会有影响。如果使用定时器做SPI通信给1621做驱动就会解决这问题,不知那位大佬使用这方式做驱动呢?下面是部分1621程序:
#include "STC15.H"
     #include "intrins.h"
     #include <string.h>
     #define u8 unsigned char
     #define u16  unsigned int
     #define u32 unsigned long
     #define BIAS 0x52//100 001010010X 4COM
     #define RCosc 0x30//100 000110000X ??RC???
     #define LCD_on 0x06//100 000000110X ??LCD?????
     #define LCD_off 0x04//100 000000100X ??LCD??
     #define SYS_en 0x02//100 000000010X 打开振荡器
    #define SYS_dis 0x00//关振荡器和偏压器
    #define WDT_dis 0X0a//关看门狗
    #define _Nop()        _nop_();_nop_();_nop_()
    #define BIAS 0x52//100 001010010X 4COM 09.#define RCosc 0x30//100 000110000X ??RC???
    #define LCD_on 0x06//100 000000110X ??LCD?????
    #define LCD_off 0x04//100 000000100X ??LCD??
    #define SYS_en 0x02//100 000000010X 打开振荡器
    #define SYS_dis 0x00//关振荡器和偏压器
    #define WDT_dis 0X0a//关看门狗
    #define _Nop()        _nop_();_nop_();_nop_()

       u8 code num_data[]={0xf5,0x05,0xd3,0x97,0x27,0xb6,0xf6,0x15,0xf7,0xb7};//0-9字库




                                    void Delay(unsigned int Time)//50MS
                                     {
                                                  u8 i;
                                                  TMOD=0x01;
                                                  TH0=(65536-50000)/256;
                                                  TL0=(65536-50000)%256;
                                                  TR0=1;
                                                  for(i=0;i<Time;i++)
                                                  {
                                                          while(~TF0);
                                                          TF0=0;
                                                          TH0=(65536-50000)/256;
                                                  TL0=(65536-50000)%256;
                                                  }
                                         }


                                         /******************SendCmd(送命令)********************/
                                         void SendCmd_1621(u8 command)
                                         {
                                         LCD_CS=0;
                                         _Nop();
                                         SendBit_1621(0x80,4);
                                         SendBit_1621(command,8);
                                         LCD_CS=1;
                                         }
                                         /****************Name:Write 1621(送数据和命令)*****************/
                                         void Write_1621(u8 addr, u8 sdata)
                                         {
                                                 LCD_CS=0;//打开片选
                                                SendBit_1621(0xa0,3);//写入标志码《101》
                                                SendBit_1621(addr<<2,6);//写入addr高6位(Y)
                                                 SendBit_1621(sdata,8);//写入sdata的8位(X)
                                                 _Nop();
                                                 LCD_CS=1;//关闭片选
                                        }
                                         /****************1621写字节函数************/
                                         void SendBit_1621(u8 datas,u8 cnt)//datas高位 cnt写入 ,高位在前
                                        {
                                                 u8 i;
                                                 for(i=0;i<cnt;i++)
                                                 {
                                                         LCD_WR=0;
                                                         if(datas&0x80)
                                                                 LCD_DATA=1;
                                                         else
                                                                 LCD_DATA=0;
                                                           LCD_WR=1;
                                                           datas<<=1;
                                                 }
                                         }
                                         /***************清除1621显示*************/
                                         void HT1621_all_off(void)
                                         {
                                                 u8 t;
                                                 u8 Y=0;
                                                 for(t=0;t<32;t++)
                                                 {
                                                         Write_1621(Y,0x00);
                                                         Y++;
                                                 }
                                         }
                                         /****************全部点亮LCD***************/
                                                 void HT1621_all_on(void)
                                                 {
                                                         u8  f;
                                                         u8 G=0;
                                                         for(f=0;f<32;f++)
                                                         {
                                                                 Write_1621(G,0xff);
                                                                 G++;
                                                         }
                                                 }
                                         /*****************主程序*******************/
                                         void main(void)
                                         {
                                             u8 i=0;
                                                 IO_init();

                                 HT1621_IO_init();//LCD初始化






                                           HT1621_all_on();//全显示
                                          Delay(20);
                                           HT1621_all_off();//清屏
                                                while(1)
                                                 {

                                             Write_1621(0,num_data[ i]);
                                                           i++;
                                                         Delay(10);//500ms
                                                               if(i>9)
                                                                {
                                                                  i=0;
                                                                     }
                                                                }
                                                        }


使用特权

评论回复

相关帖子

沙发
ayb_ice| | 2022-4-8 09:47 | 只看该作者
本帖最后由 ayb_ice 于 2022-4-8 09:49 编辑

写数据的过程不被打扰过长应该没问题的,延时的时候又没写数据,不会有问题的,除非你在很快的更新显示的数据

使用特权

评论回复
板凳
LKC134|  楼主 | 2022-4-8 11:07 | 只看该作者
就上面的代码中,大循环里的延时500ms,就造成显示约隔1秒就显示一次,如取消延时则正常,不知是那里问题?

使用特权

评论回复
地板
coody| | 2022-4-8 11:53 | 只看该作者
HT1621显示是自扫描,怎么会闪?奇怪,找找原因吧。

使用特权

评论回复
5
mqx2020| | 2022-4-9 08:51 | 只看该作者
首先你的这个延时函数,跟直接用循环语句延时是没有区别的,而且还占了一个定时器,其次HT1621是自扫描的,只要写显存就会显示,你说的一闪一闪的问题,是否存在了定期清屏的问题,最后你要的功能,两个函数进行不冲突,只要定一个主函数循环周期,比如以25ms做一个周期,显示函数每20个周期执行一次,另一个函数每5个周期执行一次就可以了。

使用特权

评论回复
6
LKC134|  楼主 | 2022-4-9 09:25 | 只看该作者
mqx2020 发表于 2022-4-9 08:51
首先你的这个延时函数,跟直接用循环语句延时是没有区别的,而且还占了一个定时器,其次HT1621是自扫描的, ...

上面程序中只有在开机初始化时执行一次清屏,没有定期清屏代码,所以看不出是那里问题?

使用特权

评论回复
7
datouyuan| | 2022-4-9 10:13 | 只看该作者
LKC134 发表于 2022-4-8 11:07
就上面的代码中,大循环里的延时500ms,就造成显示约隔1秒就显示一次,如取消延时则正常,不知是那里问题? ...

你是不是说反了?
HT1621所有段显示一次需要16ms。
有延时才应该正常。

使用特权

评论回复
8
LKC134|  楼主 | 2022-4-9 11:23 | 只看该作者
datouyuan 发表于 2022-4-9 10:13
你是不是说反了?
HT1621所有段显示一次需要16ms。
有延时才应该正常。

没有说反,目前的现象是有延时就不显示,取消延时就正常

使用特权

评论回复
9
datouyuan| | 2022-4-9 14:24 | 只看该作者
HT1621要进行一些配置,例如system clock、偏置、com数量等。
HT1621的最小脉宽是3us,stc15假如工作在1T模式,延时3个nop操作是不够的,应延时36个nop操作。

但你的代码能正常显示,看来stc15是工作在12T模式,并且不配置HT1621也没啥问题。
你的HT1621驱动虽不完善,但还是能正常工作,说明问题不是出在驱动部分。

不操作HT1621时间(或者说显存不变持续时间)要远大于16ms(例如0.5秒或永久),才能显示正常。
你应该优先解决“取消延时就正常”这点。



使用特权

评论回复
10
LKC134|  楼主 | 2022-4-9 16:13 | 只看该作者
datouyuan 发表于 2022-4-9 14:24
HT1621要进行一些配置,例如system clock、偏置、com数量等。
HT1621的最小脉宽是3us,stc15假如工作在1T模 ...

感谢楼上的分析,我查找了好几天,包括驱动部分也修改,驱动芯片也换过,故障还是一样,被搞蒙了。看来先静一静再查看。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

339

帖子

6

粉丝