更多资料请访问与非网德州仪器技术社区
/**************************************************************
程序功能:实现六位数的加,减,乘,除和数的 n次方,键盘 K0~K9的键值
为 0~9,K12~K15分别为+,—,*和/,K10为=,K11为上次输入数的 n方。
***************************************************************/
#include
#include
#define uint unsigned int
#define uchar unsigned char
const uchar segment[19]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0xb7,0xc8,0x8f,0xbf,0x89,0xb9,0xff,0x86,0x88};
uchar static key_flag;
uchar static key1;
uchar A[6]={0,0,0,0,0,0}; //第一次输入的各位数
uchar B[6]={0,0,0,0,0,0}; //第二次输入的各位数
uchar F[8]={0,0,0,0,0,0,16,16}; //存放显示的数
long int c=0; //第一次输入的数值
long int d=0; //第二次输入的数值
int e=0; //存放符号位
long int g;
/****************键盘初始化函数****************/
void int_I_O(void) //扫描键盘 p1口及数码管 p2,p4,p5口的板上资源初始化(数码管共阳极)
{
P1DIR |=BIT0+BIT1+BIT2+BIT3; // p1.0至 p1.3为输出(p1.0至 p1.3为键盘的行)
P1OUT &=0x00; //p1输出初始化全为 0
P5DIR |=BIT7; //p5.7输出
P5OUT &=~BIT7; //使能 UC573SJ芯片,p5.7为锁存器使能端,低电平有效
P2DIR |=0XFF; //p2口与阴极接口端有连接,控制 p2口能获得想要的显示
P4DIR |=0XFF; //p4口与数码管控制端有连接,p4端能控制数码管的熄灭或开启
}
/****************系统时钟初始化函数****************/
void int_clk() //时钟设置为 smclk=mclk=xt2clk
{
uchar i;
BCSCTL1&=~XT2OFF; //xt2off=0,打开高频晶振
BCSCTL2|=SELM1+SELS;//设置 smclk=mclk,并使用高频晶振
do
{
IFG1&=~OFIFG;
for(i=0;i<100;i++)
更多资料请访问与非网德州仪器技术社区
_NOP();
}
while((IFG1&OFIFG)!=0);//直至 OFIFG标志位清为 0
IFG1&=~OFIFG;
}
/****************timerA初始化函数****************/
void int_timer() //smclk为时钟来源,8分频,1MHz,增加模式,10ms来一个中断
{
TACTL|=TASSEL1+TACLR+ID0+ID1;//smclk为时钟来源,8分频,1MHz
TACTL|=MC0+TAIE; //增加模式,并且使能中断
TACCR0=9999; //10ms来一个中断
}
/****************检测键盘有无输入函数****************/
void fast_scan() //检测键盘有无输入,没输入 key_flag=0,有输入 key_flag=1
{
uchar temp;
P1OUT &=0xf0; //p1口低四位清 0,高四位不变,
temp=P1OUT&0xf0; //p1口为 oxf0,没输入,否则有输入
if(temp==0xf0)key_flag=0; //没输入 key_flag=0,有输入 key_flag=1
else
{
key_flag=1;
}
}
/****************行扫描读列值函数****************/
uchar scan_key(uchar line) //
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
示每行扫描一次,判断一下列值
{
uchar key;
P1OUT=line; //接受扫描行,用 p1第四位控制,就是其中 1位为低位,剩余 3位为高位
switch(P1IN&0xf0) //p1高四位输入判断第几列,如第一列 0111
{
case 0x70:key=0x01;break; //第一列 0x01表示,列为从左往右数
case 0xb0:key=0x02;break; //第二列 0x02表示
case 0xd0:key=0x03;break; //第三列 0x03表示
case 0xe0:key=0x04;break; //第四列 0x04表示
default:key=0xff;break;
}
更多资料请访问与非网德州仪器技术社区
return(key); //返回列键值
}
/****************获取键盘数值函数****************/
uchar get_key() //对行扫描,读列值的方法获取键盘数值
{
uchar key;
while(1) //一直扫描,直到扫描完为止
{ key=scan_key(0x7); //第一行的扫描,从下往上为第一行,将 0111给 p1的低 4位
if(key!=0xff){key|=0x10;P1OUT=0x0f;break;} //第一行用 0x10
key=scan_key(0xb); //第二行的扫描,将 1011给 p1的低 4位
if(key!=0xff){key|=0x20;P1OUT=0x0f;break;} //第二行用 0x20
key=scan_key(0xd); //第三行的扫描,将 1101给 p1的低 4位
if(key!=0xff){key|=0x30;P1OUT=0x0f;break;} //第三行用 0x30
key=scan_key(0xe); //第四行的扫描,将 1110给 p1的低 4位
if(key!=0xff){key|=0x40;P1OUT=0x0f;break;} //第四行用 0x40
}
switch(key)
{
case 0x11:key=0;break; //第一行第一列键值为 0,以后键值往后推
case 0x21:key=1;break;
case 0x31:key=2;break;
case 0x41:key=3;break;
case 0x12:key=4;break;
case 0x22:key=5;break;
case 0x32:key=6;break;
case 0x42:key=7;break;
case 0x13:key=8;break;
case 0x23:key=9;break;
case 0x33:key=10;break;
case 0x43:key=11;break;
case 0x14:key=12;break;
case 0x24:key=13;break;
case 0x34:key=14;break;
case 0x44:key=15;break;
}
_NOP(); //延时
return(key); //返回键盘数值给调用函数
}
/****************over函数****************/
void over()
更多资料请访问与非网德州仪器技术社区
{
uchar temp;
P1OUT&=0xc0;
do
{
temp=P1IN&0xc0;
if(temp==0xc0)break;
}
while(1);
}
/****************可调时间的延时函数****************/
void delay(t) //延时一段时间
{
uint i;
for(i=0;i=0;j--)F[j+1]=F[j];
F[0]=key1;
}
i++;
display();
delay2();
fast_scan();
if(key_flag==0) continue;
key_flag=0;
delay2();
fast_scan();
over();
delay2();
}
while(key1<=9&&i<=6);
}
for(j=0;j<=5;j++)A[j]=F[j];
e=key1; //e为符号,e=12为加,e=13为减,e=14为乘,e=15为除
F[7]=e;
display();//x显示符号
for(i=0;i<=5;i++)F[i]=0;
display();
i=0;
fast_scan();
if(key_flag==0) continue;
key_flag=0;
delay2();
fast_scan();
if(key_flag==1)
{
key_flag=0;
更多资料请访问与非网德州仪器技术社区
do
{
key1=get_key();
if(key1<=9)
{
for(j=4;j>=0;j--)F[j+1]=F[j];
F[0]=key1;
}
i++;
display();
fast_scan();
if(key_flag==0) continue;
key_flag=0;
delay2();
fast_scan();
over();
delay2();
}
while(key1<=9&&i<=6);
}
for(j=0;j<=5;j++)B[j]=F[j];
g=key1;
F[7]=g;
display();
over();
delay2();
if(g==10)
{ sum=int_key(e); //算出结果
if(sum>999999){F[7]=16;F[6]=16;F[5]=16;F[4]=16;F[3]=16;F[2]=17;F[1]=17;F[0]=18;}
else
{ F[5]=sum/100000;
F[4]=(sum/10000)%10;
F[3]=(sum/1000)%10;
F[2]=(sum/100)%10;
F[1]=(sum/10)%10;
F[0]=sum%10;
}
}
//else {F[7]=16; break;}//只有=时才显示结果
display();
}
}
/****************中断服务函数****************/
更多资料请访问与非网德州仪器技术社区
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A(void)
{
switch(TAIV)
{
case 2:break;
case 4:break;
case 10:display();
break;
}
}