单片机C51课程设计 16进制转为10进制

程序刚运行时,数码管全黑。从键盘输入并在数码管上回显十六进制数。最先键入的数是最低位,刚键入的数在数码管显示器的最左边显示,并将原键入的数依次向右移动一位。若多于四个,则仅显示后键入的四个数。
从键盘键入一个4位十六进制数(0000~270F),大约两秒后显示出对应十进制数(0000~9999)。

就是如何将输入的四个十六进制数字进行转换然后取低四位依次输出在数码管上面,按键就是0-f的,我已经搞好了按键后输出对应数字的程序,现在就不知道如何转换的程序和取低位的程序还有延时2s后输出十进制数的程序的插入在其中也不知道那几个程序如何写()
输出的程序是void main()
{
BYTE i=0;
initial();
while(1)
{
i=keyscan();
if(i!=0xbb)
{
sendto(LED_TAB[i]);
Longdelay(50);
}

转换当然用除10000得到万位再减去万位,同理利用上面的数得到千位,百位十位最后的余数就是个位。
抽取后四位难道不是与下0XFFFF搞定吗
延迟两秒的话可以用每次按键启动或刷新一个定时器来搞定,至于是在中断服务程序内搞还是仅仅做个标记就看情
现在情况是你能显示数字了,那么你就应该能得到输入的数字了吧。(方便起见就不用输入来触发中断了)程序主循环结构是:1、定时扫描输入I/O状态,定时的作用就是用来做防颤处理的,在间隔几毫秒的过程后,如果按键状态还是变化了,才表示实际按动过了。2、上面如果检测到有变化,则将定时器的数字清零,在这个定时器的服务程序里执行将一个标志置位。然后再执行内存中输入数字的变化,和显示的内容。3、判断是否有定时器中断触发的标志,有的话就执行将数转换成BCD码(就是转换成10进制数)的过程,并显示出来。如此就完成了。
至于定时器中断怎样搞,和汇编相比,更简单了,直接初始化定时器的特殊定时器,再在程序里定义中断服务程序就好了。我估计你的输入数字还没能整理,那样的话在上面的第2步里,的第二个操作中先将原数乘16,再加上后来添的数就OK了,显示的话直接对这个数进行处理就好了。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-10-16
#include <AT89X52.H>unsigned char Get_Key;unsigned char Dis[4]={0xff,0xff,0xff,0xff}; unsigned char Seg;unsigned char Delay;unsigned int Conut;unsigned char code disp_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

void scanf(void){unsigned char recode,j;P1=~(0x01<<Seg); //行扫描recode=P1>>4; //读取列 if(recode<0x0f) //判断是否有键按下 { if(++Delay>2) Delay=3; if(Delay==2) //延时去抖动 16ms { if(Conut==0) { Dis[0]=Dis[1]=Dis[2]=Dis[3]=0xff; } Conut=1000; for(j=0;j<4;j++){if(!(recode&0x01<<j))break;}//判断按键所在列 Get_Key=(Seg<<2)+(j+1); //键值 1-16 } } P1=0xf0; if(P1==0xf0) //判断按键是否松开 Delay=0;}

void InitTimer0(void) //2ms{ TMOD = 0x01; TH0 = 0xF8; TL0 = 0x30; EA = 1; ET0 = 1; TR0 = 1;}
void getdec(void){unsigned char i;unsigned int temp; for(i=0;i<4;i++) { if(Dis[3]==0xff) { Dis[3]=Dis[2]; Dis[2]=Dis[1]; Dis[1]=Dis[0]; Dis[0]=0; } } temp=Dis[3]+Dis[2]*16+Dis[1]*256+Dis[0]*4096; Dis[0]=temp/1000; Dis[1]=temp%1000/100; Dis[2]=temp%100/10; Dis[3]=temp%10; for(i=0;i<4;i++) { if(Dis[i]==0) Dis[i]=0xff; else break; }}
void Timer0Interrupt(void) interrupt 1{ TH0 = 0xF8; TL0 = 0x30; Seg=(++Seg)&0x03; P3=0x01<<Seg; //位选 if(Dis[Seg]!=0xff) P2=disp_code[Dis[Seg]]; //显示数据 else P2=0xff; scanf(); //按键扫描 if(Conut)Conut--; if(Conut==1)getdec();}
main(void){unsigned char i;InitTimer0(); while(1) { if(Get_Key) { for(i=3;i>0;i--) //显示数据移动 { Dis[i]=Dis[i-1]; } Dis[0]=Get_Key-1; Get_Key=0; } }}本回答被网友采纳