導航:首頁 > 操作系統 > 單片機io不夠

單片機io不夠

發布時間:2024-07-06 19:23:00

① 8051單片機IO口不夠用,又不想用IO擴展晶元,怎麼辦

使用串列方式驅動液晶只需要3個IO口這是程序
/****************************************************************************/
/***************************12864LCD驅動程序*********************************/
/*****連接關系: ********************************************************/
/**** CS----->PA0 ********************************************************/
/**** SID---->PA1 ********************************************************/
/**** CLK---->PA2 ********************************************************/
/****************************************************************************/
/****創建日期:2009.8.21*****************************************************/
/********作者:孫嘉瑞 *****************************************************/
/****************************************************************************/

#include"LCD12864.H"
#define LCDDELAY Delay_1us(10)
/*向LCD寫一位元組數據*/
void WriteLcdByte( byte date )
{

byte i = 0;
byte temp = 0;
SIDOUT;
CLKOUT;
CSOUT;
LCDDELAY;
for(i = 0;i<8;i++)
{
temp = date&(1<<(7-i));
if(temp)
{
SIDH;
}
else
{
SIDL;
}
CLKL;
LCDDELAY;
CLKH ; //產生上升沿,鎖存數據
LCDDELAY;
}
}
/*從LCD讀取一位元組數據*/
byte ReadLcdByte()
{
byte Ret = 0;
byte i;
SIDIN;
CLKH;
for(i = 0;i < 8;i++)
{

CLKL ; /*產生下降沿,輸出一位數據*/
LCDDELAY;
if(SIDSTA)
{
Ret|=1<<(7-i);
}
else
{
Ret&=~(1<<(7-i));

}
CLKH;
LCDDELAY;
}
return Ret;
}
/*讀忙標志*/
byte BusyCheck(void)
{
byte temp = 0;
byte ldata = 0;
byte hdata = 0;

CSH;
LCDDELAY;
WriteLcdByte(RLCDDAT);
hdata = ReadLcdByte();
ldata = ReadLcdByte();
CSL;
LCDDELAY;
temp = hdata&(1<<7);
return (temp);

}
/*寫LCD命令*/
void WriteComd(byte data)
{
byte ldata = 0;
byte hdata = 0;
while(BusyCheck());
ldata = data<<4; //數據的低四位
hdata = data&0xf0; //數據的高四位
CSL;
LCDDELAY;
CSH;
LCDDELAY;
WriteLcdByte(WLCDCOM);
WriteLcdByte(hdata);
WriteLcdByte(ldata);
CSL;
LCDDELAY;
}
/*寫LCD數據*/
void WriteData( byte data )
{
byte ldata = 0;
byte hdata = 0;
while(BusyCheck());
ldata = data<<4; //數據的低四位
hdata = data&0xf0; //數據的高四位
CSL;
LCDDELAY;
CSH;
LCDDELAY;
WriteLcdByte(WLCDDAT);
WriteLcdByte(hdata);
WriteLcdByte(ldata);
CSL;
LCDDELAY;
}

/*液晶初始化*/
void LcdInit(void)
{

WriteComd(0x30);//0x30
WriteComd(0x04);
WriteComd(0x0C);
WriteComd(0x01);
WriteComd(0x02);
WriteComd(0x80);

}
/*寫入若干位元組*/
void WritenByte(byte *p,byte lengh)
{
while(lengh--)
{
WriteData(*p);
p++;
}
}
/*************************************************/
/*****功能:設定顯示的坐標 ******************/
/*入口參數:row: 1-4 選擇行坐標******************/
/**********line: 1-1選擇列坐標********************/
/*************************************************/
unsigned char LcdSetxy(byte row,byte line)
{

//坐標選擇
if(row>=1&&row<=4&&line>=1&&line<=16)
{
switch(row)
{
case 1: WriteComd(0x80+line-1);break;
case 2: WriteComd(0x90+line-1);break;
case 3: WriteComd(0x88+line-1);break;
case 4: WriteComd(0x98+line-1);break;
}
return 1;
}
else
{
return 0;
}

}

/*************************************************/
/*功能:在液晶的任意位置寫入單個字元******************/
/*入口參數:row : 1-4 選擇要顯示的行**************/
/***********line: 1-16 選擇要顯示的列**************/
/*********** data: 要顯示的字元************/
/*************************************************/
void WriteCode( byte row,byte line,byte data)
{

byte checkerr = 0;
checkerr = LcdSetxy(row, line);
if(checkerr) //坐標正確設定
{
WriteData( data);
}
else //坐標錯誤
{
WriteComd(ClearScreen);
WriteComd(0x80);
WritenByte("坐標輸入錯誤!!",15);
}

}
/*************************************************/
/*功能:在液晶的任意位置寫入字元串******************/
/*入口參數:row : 1-4 選擇要顯示的行**************/
/***********line: 1-16 選擇要顯示的列**************/
/*********** *P: 要顯示的字元串的指針************/
/*************************************************/
void WriteString( byte row,byte line,byte *p)
{

byte checkerr = 0;
byte length = 0;
length = strlen(p); //計算字元串的長度
checkerr = LcdSetxy(row, line);
if(checkerr) //坐標正確設定
{
WritenByte(p, length);
}
else //坐標錯誤
{
WriteComd(ClearScreen);
WriteComd(0x80);
WritenByte("坐標輸入錯誤!!",15);
}

}
/*************************************************/
/*功能:在液晶的任意位置寫入整形數據**************/
/*入口參數:row : 1-4 選擇要顯示的行**************/
/***********line: 1-8 選擇要顯示的列**************/
/*********** num: 要顯示的整形數字***************/
/*************************************************/
void WriteInteger( byte row,byte line, word num )
{
byte checkerr = 0;
byte tab[5];
byte i = 0;
//取出各位數字
tab[0] = num / 10000;
tab[1] = num / 1000 % 10;
tab[2] = num / 100 % 10;
tab[3] = num % 100 / 10;
tab[4] = num % 10;
checkerr = LcdSetxy(row, line);
if(checkerr) //坐標正確設定
{
for(i = 0;i<5;i++)
{
WriteData(tab[i]+48);
}
}
else //坐標錯誤
{
WriteComd(ClearScreen);
WriteComd(0x80);
WritenByte("坐標輸入錯誤!!",15);
}

}
void Dispicture(byte *str)
{

byte i = 0;
byte j = 0;
WriteComd(ClosPict);
for(i = 0;i<32;i++)
{

WriteComd(0x80+i);
WriteComd(0x80);
for(j = 0;j<16;j++)
{
WriteData(str[16*i+j]);
}
}
for(i = 0;i<32;i++)
{

WriteComd(0x80+i);
WriteComd(0x88);
for(j = 0;j<16;j++)
{
WriteData(str[16*32+16*i+j]);
}
}
WriteComd( OpenPict ); //關閉繪圖顯示);

}

② 有沒有什麼單片機有200個io的

單片機IO口不夠用,有如下解決辦法:
1 IO口擴展:
擴展的方法很多,鎖存器;輸出串並轉換/輸入並串轉換;I²C匯流排等等……
不過公子一般都是喜歡採用138或者164來擴展的,以138為例,
這款晶元的作用是把串列輸入的數據並行輸出。注意,它沒有鎖存功能,在允許輸出的情況下,每一個時鍾的上升沿,數據依次從最低位移向最高位。因此,在做數碼管的輸出顯示的時候會出現拖影的想像,下面我們再看看它的真值表,有了真值表才知道如何正確的去編寫程序去驅動它(其它復雜的器件還需要對照時序圖編寫相應的驅動程序)。
當Reset為低電平時不管時鍾為高電平還是低電平也不管輸入引腳A1,A2為何值,輸出的並行數據均為低電平。當Reset為高電平時,只有在時鍾的上升沿,A1A2上的值才被移位輸出。

2 再接一個單片機:
當一個單片機的引腳不夠的時候,需要在外接一個單片機就可以了,讓兩個單片機的TXD與RXD相連就可以了,不過,如果是兩塊單片機同時處理一個感測器(比如說:攝像頭,TFT LCD),那麼你需要考慮時序的問題,特別是當兩塊單片機的處理速度不一樣的時候,這個需要特別注意。
3 埠復用與重映射:
在學習STM32的時候,那麼以STM32為例。
埠復用
STM32用很多內置外設而且都是和GPIO復用的,也就是GPIO可以設置成一些常用的外設如串口的外設等等,數據手冊有詳細說明,需要時就查表。
GPIO作為內置外設使用時就叫復用,也就是圖中的默認復用功能,不把GPIO口當作單純的I/O口而是賦予它一個外設的含義。

埠重映射
埠重映射通過設置重映射寄存器的方式,把這個外設的介面映射到其它的埠,方便PCB布線,虛擬增加外設。

復用功能串口1是PA9 PA10,但是如果我們覺得PB6 PB7更方便是就可以重映射使用這兩個I/O口,重映射還分完全重映射和部分重映射,完全重映射就是功能外設的所有引腳都全部映射,如果映射串口,那麼串口所有相關外設都映射到,這就是完全重映射,否則只映射部分需要的就是部分重映射。

③ 當單片機的i/o口不夠時,如何運用74LS164,使單片機的信號可以在數碼管中顯示

在數碼管動態顯示電路中,74LS164的A、B接單片機的串列數據發送,CLK接串列時鍾輸出,MR接+5V,Q0—Q7接數碼管的欄位,則可將單片機的8根段選線簡化為二根串口線;如果是顯示用8位數碼管,則還可再用一片74LS164作為位選,用法同上,只是這時Q0—Q7接8個數碼管的位選線(公共端)。
另外如果將N片74LS164級聯,還可實現N位數碼管的靜態顯示。

④ 單片機的4個並行I/O埠不夠用時,有哪些擴展方法

單片機的I/O埠擴展方法有鎖存器擴展,串列口轉並行口擴展,專用晶元擴展。

閱讀全文

與單片機io不夠相關的資料

熱點內容
怎麼給APP鎖住 瀏覽:942
aloha防碰撞演算法 瀏覽:314
程序員怎麼學習游戲 瀏覽:225
vue源碼二次開發難嗎 瀏覽:308
安卓導航怎麼使用蘋果carplay 瀏覽:454
androidcdrom 瀏覽:596
腦殘數學計演算法 瀏覽:987
頭像水印源碼psd 瀏覽:158
電話手錶什麼app可以設置號碼 瀏覽:153
單片機存儲器地址容量 瀏覽:622
javahashmap用法 瀏覽:948
大數據挖掘演算法與模型 瀏覽:890
大慶伺服器的dns地址查詢 瀏覽:979
java反射set方法調用 瀏覽:879
java發送郵件jar 瀏覽:490
文件夾隱藏了可以通過地址欄查看 瀏覽:654
歐洲海外市場加密貨幣 瀏覽:977
javalist轉換map 瀏覽:592
androidstudio預覽布局 瀏覽:533
usb文件夾怎麼開 瀏覽:734