標(biāo)題:
有試過用單片機定時器做SPI通信嗎?
[打印本頁]
作者:
LAW1100
時間:
2022-4-7 15:17
標(biāo)題:
有試過用單片機定時器做SPI通信嗎?
我用軟件寫的SPI接口驅(qū)動1621顯示,發(fā)現(xiàn)如果將delay延時幾ms放在大循環(huán)內(nèi)LCD顯示會一閃一閃的現(xiàn)象,如取消延時則正常顯示,不知是不是通信設(shè)置問題還是硬件問題?有大佬用定時器做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//關(guān)振蕩器和偏壓器
#define WDT_dis 0X0a//關(guān)看門狗
#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//關(guān)振蕩器和偏壓器
14.#define WDT_dis 0X0a//關(guān)看門狗
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(送數(shù)據(jù)和命令)*****************/
void Write_1621(u8 addr, u8 sdata)
{
LCD_CS=0;//打開片選
SendBit_1621(0xa0,3);//寫入標(biāo)志碼《101》
SendBit_1621(addr<<2,6);//寫入addr高6位(Y)
SendBit_1621(sdata,8);//寫入sdata的8位(X)
_Nop();
LCD_CS=1;//關(guān)閉片選
}
/****************1621寫字節(jié)函數(shù)************/
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;
}
}
}
作者:
munuc_w
時間:
2022-4-8 09:01
spi接口可以用普通IO口線通過軟件模擬,跟定時器無關(guān),閃爍可能是刷新太慢的問題,或者只有現(xiàn)實的數(shù)據(jù)變化時再刷新LCD。試試看。
作者:
yzwzfyz
時間:
2022-4-8 15:17
有嵌入式SPI的可以按說明要求去做。
沒有嵌入式SPI的,如果自己寫就很復(fù)雜了,估計樓主很難實現(xiàn),可以提示下列幾點:
一、制定好通訊協(xié)議
1、定義出CLK:即移位時間。
2、定義出:區(qū)分字節(jié)方法,即一個字節(jié)從何處開始,到何處結(jié)束。
3、定義出:幀開始的方式(同步頭,或間隔一段時間),幀結(jié)束的方式(結(jié)束符或計算字節(jié)數(shù)量)。
二、發(fā)送
1、建立一個緩沖區(qū),用于存放通訊數(shù)據(jù)。
2、用定時器中斷實現(xiàn)CLK,每次中斷從緩沖區(qū)中取出數(shù)據(jù),并移動輸出一位(注意是位,不是字節(jié))。再依協(xié)議編寫發(fā)送一個字節(jié)的程序、發(fā)送一幀的程序。
三、接收
1、建立一個緩沖區(qū),用于存放通訊數(shù)據(jù)。
2、依協(xié)議規(guī)定,做出檢出幀開始的方式(同步頭),檢出后起動CLK(可以起動定時器來實現(xiàn)),之后每次中斷讀入一位數(shù)據(jù)。
3、依協(xié)議規(guī)定,完成字節(jié)的拼裝,拼將好一個字節(jié)后,依序存入接收緩沖區(qū)。
4、依協(xié)議規(guī)定,完成幀結(jié)束識別,結(jié)束本次通訊。
剩下的工作,就是分析、處理緩沖區(qū)中的數(shù)據(jù)了。
以上只是粗?jǐn)⑹�,就已較復(fù)雜了。
不管如何,建議樓主,先弄清楚SPI的通訊原理,細(xì)至移位拼裝過程。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1