一、實(shí)驗(yàn)?zāi)康呐c要求
1、熟悉GPIO的使用方法,熟悉HAL固件庫(kù)中GPIO庫(kù)函數(shù)的使用方法
2、掌握矩陣鍵盤(pán)的掃描方法
3、掌握動(dòng)態(tài)掃描數(shù)碼塊的方法
二、實(shí)驗(yàn)設(shè)備
SUN ESMC01實(shí)驗(yàn)儀(含STM32F407模塊)一套、ARM仿真器一套、PC機(jī)一臺(tái)
三、實(shí)驗(yàn)內(nèi)容
1、編寫(xiě)程序:掃描鍵盤(pán),如有按鍵,鍵號(hào)顯示于數(shù)碼管。
2、連接線(xiàn)路,驗(yàn)證實(shí)驗(yàn),掌握數(shù)碼管、矩陣鍵盤(pán)的掃描方法。
intcount0,count1,count2,a;
const uint8_tSegArray[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};
void DIR(void);
uint8_t keyi(void);
HAL_UART_Receive_IT(&huart1, (uint8_t *)RxBuffer,4);//啟動(dòng)串口
while (1)
{
int i;
for (i = 0; i < 8; i++)
RxBuffer[ i] = keyi();uint8_t keyi()
[ i]
{
uint8_t i,j;
GPIOA->ODR = (GPIOA->ODR & 0x00ff); //全"0"->掃描口
if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_11)&& HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_11)) //讀鍵狀態(tài)
a=0;
else
a=1;
while (1)
{
if (a == 0) //調(diào)用判有無(wú)閉合鍵子程序
{
DIR();
continue;
}
i = 0xfe;
j = 0;
while(i != 0xff)
{
GPIOA->ODR = (GPIOA->ODR & 0x00ff)| (i << 8); //鍵掃數(shù)據(jù)->KR_DIG_GPIO_Port PB15..8
if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_11) ==0)
{ //0行有鍵閉合
break;
}
else if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12)== 0)
{//1行有鍵閉合
j += 8;
break;
}
j++;//列計(jì)數(shù)器加1
i = ((i<<1) | 1);
}
if (i == 0xff) //完成一次掃描,沒(méi)有鍵按下
continue;
do
{
DIR();
}while(a != 0); //判斷釋放否
return j; //鍵號(hào)
}
}
數(shù)碼管
while(1)
{
uint8_ti = 0xfe;
uint8_t*pBuffer = RxBuffer;
while(i!= 0xff)
{
GPIOB->ODR |= 0xffff;
GPIOC->ODR |= 0xffff;
GPIOB->ODR = (GPIOB->ODR & 0xff00)| SegArray[*pBuffer++];
GPIOC->ODR = (GPIOC->ODR & 0xff00)| i ;
HAL_Delay(1); / /延遲1ms
i =((i << 1) | 0x1);
}
}
|