?? main.c
字號(hào):
/****************************************Copyright (c)**************************************************
** Modified date: 2007-02
** Version:
** Descriptions: 鍵盤輸入與LED掃描人機(jī)對(duì)話程序。
**
********************************************************************************************************/
#include "config.h"
#define KEY (1 << 2) // P0.2口(MISO)為按鍵輸入腳
uint8 T0Flag = 0;
uint16 CS[6]={1234,5678,2324,4578,7811,1100}; //可以輸入的參數(shù)數(shù)組
uint8 DATA[8];
uint8 digitable[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //顯示段碼表
uint8 selectable[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //顯示位碼表
uint8 x=0,y=0,k=0; //變量,k對(duì)DATA0&DATA1&selectable;x&y對(duì)digitable;
uint8 w=0; //顯示刷新時(shí)間計(jì)數(shù)器
uint8 SF=0; //閃爍標(biāo)志位
uint8 TK=0x09; //按鍵按下記錄位寄存器,有效數(shù)據(jù)位為0~7
uint8 M=0,R=0; //按鍵選項(xiàng)計(jì)數(shù)器
uint32 ADC_R[8],ADC_R2;
uint8 i=1;
/*
*********************************************************************************************************
** 函數(shù)名稱 :ADC_Init()
** 函數(shù)功能 :ADC模塊初始化
** 入口參數(shù) :無
** 出口參數(shù) :無
*********************************************************************************************************
*/
void ADC_Init(void)
{ PINSEL1 =(1 << 24)| //P0.28連接到AD0.1
(1 << 28); //P0.30連接到AD0.3
AD0CR = 0x0a | // SEL=0x0a,選擇通道1、3
((Fpclk / 1000000 - 1) << 8) | // CLKDIV=Fpclk/1000000-1,轉(zhuǎn)換時(shí)鐘為1MHz
(1 << 16) | // BURST=0,軟件控制轉(zhuǎn)換操作
(0 << 17) | // CLKS=0, 使用11clock轉(zhuǎn)換
(1 << 21) | // PDN=1,正常工作模式
(0 << 22) | // TEST1:0=00,正常工作模式
(0 << 24) | // START=1,直接啟動(dòng)ADC轉(zhuǎn)換
(0 << 27); // 直接啟動(dòng)ADC轉(zhuǎn)換時(shí),此位無效
}
//-----------------delayns----------------------
void delays(void)
{ uint16 n,j;
for(n=100;n>0;n--)
for(j=50;j>0;j--);
}
/*-----------------------------------------------*/
/*******************************************************************************************
** 函數(shù)名稱:IRQ_AD()
** 功能描述:AD中斷服務(wù)程序
** 入口參數(shù):無
** 出口參數(shù):無
*******************************************************************************************/
void __irq IRQ_AD(void)
{
//if(i>2)
// i=1;
uint32 data,chnl;
data=AD0DR;
chnl=(data>>24) & 0x07; //選擇通道數(shù)
ADC_R[chnl]=(data>>6) & 0x3ff;
//ADC_R2=AD0DR;
//ADC_R2=(ADC_R2 >> 6) & 0x3ff;
ADC_R[chnl] = ADC_R[chnl] * 2480/ 1024; // 將AD結(jié)果轉(zhuǎn)換為電壓mv值(參考電壓經(jīng)過3/4分壓)
// ADC_R2 = ADC_R2 * 2480/ 1024;
// ADC_R2=ADC_R[2];
VICVectAddr = 0;
//AD0CR=AD0CR|(1<<24);
}
/*******************************************************************************************
** 函數(shù)名稱:Timer0_InitExt()
** 功能描述:TIMER0 初始化
** 入口參數(shù):無
** 出口參數(shù):無
*******************************************************************************************/
void Timer0_InitExt(void)
{
T0TC = 0; /* 定時(shí)器設(shè)置為0 */
T0PR = 0; /* 時(shí)鐘不分頻 */
T0MCR = 0x03; /* 設(shè)置T0MR0匹配后復(fù)位T0TC,并產(chǎn)生中斷標(biāo)志 */
T0MR0 = Fpclk/400; /* 2.5毫秒定時(shí) */
T0TCR = 0x01; /* 啟動(dòng)定時(shí)器 */
}
/*******************************************************************************************
** 函數(shù)名稱:IRQ_Timer0()
** 功能描述:TIMER0 中斷服務(wù)程序
** 入口參數(shù):無
** 出口參數(shù):無
*******************************************************************************************/
void __irq IRQ_Timer0(void)
{
T0Flag = 1; // T0中斷標(biāo)志置位
T0IR = 0x01; // 清除中斷標(biāo)志
VICVectAddr = 0;
}
/*******************************************************************************************
** 函數(shù)名稱:IRQ_Init()
** 功能描述:設(shè)置定時(shí)器0中斷IRQ
** 入口參數(shù):無
** 出口參數(shù):無
*******************************************************************************************/
void IRQ_Init(void)
{
VICIntSelect = 0x00; // 所有中斷通道設(shè)置為IRQ中斷
VICVectCntl0 = 0x20 | 4; // 設(shè)置定時(shí)器0中斷通道分配1優(yōu)先級(jí)
VICVectAddr0 = (uint32)IRQ_Timer0; // 設(shè)置中斷服務(wù)程序地址
VICVectCntl1 = 0x20 | 18; // 設(shè)置AD中斷通道分配最高優(yōu)先級(jí)
VICVectAddr1 = (uint32)IRQ_AD; // 設(shè)置AD中斷服務(wù)程序地址
VICIntEnable = (1 << 4)|(1<<18); // 使能定時(shí)器0.AD中斷
}
//二進(jìn)制數(shù)轉(zhuǎn)BCD碼子程序0
void CONVBIT(uint16 num,uint8 hor)
{
DATA[hor] = num/1000; //計(jì)算千位
DATA[hor-1] = num%1000/100; //計(jì)算百位
DATA[hor-2] = num%100/10; //計(jì)算十位
DATA[hor-3] = num%10/1; //計(jì)算個(gè)位
return;
}
/********************************************************************************************************
** 函數(shù)名稱:MSPI_Init()
** 函數(shù)功能:初始化SPI接口,設(shè)置為主機(jī)。
** 入口參數(shù):無
** 出口參數(shù):無
*********************************************************************************************************/
void MSPI_Init(void)
{
//PINSEL0 = (PINSEL0 & 0xFFFF00FF) | 0x00005500; // 設(shè)置管腳連接SPI0
PINSEL0 = (PINSEL0 & (~(0xFF << 8))) | (0x55 << 8) ;
//PINSEL1 = (PINSEL0 & 0xFFFF0C03) | 0x00000154; // 設(shè)置管腳連接SPI1
PINSEL1 = 0x00000000; // 設(shè)置管腳連接GPIO
SPI_SPCCR = 0x52; // 設(shè)置SPI時(shí)鐘分頻
SPI_SPCR = (0 << 3) | // CPHA = 0, 數(shù)據(jù)在SCK 的第一個(gè)時(shí)鐘沿采樣
(1 << 4) | // CPOL = 1, SCK 為低有效
(1 << 5) | // MSTR = 1, SPI 處于主模式
(0 << 6) | // LSBF = 0, SPI 數(shù)據(jù)傳輸MSB (位7)在先
(0 << 7); // SPIE = 0, SPI 中斷被禁止
}
/********************************************************************************************************
** 函數(shù)名稱:MSPI_SendData()
** 函數(shù)功能:向SPI總線發(fā)送數(shù)據(jù)。
** 入口參數(shù):data 待發(fā)送的數(shù)據(jù)
** 出口參數(shù):返回值為讀取的數(shù)據(jù)
********************************************************************************************************/
uint8 MSPI_SendData(uint8 data)
{
SPI_SPDR = data;
while( 0 == (SPI_SPSR & 0x80)); // 等待SPIF置位,即等待數(shù)據(jù)發(fā)送完畢
return(SPI_SPDR);
}
/********************************************************************************************************
** 函數(shù)名稱:main()
** 函數(shù)功能:使用硬件SPI,74HC595驅(qū)動(dòng)控制7段數(shù)碼管顯示。
********************************************************************************************************/
uint8 rcv_data;
int main (void)
{
PINSEL0 = 0x00005500; // 設(shè)置SPI管腳連接(P0.5設(shè)為GPIO)
MSPI_Init(); // 初始化SPI接口
Timer0_InitExt();
IRQEnable(); // IRQ中斷使能
IRQ_Init();
ADC_Init();
while(1)
{
if(T0Flag) //中斷定時(shí)到
{
while(w==40) //顯示數(shù)據(jù)刷新時(shí)間到,執(zhí)行數(shù)據(jù)變換。
{
if(M==0) //如果M=0表示運(yùn)行態(tài),顯示運(yùn)行參數(shù)。
{
CONVBIT(ADC_R[1],3);
CONVBIT(ADC_R[3],7);
}
w=0; //清除顯示刷新計(jì)數(shù)器
if(SF) //閃爍標(biāo)志取反
SF=0;
else
SF=1;
}
if(M==0) //顯示掃描送運(yùn)行參數(shù)
{
x=DATA[k];
}
else //否則送修改參數(shù)
{
if(k==R) //如果當(dāng)前顯示位與鍵盤修改位相等,則根據(jù)閃爍標(biāo)志送黑碼。
{
if(SF==0)
x=10;
else
x=DATA[k];
}
else
x=DATA[k]; //否則直接送顯示數(shù)
}
w++; //顯示刷新計(jì)數(shù)器+1。
T0Flag=0; //顯示標(biāo)志位清除。
rcv_data = MSPI_SendData(digitable[x]); // 發(fā)送顯示數(shù)據(jù)
rcv_data = MSPI_SendData(selectable[k]); // 發(fā)送顯示位碼
if((IO0PIN&KEY) != 0)
{
if(TK==k) //如果鍵盤輸入位=1且鍵盤記錄位與當(dāng)前輸入位相等,執(zhí)行鍵功能。
{
switch(TK) //執(zhí)行TK鍵盤號(hào)功能0~3。
{
case 0: //0#功能為模式鍵M+1。
{
if(M==4)
M=1;
else
M++;
switch(M) //取出1~4#參數(shù)送顯示,以便人機(jī)對(duì)話修改參數(shù)。
{
case 1:
{
CONVBIT(CS[2],4);
CONVBIT(M,0);
}
break;
case 2:
{
CONVBIT(CS[3],4);
CONVBIT(M,0);
}
break;
case 3:
{
CONVBIT(CS[4],4);
CONVBIT(M,0);
}
break;
case 4:
{
CONVBIT(CS[5],4);
CONVBIT(M,0);
}
break;
}
}
break;
case 1: //1#功能為右移鍵標(biāo)志位R+1。
{
if(R==3)
R=0;
else
R++;
}
break;
case 2: //2#功能為加鍵,當(dāng)前閃爍位+1。
{
if(DATA[R]==9)
DATA[R]=0;
else
DATA[R]++;
}
break;
case 3: //3#功能為回車確認(rèn)鍵操作,將修改好的參數(shù)送回參數(shù)區(qū)。
{
while(!M==0)
{
CS[M+1]=DATA[0]*1000+DATA[1]*100+DATA[2]*10+DATA[3];
R=0; //R、M標(biāo)志歸零。
M=0;
}
}
break;
};
TK=0x09; //鍵記錄位清除。
}
}
else if((IO0PIN&KEY) == 0) //如果當(dāng)前鍵盤位=0,則再讀鍵盤、延時(shí)再讀=0則記錄鍵盤位TK=K。
{
delays();
if((IO0PIN&KEY) == 0)
TK=k;
}
if(k==7) //如果鍵盤掃描計(jì)數(shù)器K=7,則清除K,否則K+1。
k=0;
else
k++;
}
}
return 0;
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -