?? readkey.c
字號:
/****************************************************************************
* 文件名:READKEY.C
* 功能:通過UART0讀取上位機軟件EasyARM發(fā)送的按鍵,然后將數(shù)據(jù)轉換后返回到EasyARM,
* 在仿真的LED數(shù)碼顯示器上觀察結果。
* 通訊波特率115200,8位數(shù)據(jù)位,1位停止位,無奇偶校驗。
* 說明:在PC機上運行軟件EasyARM,點擊任一按鍵。
****************************************************************************/
#include "config.h"
/* 定義串口模式設置數(shù)據(jù)結構 */
typedef struct UartMode
{ uint8 datab; // 字長度,5/6/7/8
uint8 stopb; // 停止位,1/2
uint8 parity; // 奇偶校驗位,0為無校驗,1奇數(shù)校驗,2為偶數(shù)校驗
} UARTMODE;
/****************************************************************************
* 名稱:UART0_Ini()
* 功能:初始化串口0。設置其工作模式及波特率。
* 入口參數(shù):baud 波特率
* set 模式設置(UARTMODE數(shù)據(jù)結構)
* 出口參數(shù):返回值為1時表示初始化成功,為0表示參數(shù)出錯
****************************************************************************/
uint8 UART0_Ini(uint32 baud, UARTMODE set)
{ uint32 bak;
/* 參數(shù)過濾 */
if( (0==baud)||(baud>115200) ) return(0);
if( (set.datab<5)||(set.datab>8) ) return(0);
if( (0==set.stopb)||(set.stopb>2) ) return(0);
if( set.parity>4 ) return(0);
/* 設置串口波特率 */
U0LCR = 0x80; // DLAB位置1
bak = (Fpclk>>4)/baud;
U0DLM = bak>>8;
U0DLL = bak&0xff;
/* 設置串口模式 */
bak = set.datab-5; // 設置字長度
if(2==set.stopb) bak |= 0x04; // 判斷是否為2位停止位
if(0!=set.parity) {set.parity = set.parity-1; bak |= 0x08;}
bak |= set.parity<<4; // 設置奇偶校驗
U0LCR = bak;
return(1);
}
/****************************************************************************
* 名稱:SendByte()
* 功能:向串口發(fā)送字節(jié)數(shù)據(jù),并等待發(fā)送完畢。
* 入口參數(shù):data 要發(fā)送的數(shù)據(jù)
* 出口參數(shù):無
****************************************************************************/
void SendByte(uint8 data)
{ U0THR = data; // 發(fā)送數(shù)據(jù)
while( (U0LSR&0x20)==0 ); // 等待數(shù)據(jù)發(fā)送
}
/****************************************************************************
* 名稱:PC_DispChar()
* 功能:向PC機發(fā)送顯示字符。
* 入口參數(shù):x 顯示位置的縱坐標,0-79
* y 顯示位置的橫坐標,0-24
* chr 顯示的字符,不能為0xff
* color 顯示的狀態(tài)包括前景色、背景色、閃耀位。它與dos的字符顯示狀態(tài)一樣。
* 即0~3位:前景色,4~6位:背景色,7位:閃耀位。
* 出口參數(shù):無
****************************************************************************/
void PC_DispChar(uint8 x, uint8 y, uint8 chr, uint8 color)
{ SendByte(0xff);
SendByte(x);
SendByte(y);
SendByte(chr);
SendByte(color);
}
/****************************************************************************
* 名稱:PC_GetKey()
* 功能:從UART0口讀取一字節(jié)按鍵數(shù)據(jù)。
* 入口參數(shù):key 保存讀取數(shù)據(jù)變量的指針
* 出口參數(shù):返回TRUE表示接收到數(shù)據(jù),返回FALSE表示無數(shù)據(jù)
****************************************************************************/
uint8 PC_GetKey(uint8 *key)
{ if ((U0LSR & 0x00000001) != 0)
{ *key = U0RBR;
return (TRUE);
}
else
{ *key = 0x00;
return (FALSE);
}
}
/* 此表為0--9的字模 */
uint8 const ShowTable[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
/* 定義特殊字模 */
#define Sa (1<<0)
#define Sb (1<<1)
#define Sc (1<<2)
#define Sd (1<<3)
#define Se (1<<4)
#define Sf (1<<5)
#define Sg (1<<6)
#define Sh (1<<7)
#define CHAR_H Sb|Sc|Se|Sf|Sg
#define CHAR_i Se|Sf
#define CHAR_t Sd|Se|Sf|Sg
#define CHAR_SG Sg
/****************************************************************************
* 名稱:main()
* 功能:讀取按鍵值,然后將按鍵值從串口發(fā)送出去。
****************************************************************************/
int main (void)
{ UARTMODE uart0_set;
uint8 key;
PINSEL0 = 0x00000005; // 設置I/O連接到UART0
PINSEL1 = 0x00000000;
uart0_set.datab = 8; // 8位數(shù)據(jù)位
uart0_set.stopb = 1; // 1位停止位
uart0_set.parity = 0; // 無奇偶校驗
UART0_Ini(115200, uart0_set); // 初始化串口模式
U0FCR = 0x01; // 使能FIFO
/* 輸出"Hit--" */
PC_DispChar(0x80, 7, CHAR_H, 0);
PC_DispChar(0x80, 6, CHAR_i, 0);
PC_DispChar(0x80, 5, CHAR_t, 0);
PC_DispChar(0x80, 4, CHAR_SG, 0);
PC_DispChar(0x80, 3, CHAR_SG, 0);
while(1)
{ if (PC_GetKey(&key) == TRUE)
{ PC_DispChar(0x80, 0, ShowTable[ (key / 1 ) % 10 ], 0);
PC_DispChar(0x80, 1, ShowTable[ (key / 10 ) % 10 ], 0);
PC_DispChar(0x80, 2, ShowTable[ (key / 100) % 10 ], 0);
}
}
return(0);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -