久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1166|回復: 2
打印 上一主題 下一主題
收起左側

有試過用單片機定時器做SPI通信嗎?

[復制鏈接]
跳轉到指定樓層
樓主
ID:322939 發表于 2022-4-7 15:17 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
我用軟件寫的SPI接口驅動1621顯示,發現如果將delay延時幾ms放在大循環內LCD顯示會一閃一閃的現象,如取消延時則正常顯示,不知是不是通信設置問題還是硬件問題?有大佬用定時器做SPI通信嗎?請指點下,謝謝!

單片機源程序如下:
    #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_()
    08.#define BIAS 0x52//100 001010010X 4COM 09.#define RCosc 0x30//100 000110000X ??RC???
        10.#define LCD_on 0x06//100 000000110X ??LCD?????
            11.#define LCD_off 0x04//100 000000100X ??LCD??
                12.#define SYS_en 0x02//100 000000010X 打開振蕩器
                    13.#define SYS_dis 0x00//關振蕩器和偏壓器
                        14.#define WDT_dis 0X0a//關看門狗
                            15.#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;
                }
         }
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:752974 發表于 2022-4-8 09:01 | 只看該作者
spi接口可以用普通IO口線通過軟件模擬,跟定時器無關,閃爍可能是刷新太慢的問題,或者只有現實的數據變化時再刷新LCD。試試看。
回復

使用道具 舉報

板凳
ID:123289 發表于 2022-4-8 15:17 | 只看該作者
有嵌入式SPI的可以按說明要求去做。
沒有嵌入式SPI的,如果自己寫就很復雜了,估計樓主很難實現,可以提示下列幾點:
一、制定好通訊協議
1、定義出CLK:即移位時間。
2、定義出:區分字節方法,即一個字節從何處開始,到何處結束。
3、定義出:幀開始的方式(同步頭,或間隔一段時間),幀結束的方式(結束符或計算字節數量)。
二、發送
1、建立一個緩沖區,用于存放通訊數據。
2、用定時器中斷實現CLK,每次中斷從緩沖區中取出數據,并移動輸出一位(注意是位,不是字節)。再依協議編寫發送一個字節的程序、發送一幀的程序。
三、接收
1、建立一個緩沖區,用于存放通訊數據。
2、依協議規定,做出檢出幀開始的方式(同步頭),檢出后起動CLK(可以起動定時器來實現),之后每次中斷讀入一位數據。
3、依協議規定,完成字節的拼裝,拼將好一個字節后,依序存入接收緩沖區。
4、依協議規定,完成幀結束識別,結束本次通訊。
剩下的工作,就是分析、處理緩沖區中的數據了。
以上只是粗敘述,就已較復雜了。
不管如何,建議樓主,先弄清楚SPI的通訊原理,細至移位拼裝過程。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99精品视频免费在线观看 | 天天看天天操 | 91视频大全 | a级大片免费观看 | 国产一区二区三区四区三区四 | 91成人精品视频 | 久久er99热精品一区二区 | 精品成人佐山爱一区二区 | 国产91网站在线观看 | 国产98色在线 | 日韩 | 精品国产一区二区三区成人影院 | 欧一区 | 在线一区二区观看 | 一区二区视频在线 | 国产福利91精品 | 自拍偷拍欧美 | 亚洲一区在线日韩在线深爱 | 欧美精品久久久久久久久老牛影院 | 精品视频一区二区三区在线观看 | 夜久久| 国产成人精品一区二区三区在线 | www.色午夜.com | 午夜三区 | 亚洲精品一区二区三区在线 | 午夜精品久久久久久久久久久久久 | 综合久久99| 亚洲一区国产 | 黑人精品欧美一区二区蜜桃 | 中文字幕在线观看 | 亚洲视频免费在线观看 | 国产99久久精品 | 中日av| 日韩精品在线看 | 成人毛片视频免费 | 亚洲一区二区三区桃乃木香奈 | 日韩理论电影在线观看 | 1区2区视频 | 毛片一级片 | 午夜视频在线播放 | 狠狠做六月爱婷婷综合aⅴ 国产精品视频网 | 最新中文字幕第一页视频 |