msp430DA應用,可鍵盤程控
就是應用10位串行DA 5615將數字量轉化為模擬量,用數碼管顯示輸入10位二進制數的數值。用矩陣建模控制10位二進制數字量的輸入,我設置了+1、-1、+10、-10。然后從5615的out端輸出轉化得到的模擬量。
本文引用地址:http://butianyuan.cn/article/201611/316338.htm//動態(tài)顯示方式 P300
//例如,要在8個數碼管上分別顯示"1""2""3""4",動態(tài)掃描顯示的C語言程序如下(共陽極方式):
//針對本開發(fā)板,修改了部分代碼
#include
//共陽數碼管的表格為:
//本表格通過LEDSET軟件可以快速得到
#define uchar unsigned char
#define uint unsigned int
unsigned char const dofly[]={0X84, 0XBD, 0XE0, 0XB0, 0X99, 0X92, 0X82, 0XBC, 0X80, 0X90, 0X88, 0X83, 0XC6, 0XA1, 0XC2, 0XCA };
const uchar KeyCode[16]=
{
//0->key17
0xE7,
//1->key18
0xD7,
//2->key19
0xB7,
//3->key20
0x77,
//4->key21
0xEB,
//5->key22
0xED,
//6->key23
0xDB,
//7->key24
0xDD,
//8->key25
0xBB,
//9->key26
0xBD,
//10->key27
0x7B,
//11->key28
0x7D,
//12->key29
0xEE,
//13->key30
0xDE,
//14->key31
0xBE,
//15->key32
0x7E
};
uchar KeyValue=0xFF;
uchar keyscan(void);
void delay(uint i);
void da5615(uint da);
void main(void)
{
uchar i=0;
uint daben;
uint love=0x66;
WDTCTL = WDTPW + WDTHOLD; //停看門狗
P6DIR |= 0x07; //P6.1,p6.2,p6.3輸出
P4DIR = 0XFF;//P4作為段輸出
P5DIR = 0X0F;//P5作為位輸出
P4OUT = 0XFF;//熄滅所有數碼管
P5OUT = 0X00;//熄滅所有數碼管
P2DIR=0xF0;//P2.4 P2.5 P2.6 P2.7設置為輸出
P2OUT=0x00;//使按鍵按下時能產生中斷
P2IE=0x0F;//P2.0 P2.1 P2.2 P2.3中斷允許
P2IES=0x0F;//P2.0 P2.1 P2.2 P2.3下降沿觸發(fā)中斷
P1DIR |= BIT0+BIT1+BIT2;
BCSCTL1=RSEL2+RSEL1+RSEL0;//XT2開啟 LFXT1工作在低頻模式 ACLK不分頻 最高的標稱頻率
DCOCTL=DCO2+DCO1+DCO0;//DCO為最高頻率
//初始化時鐘
BCSCTL1=RSEL2+RSEL1+RSEL0;//XT2開啟 LFXT1工作在低頻模式 ACLK不分頻 最高的標稱頻率
DCOCTL=DCO2+DCO1+DCO0;//DCO為最高頻率
do
{
IFG1&=~OFIFG;//清除振蕩器失效標志
for(i=255;i>0;i--);
}while(IFG1&OFIFG);//判斷XT2是否起振
BCSCTL2=SELM1+SELS;//MCLK SMCLK時鐘源為TX2CLK不分頻
_EINT();//打開中斷
for(;;)
{
for(i=0;i<4;i++)
{
if(KeyValue==KeyCode[0])
{
KeyValue = 0xff;
if(love+1>1023)love=1023;
else love=love+1;
delay(1000);
}
if(KeyValue==KeyCode[1])
{
KeyValue = 0xff;
if(love<1)love=0;
else love=love-1;
delay(1000);
}
if(KeyValue==KeyCode[2])
{
KeyValue = 0xff;
if(love+10>1023)love=1023;
else love=love+10;
delay(1000);
}
if(KeyValue==KeyCode[3])
{
KeyValue = 0xff;
if(love<10)love=0;
else love=love-10;
delay(1000);
}
}
delay(1000);
da5615(love);
daben=love;
P4OUT =dofly[daben/1000];
daben=daben%1000;
P5OUT = 0x01;
delay(1000);
P4OUT =dofly[daben/100];
daben=daben%100;
P5OUT = 0x02;
delay(1000);
P4OUT =dofly[daben/10];
daben=daben%10;
P5OUT = 0x04;
delay(1000);
P4OUT =dofly[daben];
P5OUT = 0x08; //點亮數碼管LED1,
}
}
void delay(uint i)//延時函數
{
while(i--);
}
void da5615(uint da) //5615的驅動程序,即產生10位二進制數函數
{
uchar i;
//uchar j; //此為實驗程序便于觀察
//uchar k; //此為實驗程序便于觀察
uint han;
da<<=6;
P1OUT=0xf9;
P1OUT=0xf8;
for (i=0;i<12;i++)
{
han=(da&0x8000);
if(han==0x8000)
{P1OUT|=0xf2;}
else P1OUT&=0xfd;
//for(j=0;j<8;j++){delay(60000);} //此為實驗程序便于觀察
P1OUT|=0xf1;
da<<=1;
P1OUT&=0xfe;
}
P1OUT|=0xf4;
P1OUT&=0xfe;
delay(1000);
//for(k=0;k<8;k++)delay(40000); //此為實驗程序便于觀察
}
#pragma vector=PORT2_VECTOR
__interrupt void Port2INT(void)
{
uchar i;
uchar colpos=0x70;//列位置
uchar keytemp=0xff;
for(i=255;i>0;i--);//延時,消除抖動
for(i=0;i<4;i++)//掃描4列
{
colpos &= 0xf0;//保持P1.4~P1.7為輸出,屏蔽P1.0~P1.3
P2OUT=colpos;//輸出列
_NOP();//延時
_NOP();
keytemp=P2IN & 0x0f;//獲取值,屏蔽P1.4~P1.7
keytemp |= colpos;//得到行列值,P1.0~1.3為行值,P1.4~P1.7為列值
if((keytemp&0x0f)!=0x0f) KeyValue=keytemp;//判斷是否有按鍵按下
colpos>>=1;//右移一位,進行下一列掃描
colpos|=0x80;//高位補1,因為是低輸出有效,右移時高位是補0的
}
P2OUT=0x00;//恢復原來的值,使下次按鍵按下時能產生中斷
P2IFG=0x00;//清除中斷標志位
}
評論