单片机:按键(使用中断)控制数码管的数字加减(c语言实现)
程序员文章站
2022-05-02 22:55:42
本实验的目的:
使用中断实现通过编号为8和c的按键控制数码管数字的加减,加至15之后再循环到0,减到0之后保持0不变。
代码中有详细的注释:
#include
sbit wei=p2^7;
s...
本实验的目的:
使用中断实现通过编号为8和c的按键控制数码管数字的加减,加至15之后再循环到0,减到0之后保持0不变。
代码中有详细的注释:
#include sbit wei=p2^7; sbit duan=p2^6; void delay(int t) { while(t--); } unsigned char code dofly_duanma[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9 unsigned char code dofly_weima[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码 unsigned char keyscan(void) //键盘扫描函数,使用行列逐级扫描法 { unsigned char val; p3=0xf0;//高四位置高,低四位拉低 if(p3!=0xf0)//表示有按键按下 { //delayms(10); //去抖 if(p3!=0xf0) { //表示有按键按下 p3=0xfe; //检测第一行 if(p3!=0xfe) { val=p3&0xf0; val+=0x0e; while(p3!=0xfe); while(p3!=0xfe); return val; } p3=0xfd; //检测第二行 if(p3!=0xfd) { val=p3&0xf0; val+=0x0d; while(p3!=0xfd); while(p3!=0xfd); return val; } p3=0xfb; //检测第三行 if(p3!=0xfb) { val=p3&0xf0; val+=0x0b; while(p3!=0xfb); while(p3!=0xfb); return val; } p3=0xf7; //检测第四行 if(p3!=0xf7) { val=p3&0xf0; val+=0x07; while(p3!=0xf7); while(p3!=0xf7); return val; } } } return 0xff; } /*------------------------------------------------ 按键值处理函数,返回扫键值 ------------------------------------------------*/ unsigned char keypro(void) { switch(keyscan()) { case 0xee:return 0;break;//0 按下相应的键显示相对应的码值 case 0xde:return 1;break;//1 case 0xbe:return 2;break;//2 case 0x7e:return 3;break;//3 case 0xed:return 4;break;//4 case 0xdd:return 5;break;//5 case 0xbd:return 6;break;//6 case 0x7d:return 7;break;//7 case 0xeb:return 8;break;//8 case 0xdb:return 9;break;//9 case 0xbb:return 10;break;//a case 0x7b:return 11;break;//b case 0xe7:return 12;break;//c case 0xd7:return 13;break;//d case 0xb7:return 14;break;//e case 0x77:return 15;break;//f default:return 0xff;break; } } //第一个参数i代表控制第几个数码管,n代表要显示的数字 void screen1(int i,int n) { int high; p0=0; duan=1; duan=0; high=n/10; wei=1; p0=dofly_weima[i]; wei=0; duan=1; p0=dofly_duanma[high]; duan=0; } void screen2(int i,int n) { int lower; p0=0; duan=1; duan=0; lower=n%10; wei=1; p0=dofly_weima[i]; wei=0; duan=1; p0=dofly_duanma[lower]; duan=0; } int num; int key_push; int flag; int main() { num=0; wei=0; duan=0; ea=1; ex0=1; it0=0; ex1=1; it1=0; flag=0; while(1) { if(flag && num>9) { screen1(6,num); flag=0; } else { screen2(7,num); flag=1; } key_push=keypro(); } return 0; } //外部中断处理 void inter_sub() interrupt 0 using 1 { if(key_push==8) { if(num>0) num--; } key_push=0; } void inter_add() interrupt 2 using 1 { if(key_push==12) { num++; if(num==16) num=0; } key_push=0; }