#include #define uint unsigned int #define uchar unsigned char #define output P1 #define input P1 //方便移植在其他电路板上,我的电路使用P1口做键盘输入接口 //定义16个按键 enum KEY{key0,key1,key2,key3,key4,key5,key6,key7,key8,key9,key10,key11,key12,key13,key14,key15}; uchar code table[]={ //数组定义,显示数码管 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; unsigned int code Freqtab[] = { //定时半周期的初始值 64021,64103,64260,64400, //低音3 4 5 6 64524,64580,64684,64777, //低音7,中音1 2 3 64820,64898,64968,65030, //中音4 5 6 7 65058,65110,65157,65178}; //高音1 2 3 4 uint FreqTemp; //蜂鸣器声音不怎么样,我们使用扬声器,接P3.7口 sbit SPEAK = P3^7; void delay1ms(uint n) //误差 0us ,延时n毫秒 { uint a,b,c; for(c=n;c>0;c--) for(b=199;b>0;b--) for(a=1;a>0;a--); } uint key_input(void) { uchar temp1,temp2; //临时保存读取的行或者列 uchar num = 16; //返回按键的值 output = 0x0f; temp1 = input; //先读取行 if(0x0f != temp1) //按键按下 { delay1ms(5); //延时,消除抖动 temp1 = input; //再次读取行 if(0x0f != temp1) //说明按键确实按下 { temp1 = temp1 & 0x0f; //保留低4位 output = 0xf0; //准备读取列 delay1ms(1); //延时一下,防止下一句读不到 temp2 = input; //直接读取列 temp2 = temp2 & 0xf0; //保留高4位 temp1 = temp1 | temp2; //将temp1和temp2的值合并 } } switch(temp1) { case 0xee:num=0;break; case 0xde:num=1;break; case 0xbe:num=2;break; case 0x7e:num=3;break; case 0xed:num=4;break; case 0xdd:num=5;break; case 0xbd:num=6;break; case 0x7d:num=7;break; case 0xeb:num=8;break; case 0xdb:num=9;break; case 0xbb:num=10;break; case 0x7b:num=11;break; case 0xe7:num=12;break; case 0xd7:num=13;break; case 0xb7:num=14;break; case 0x77:num=15;break; default:break; } return num; } void T0_INT(void) interrupt 1 { TL0 = FreqTemp; //载入定时半周期的初始值 TH0 = FreqTemp >> 8; SPEAK = ~SPEAK; //发音 } int main() { TMOD = 0X01; //定时器T0设置为方式1 EA = 1; ET0 = 1; TR0 = 0; while(1) { uint num,temp; num = key_input(); temp = num; P0 = table[num]; if(16 != num) { FreqTemp = Freqtab[num]; TR0 = 1; while(0xf0 != output); //检测按键松开 TR0 = 0; SPEAK = 1; } } return 0; }
上一篇:基于单片机的温湿度监测系统设计(程序)
下一篇:基于单片机的数字时钟系统设计
推荐阅读最新更新时间:2024-11-11 12:10
推荐帖子
- WinCE6.0中应用中使用物理地址
- 做应用的需要一片固定的内存,我在Config.bib中划好,在驱动里增加了MmIOMapSpace和MmIOUnMapSpace以及对应的IOCTL,在驱动内部测试,这片内存可以正常访问,map以及unmap。我用IOCTL为应用返回这片内存的物理及虚拟地址,为什么在应用中使用该虚拟地址操作这片内存就会DataAbort?? //RequestApplicationMemory if(!DeviceIoControl(hCamDrv,IOCTL
- f123 WindowsCE
- 一起开发嵌入式操作系统
- 打算开发嵌入式操作系统,召集有志同道合者,现在已经做好了semaphore部分,其它部分正在开发中,论坛:http://dawn.tech.topzj.com/index.php,欢迎大家光临指导!一起开发嵌入式操作系统高手,可惜自己没有那么高的水平,真想参加.有问题请先GOOGLE,BAIDU帮楼主顶一下!顺便也接点分
- yytzc 嵌入式系统
- 《Windows CE实用开发技术》张冬泉著的示例程序代码谁有啊?
- 《WindowsCE实用开发技术》张冬泉著的示例程序代码谁有啊?哪位能搞到源码或者自己能编出源码,给我发一份吧,不胜感激将。zhangpei_eric@hotmail.com《WindowsCE实用开发技术》张冬泉著的示例程序代码谁有啊?兄弟你有了也给我一份拉我现在也在搞这个拉yuaiping5164@163.com那个有相关的电子书给我万分感谢拉我也在学WINCE,有也给我一份.感谢一下!jacky0097@163.com我也想学,谁有也给我一份,谢谢!yangxh1-
- betopelec 嵌入式系统
- GY-26电子指南针 STM32 GUI--LCD采集显示,VB上位机.exe同步采集 第一版终于完工
- 弄着玩玩,新手,不要批评吆,呵呵·····GY-26电子指南针STM32GUI--LCD采集显示,VB上位机.exe同步采集第一版终于完工不错继续加油哦回复楼主hjw199089的帖子楼主照片是手机照的吗?是的,用同学的手机照的,几天又照了几张。新手,做的简陋,多向你们学习了,呵呵回复板凳编号洞洞拐的帖子不错,这个角度需要校正不?可以校正,在博客里有修正后的,https://home.eeworld.com.cn/my/sp...o=blog&i
- hjw199089 stm32/stm8
- GBT 18488.1-2006电动汽车用电机及其控制器 第1部分:技术条件
- GBT18488.1-2006电动汽车用电机及其控制器第1部分:技术条件GBT18488.1-2006电动汽车用电机及其控制器第1部分:技术条件很好!谢谢您发来的资料,很有用,开点下载喽!可惜没有币啦!哈哈!来顶顶呵呵呵加油,谢谢分享赞一个谢谢了灰常感谢灰常感谢
- 安_然 DSP 与 ARM 处理器
- 《人工智能实践教程——从Python入门到机器学习》阅读报告(3)
- 本书的第三部分,作者深入探讨了神经网络的构建与应用,这一部分是全书的精华所在。以下是对书中核心内容的简要介绍: 感知机:作者首先从感知机的原理出发,详细阐述了其从逻辑电路到多层神经网络的演变过程。书中不仅介绍了基础的激活函数,还深入探讨了如何通过这些函数构建更为复杂的神经网络结构; 反向传播算法:通过链式法则和计算图,作者清晰地推导了反向传播算法的理论基础。书中不仅涵盖了常见的激活函数,还特别介绍了Softmax等复杂函数的推导过程,为读者揭示了误差反向传播在神
- Aclicee 编程基础
设计资源 培训 开发板 精华推荐
- 有奖直播:ADI数字主动降噪耳机方案 8月6日上午10:00-11:30 邀您聆听让技术为我们静下来
- 测评有礼!动手实战:全网征集TI毫米波雷达测评者
- 直播:您的安全保护做到了吗?TI毫米波雷达直播给您答案
- 晒出我使用MSP430编译器的经验与技巧!
- Microchip直播:单片机编程不再难, 利用MPLAB®代码配置器(MCC)实现快速开发
- PSoC4 Cortex-M0开发板免费申请,分享心得赢惊喜大礼!
- 直播|基于英特尔® Agilex™ FPGA的PCIe Gen5和CXL解决方案
- Follow me第3期来袭,与得捷一起解锁Seeed Studio XIAO ESP32C3!
- elexcon 2024 深圳国际电子展报名通道开启!参与赢京东卡!
- 答题赢京东卡|《安森美和安富利物联网创新设计大赛作品集》