完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在论坛里搜一搜吧,有不少大神都有把做了的计算器例程放在论坛上
|
|
|
|
//4*4矩阵键盘P3口检测程序,按下键后相应的代码显示在数码管上,行、列数显示在P1八个LED,蜂鸣器提示音。
#include #define uint unsigned int #define uchar unsigned char ***it dula=P2^6; //数码管段选 ***it wela=P2^7; //数码管位选 ***it Buzzer=P2^3; //蜂鸣器端口 bit Buzzer_sign=0; //蜂鸣器使能标志 uchar temp; //临时变量 uchar key=16; //初始键值,"-" uchar code table[]={ //0~F数组,共阳数码管 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71, 0x40,0x80}; //0x40,0x80为"-"、"."符号 void display(uchar num) //数码管显示程序 { P0=table[num]; dula=1; dula=0; P0=0xc0; wela=1; wela=0; } /********************************** 矩阵按键扫描程序 **********************************/ void key_scan() { static bit sign0,sign1,sign2,sign3; //按键自锁标志变量 static uchar count0,count1,count2,count3;//消抖计数变量 /*扫描第一行键盘*/ P3=0xfe; //给P3赋值=1111 1110 temp=P3; //读取P3值赋于temp=XXXX 1110 if(temp!=0xfe) //如果temp!=0xfe第一行有键按下 { count0++; //消抖计数器自+1 if(count0>=250) //计数值>=250 { count0=250; //计数值限制250 if(sign0==0) //如果自锁标志为0 { sign0=1; //自锁标志置1 switch(temp) //多分支输出键值 { case 0xee:key=0;break; case 0xde:key=1;break; case 0xbe:key=2;break; case 0x7e:key=3;break; } Buzzer_sign=1; //蜂鸣器使能标志位置1 TR0 = 1; //启动定时器 P1=temp; //LED显示 } } } else { count0=0; //消抖计数器清0 sign0=0; //自锁标志清0 } /*扫描第二行键盘*/ P3=0xfd; temp=P3; if(temp!=0xfd) { count1++; if(count1>=250) { count1=250; if(sign1==0) { sign1=1; switch(temp) { case 0xed:key=4;break; case 0xdd:key=5;break; case 0xbd:key=6;break; case 0x7d:key=7;break; } Buzzer_sign=1; //蜂鸣器使能标志位置1 TR0 = 1; //启动定时器 P1=temp; //LED显示 } } } else { count1=0; sign1=0; } /*扫描第三行键盘*/ P3=0xfb; temp=P3; if(temp!=0xfb) { count2++; if(count2>=250) { count2=250; if(sign2==0) { sign2=1; switch(temp) { case 0xeb:key=8;break; case 0xdb:key=9;break; case 0xbb:key=10;break; case 0x7b:key=11;break; } Buzzer_sign=1; //蜂鸣器使能标志位置1 TR0 = 1; //启动定时器 P1=temp; //LED显示 } } } else { count2=0; sign2=0; } /*扫描第四行键盘*/ P3=0xf7; temp=P3; if(temp!=0xf7) { count3++; if(count3>=250) { count3=250; if(sign3==0) { sign3=1; switch(temp) { case 0xe7:key=12;break; case 0xd7:key=13;break; case 0xb7:key=14;break; case 0x77:key=15;break; } Buzzer_sign=1; //蜂鸣器使能标志位置1 TR0 = 1; //启动定时器 P1=temp; //LED显示 } } } else { count3=0; sign3=0; } } /***************************************** 定时器初始化程序 *****************************************/ void Timer0Init() //200微秒@11.0592MHz { TMOD = 0x02; //设置定时器8位自动重载模式 TL0 = 0x48; //设置定时初值 TH0 = 0x48; //设置定时重载值 EA=1; //开总中断 ET0=1; //开定时器0中断 } void main() { Timer0Init(); //初始化定时器0 Buzzer=1; //初始化蜂鸣器端口 Buzzer_sign=1; //蜂鸣器使能标志位置1,开机提示音 dula=0; //数码管段选0 wela=0; //数码管位选0 while(1) { key_scan(); //运行键盘扫描程序 display(key); //运行数码管显示程序 } } void timer0() interrupt 1 //中断服务程序(蜂鸣器震荡) { static uint Cnt200us=0; //变量Cnt200us if(Buzzer_sign==1) //如果蜂鸣器使能标志1 { Cnt200us++; //定时器中断变量Cnt200us自+1 Buzzer=~Buzzer; //蜂鸣器端口取反 if(Cnt200us>=1000) //检测中断的次数0.2秒 { Cnt200us=0; //计数清0 Buzzer_sign=0; //蜂鸣器使能标志清0 Buzzer=1; //蜂鸣器端口清0 TR0=0; //关闭定时器 } } } |
|
|
|
可以的
|
|
|
|
有没有仿真图呢,附上最好啊
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
158 浏览 0 评论
【敏矽微ME32G070开发板免费体验】之原厂2812测试例程解析
237 浏览 0 评论
655 浏览 1 评论
《DNESP32S3使用指南-IDF版_V1.6》第二十六章 INFRARED_RECEPTION实验
563 浏览 0 评论
862 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12034 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 19:21 , Processed in 0.601285 second(s), Total 76, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号