|
ATmega16計算器
單片機源程序如下:
- /**********************************************************************/
- /**計數(shù)器按鍵**
-
- (1) (2) (3) (4)
- (5) (6) (7) (8)
- (9) (0) (C) (=)
- (+) (-) (*) (/)
-
- 10:清零 11:確認 12:加 13:減 14:乘 15:除
-
- **********************************************************************/
- //頭文件
- #include <iom16v.h> //包含型號頭文件
- #include <macros.h> //包含"位"操作頭文件
- //宏定義
- #define uchar unsigned char
- #define uint unsigned int
- //定義按鍵返回值
- unsigned char keyvalue;
- //定義數(shù)碼管段碼(共陽)
- uchar LED[]=
- {
- 0xC0,0xF9,0xA4,0xB0,
- 0x99,0x92,0x82,0xF8,
- 0x80,0x90
- };
- //定義數(shù)碼管位的控制端
- uchar tab[]={0,0,0,0};
- //IO端口初始化
- void IO_init(void)
- {
- DDRA = 0XFF;
- DDRB = 0XFF;
- DDRC = 0XFF;
- DDRD = 0XF0;
- PORTA = 0X00;
- PORTB = 0X00;
- PORTC = 0X08;
- //PORTD = 0XFF;
- }
- //8M晶振下,延時1ms
- void delayms(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=1333;y>0;y--);
- }
- //數(shù)碼管顯示
- void display(uint num)
- {
- tab[0]=num%10; //取個位數(shù)
- tab[1]=num/10%10; //取十位數(shù)
- tab[2]=num/100%10; //取百位數(shù)
- tab[3]=num/1000%10; //取千位數(shù)
-
- if(num<=9)//檢測為小于等于9的在個位數(shù)顯示
- {
- PORTA=LED[tab[0]];
- PORTC=0x08;
- delayms(1);
- }
- if(num>9&&num<=99)//檢測為大于9與小于等于99在個十位顯示
- {
- PORTA=LED[tab[0]];
- PORTC=0x08;
- delayms(1);
- PORTA=LED[tab[1]];
- PORTC=0x04;
- delayms(1);
- }
- if(num>99&&num<=999)//檢測為大于99與小于等于999在個十百位顯示
- {
- PORTA=LED[tab[0]];
- PORTC=0x08;
- delayms(1);
- PORTA=LED[tab[1]];
- PORTC=0x04;
- delayms(1);
- PORTA=LED[tab[2]];
- PORTC=0x02;
- delayms(1);
- }
- if(num>999&&num<=9999)//檢測為大于999與小于等于9999在個十百千位顯示
- {
- PORTA=LED[tab[0]];
- PORTC=0x08;
- delayms(1);
- PORTA=LED[tab[1]];
- PORTC=0x04;
- delayms(1);
- PORTA=LED[tab[2]];
- PORTC=0x02;
- delayms(1);
- PORTA=LED[tab[3]];
- PORTC=0x01;
- delayms(1);
- }
- }
- //按鍵掃描
- int key_scan(void)
- {
- uint j;//按鍵循環(huán)次數(shù)變量定義
- PORTD=0xEF;// PD端口輸出 1111 1110
- for(j=0;j<5;j++)//按鍵檢測4次
- if((PIND&0x0F)!=0x0F)//按鍵檢測
- {
- delayms(20);//延時消抖
- if((PIND&0x0F)!=0x0F)//再次檢測
- {
- if((PIND&0x01)==0) //第一個按鍵按下
- keyvalue=1; //返回按鍵值 1
- if((PIND&0x02)==0) //第二個按鍵按下
- keyvalue=2; //返回按鍵值 2
- if((PIND&0x04)==0) //第三個按鍵按下
- keyvalue=3; //返回按鍵值 3
- if((PIND&0x08)==0) //第四個按鍵按下
- keyvalue=4; //返回按鍵值 4
- while((PIND&0x0F)!=0x0F);//等待按鍵釋放
- }
- }
- PORTD=0xDF;
- for(j=0;j<5;j++)
- if((PIND&0x0F)!=0x0F)
- {
- delayms(20);
- if((PIND&0x0F)!=0x0F)
- {
- if((PIND&0x01)==0)
- keyvalue=5;
- if((PIND&0x02)==0)
- keyvalue=6;
- if((PIND&0x04)==0)
- keyvalue=7;
- if((PIND&0x08)==0)
- keyvalue=8;
- while((PIND&0x0F)!=0x0F);
- }
- }
- PORTD=0xBF;
- for(j=0;j<5;j++)
- if((PIND&0x0F)!=0x0F)
- {
- delayms(20);
- if((PIND&0x0F)!=0x0F)
- {
- if((PIND&0x01)==0)
- keyvalue=9;
- if((PIND&0x02)==0)
- keyvalue=0;
- if((PIND&0x04)==0)
- keyvalue=10;
- if((PIND&0x08)==0)
- keyvalue=11;
- while((PIND&0x0F)!=0x0F);
- }
- }
- PORTD=0x7F;
- for(j=0;j<5;j++)
- if((PIND&0x0F)!=0x0F)
- {
- delayms(20);
- if((PIND&0x0F)!=0x0F)
- {
- if((PIND&0x01)==0)
- keyvalue=12;
- if((PIND&0x02)==0)
- keyvalue=13;
- if((PIND&0x04)==0)
- keyvalue=14;
- if((PIND&0x08)==0)
- keyvalue=15;
- while((PIND&0x0F)!=0x0F);
- }
- }
- }
- /*
- //兩種按鍵掃描都可以選擇
- //按鍵掃描
- uint key_scan(void)
- {
- unsigned char X,Y,Z;
- DDRD=0xF0;
- PORTD=0x0F;
- if(PIND!=0x0F) //判斷是否有鍵按下
- {
- delayms(5); //延時,軟件去干擾
- if(PIND!=0x0F) //確認按鍵按下
- {
- X=PIND|0xF0;
- delayms(5);
- DDRD=0x0F;
- PORTD=0xF0;
- if(PIND!=0xF0) //判斷是否有鍵按下
- {
- delayms(5); //延時,軟件去干擾
- if(PIND!=0xf0) //確認按鍵按下
- {
- Y=PIND|0x0F;
- Z=X&Y; //取出鍵值
- switch ( Z ) //判斷鍵值(那一個鍵按下)
- {
- //對鍵值賦值
- case 0b11101110: keyvalue= 1; break;//數(shù)字1鍵
- case 0b11101101: keyvalue= 2; break;//數(shù)字2鍵
- case 0b11101011: keyvalue= 3; break;//數(shù)字3鍵
- case 0b11100111: keyvalue= 4; break;//數(shù)字4鍵
- case 0b11011110: keyvalue= 5; break;//數(shù)字5鍵
- case 0b11011101: keyvalue= 6; break;//數(shù)字6鍵
- case 0b11011011: keyvalue= 7; break;//數(shù)字7鍵
- case 0b11010111: keyvalue= 8; break;//數(shù)字8鍵
- case 0b10111110: keyvalue= 9; break;//數(shù)字9鍵
- case 0b10111101: keyvalue= 0; break;//數(shù)字0鍵
- case 0b10111011: keyvalue=10; break;//刪除鍵
- case 0b10110111: keyvalue=11; break;//ok鍵
- case 0b01111110: keyvalue=12; break;//加鍵
- case 0b01111101: keyvalue=13; break;//減鍵
- case 0b01111011: keyvalue=14; break;//乘鍵
- case 0b01110111: keyvalue=15; break;//除鍵
- default:break;
- }
- while(PIND!=0xf0); //等待按鍵釋放
- }
- }
- }
- }
- } */
- void main(void)
- {
- uint num=0;//按鍵值
- uint shu=0,shu1=0,shu2=0,flag=0,jieguo,fuhao;//數(shù)值定義
- IO_init();//IO端口初始化
- while(1)
- {
- /*鍵盤值賦給num,如果小于9,說明是數(shù)值,假如先按的數(shù)值鍵為2,
- 第一次用到shu1的值為0,則shu1=shu1*10+num(0*10+2=2),
- 如果再按下第二個數(shù)值鍵,假設(shè)按下的數(shù)值鍵為3,
- 則shu1=shu1*10+num(2*10+2=23),這樣就能按下的數(shù)值顯示出來。
- */
- keyvalue=20;//按鍵初值
- key_scan();//按鍵掃描
- num=keyvalue;//按鍵值賦給num
- if(num<=9&&flag==0)//按鍵0~9
- {
- shu1=shu1*10+num; //計算第一個數(shù)
- shu=shu1;
- }
- /*flag是標(biāo)志位,作用就是第一次按下數(shù)值鍵賦值后,再按下功能鍵后,
- flag=1,當(dāng)再按下數(shù)值鍵,就運行下面程序。
- */
- if(num>=0&&num<=9&&flag==1)//按鍵0~9
- {
- shu2=shu2*10+num;//計算第二個數(shù)
- shu=shu2;
- }
- /*使得數(shù)碼管把第二次的數(shù)值shu2顯示出來*/
- if(num>=12&&num<=15)//按鍵12~15 顯示運算符號
- {
- fuhao=num;
- flag=1;
- }
- /*這程序表示按下功能鍵后,把功能鍵值賦給fuhao這個數(shù),
- 同時把fuaho置1,為下次按下數(shù)值鍵作準(zhǔn)備。
- */
- if(num==11)//計算數(shù)值確認
- {
- flag=0;
- switch(fuhao)
- {
- case 12:jieguo=shu1+shu2;break;
- case 13:jieguo=shu1-shu2;break;
- case 14:jieguo=shu1*shu2;break;
- case 15:jieguo=shu1/shu2;break;
- default:break;
- }
- shu=jieguo;//計算結(jié)果送到shu顯示,把shu1和shu2數(shù)清零。
- shu1=0;
- shu2=0;
- }
- if(num==10)//計算結(jié)果清零
- {
- num=0;
- jieguo=0;
- shu=0;
- shu1=0;
- shu2=0;
- flag=0;
- fuhao=0;
- }
- display(shu);//計算結(jié)果顯示
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
ATmega16計算器.zip
(36.21 KB, 下載次數(shù): 94)
2018-12-20 14:25 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|