课程设计报告基于单片机的简易电子琴设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计报告
课程设计名称:基于51单片机的简易电子琴设计系部名称:中印计算机软件学院
学生姓名:
班级:
学号:
成绩:
指导教师:
开课时间:2012-2013学年第二学期
目录
1 课程设计目的 (1)
2 课程设计题目和要求 (1)
3 课程设计报告内容 (2)
3.1原理图 (2)
3.2系统板硬件连线 (3)
3.3主要芯片简介 (3)
3.3.1AT89S51简介 (3)
3.3.2 LM386 (4)
3.3.3LED数码管 (6)
4 实现过程 (7)
4.1 4X4行列式键盘识别及显示 (8)
4.1.1硬件板上的系统连线设计 (9)
4.1.2 程序设计内容 (9)
4.1.3 I/O并行口直接驱动LED显示 (9)
4.2 音乐产生的方法 (11)
4.2.1 原理 (11)
4.2.2 程序框图 (13)
5. 总结 (14)
参考书目 (15)
附录 (16)
1 课程设计目的
音乐是热情洋溢的自由艺术,是室外的艺术,像自然那样无边无际,像风,像天空,像海洋。

音乐是灵魂的完美表现。

音乐表达的是无法用语言描述,却又不可能对其保持沉默的东西。

而能把音乐演绎出来的乐器又是很多人的最爱。

在此设计的是一个基于单片机的简易电子琴。

我们对于电子琴如何实现其功能,如音色选择、声音强弱控制、节拍器、声音强弱显示功能等等也很好奇。

电子琴有着独特的音色,它在爱音乐人的手里就是一个有生命的工具,是我们的朋友,它也是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。

它在现代音乐扮演着重要的角色。

单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。

本文的主要内容是用AT89S51单片机为核心控制元件,设计一个电子琴。

以单片机作为主控核心,与键盘、LED显示器、扬声器等模块组成核心主控制模块,在主控模块上设有16个按键和扬声器。

本系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比较高等,具有一定的实用和参考价值。

2课程设计的题目和要求
电子琴的设计
以AT89S51单片机为核心,设计一个简易电子琴。

1.利用键盘模拟琴键,弹奏出8个不同的音符1,2,3,4,5,6,7,i。

2.按下按键发声,松开延时一段时间停止,中间再按别的键则发另一音调
的声音。

3.LM386将音频信号功率放大后送扬声器发声。

4.其他创新功能设计,例如增加按键数量,发出更多的音符,用点阵LED
显示音符高低等。

V c c
40
E A
31
R S T
9
G N D
20
X 1
19
X 2
18
P1.0
1
P1.1
2P1.2
3P1.3
4P1.4
5P1.5
6P1.6
7P1.7
8P3.0/RXD
10P3.1/TXD
11P3.2/INT0
12P3.3/INT1
13P3.4/T0
14P3.5/T1
15P3.6/WR
16P3.7/RD
17P0.0/AD0
39
P0.1/AD1
38P0.2/AD2
37P0.3/AD3
36P0.4/AD4
35P0.5/AD5
34P0.6/AD6
33P0.7/AD7
32
ALE 30PSEN
29P2.7/A15
28P2.6/A14
27P2.5/A13
26P2.4/A12
25P2.3/A11
24P2.2/A10
23P2.1/A9
22P2.0/A821U1
AT89S51
R1
10K R210K
R310K
Y112MHz
C7
30pF C630pF
1
2345678P1
HEADER 8S1
SW -PB
S2
SW -PB
S3
SW -PB
S4
SW -PB
S5
SW -PB
S6
SW -PB
S7
SW -PB
S8
SW -PB
S9
SW -PB
S10
SW -PB
S11
SW -PB
S12
SW -PB
S13SW -PB
S14SW -PB
S15SW -PB
S16SW -PB
C110uF
VCC
Vcc 6
IN+3
IN-2
BY PASS
7
V O UT 5GA IN 1GA IN 8GN D
4
U2
LM386
C2
10uF C3
0.1uF VCC
C4
10u F
R410K
C50.1uF
LS1
扬声器
CR4CR3CR2CR1BR4BR3BR2BR1
C R 4
C R 3C R 2C R 1B R 4B R 3B R 2B R 1R4220
a
g
d
e
f
b c
dp
a 7
b 6
c 4
d 2
e 1
f 9G N D
3
G N D
8
g 10dp 5
DS1
DP Y7_SEG_DP
3.2系统板硬件连线
系统板硬件连线如图1-1所示,发生模块,键盘模块,及LED显示模块连接如下1.把“单片机系统”区域中的P1.0端口用导线连接到“音频放大模块”区域中的SPK IN端口上;
2.把“单片机系统”区域中的P
3.0-P3.7端口用8芯排线连接到“4X4行列式键盘”区域中的C1-C4 R1-R4端口上;
3.把“单片机系统”区域中的P0.0/AD0-P0.7/AD7端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个a-h端口上;要求:P0.0/AD0对应着a,P0.1/AD1对应着b,……,P0.7/AD7对应着h。

3.3 主要芯片简介
3.3.1 AT89S51简介
AT89S51是一个低功耗,高性能CMOS 8位单片机,片内含4k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的AT89S51可为许多嵌入式控制应用系统提供高性价比的解决方案。

AT89S51具有如下特点:40个引脚(引脚图如图1-2所示),4k Bytes Flash 片内程序存储器,128 bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。

此外,AT89S51设计和配置了振荡频率可为0Hz并可通过软件设置省电模式。

空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。

同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求。

图1-2 管脚图
3.3.1.1 主要功能特性
· 兼容MCS-51指令系统· 32个双向I/O口
· 2个16位可编程定时/计数器·全双工UART串行中断口线
· 2个外部中断源·中断唤醒省电模式
· 看门狗(WDT)电路·灵活的ISP字节和分页编程
· 4k可反复擦写ISP Flash ROM · 4.5-5.5V工作电压
· 时钟频率0-33MHz · 128*8bit内部RAM
· 低功耗空闲和省电模式· 3级加密位
· 软件设置空闲和省电功能· 双数据寄存器指针
3.3.2 LM386
3.3.2.1 LM386内部电路
LM386是美国国家半导体公司生产的音频功率放大器,主要应用于低电压消费类产品。

LM386特性:静态功耗低,约为4mA,可用于电池供电;工作电压范围宽,4V-12V 或5V-18V;外围元件少;电压增益可调,20-200;低失真度。

LM386是一种音频集成功放,具有自身功耗低、电压增益可调整、电源电压范围大、外接元件少和总谐波失真小等优点,广泛应用于录音机和收音机之中。

3.3.3 LED数码管
图1-4 7段数码管
数码管(如图1-4所示)使用条件:
a、段及小数点上加限流电阻
b、使用电压:段:根据发光颜色决定;小数点:根据发光颜色决定
c、使用电流:静态:总电流 80mA(每段 10mA);动态:平均电流 4-5mA 峰值电流 100mA 上面这只是七段数码管引脚图,其中共阳极数码管引脚图和共阴极的是一样的。

数码管使用注意事项说明:
(1)数码管表面不要用手触摸,不要用手去弄引角;
(2)焊接温度:260度;焊接时间:5S
(3)表面有保护膜的产品,可以在使用前撕下来。

4 实现过程
4.1 4X4行列式键盘识别及显示
组成键盘的按键有机械式、电容式、导电橡胶式、薄膜式多种,但不管什么形式,其作用都是一个使电路接通与断开的开关。

目前微机系统中使用的键盘按其功能不同,通常可分为编码键盘和非编码键盘两种基本类型。

编码键盘:键盘本身带有实现接口主要功能所需的硬件电路。

不仅能自动检测被按下的键,并完成去抖动、防串键等功能,而且能提供与被按键功能对应的键码(如ASCII 码)送往CPU。

所以,编码键盘接口简单、使用方便。

但由于硬件电路较复杂,因而价格较贵。

非编码键盘:键盘只简单地提供按键开关的行列矩阵。

有关按键的识别、键码的确
定与输入、去抖动等功能均由软件完成。

目前微机系统中,一般为了降低成本大多数采用非编码键盘。

键盘接口必须具有去抖动、防串键、按键识别和键码产生4个基本功能。

(1)去抖动:每个按键在按下或松开时,都会产生短时间的抖动。

抖动的持续时间与键的质量相关,一般为5—20mm。

所谓抖动是指在识别被按键是必须避开抖动状态,只有处在稳定接通或稳定断开状态才能保证识别正确无误。

去抖问
题可通过软件延时或硬件电路解决。

(2)防串键:防串键是为了解决多个键同时按下或者前一按键没有释放又有新的按键按下时产生的问题。

常用的方法有双键锁定和N键轮回两种方法。

双键锁定,是当有两个或两个以上的按键按下时,只把最后释放的键当作有效键并产生相应的键码。

N 键轮回,是当检测到有多个键被按下时,能根据发现它们的顺序依次产生相应键的键码。

(3)被按键识别:如何识别被按键是接口解决的主要问题,一般可通过软硬结合的方法完成。

常用的方法有行扫描法和线反转法两种。

行扫描法的基本思想是,由程序对键盘逐行扫描,通过检测到的列输出状态来确定闭合键,为此,需要设置入口、输出口一个,该方法在微机系统中被广泛使用。

线反转法的基本思想是通过行列颠倒两次扫描来识别闭合键,为此需要提供两个可编程的双向输入/输出端口。

(4)键码产生:为了从键的行列坐标编码得到反映键功能的键码,一般在内存区中建立一个键盘编码表,通过查表获得被按键的键码。

用AT89S51的并行口P1接4×4矩阵键盘,以P1.0-P1.3作输入线,以P1.4-P1.7作输出线;在数码管上显示每个按键的“0-F”序号。

4.1.1 系统板上硬件连线设计
键盘模块硬件连线如图2-1所示:
(1)把“单片机系统”区域中的P3.0-P3.7端口用8芯排线连接到“4X4行列式键盘”区域中的C1-C4 R1-R4端口上;
(2)把“单片机系统”区域中的P0.0/AD0-P0.7/AD7端口用8芯排线连接到“7段数码显示模块”区域中的任一个a-h端口上;要求:P0.0/AD0对应着a,P0.1/AD1对应着b,……,P0.7/AD7对应着h。

(1)LED数码显示原理:
七段LED显示器内部由七个条形发光二极管和一个小圆点发光二极管组成,根据各管的极管的接线形式,可分成共阴极型和共阳极型。

LED数码管的g~a七个发光二极管因加正电压而发亮,因加零电压而不以发亮,不同亮暗的组合就能形成不同的字形,这种组合称之为字形码,下面给出共阴极的字形码表(如表2-1所示)
表2-1 字形码表
(2)由于显示的数字0-9的字形码没有规律可循,只能采用查表的方式来完成我们所需的要求了。

这样我们按着数字0-9的顺序,把每个数字的笔段代码按顺序排好!建立的表格如下所示:TABLEDB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH。

4.2 音乐产生的方法
4.2.1 原理
一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这
样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系正确即可。

若要产生音频脉冲,只要算出某一音频的周期(1/频率),再将此周期除以2,
即为半周期的时间。

利用定时器计时半周期时间,每当计时终止后就将P1.0反相,然后重复计时再反相。

就可在P1.0引脚上得到此频率的脉冲。

利用AT89C51的内部定时器使其工作计数器模式(MODE1)下,改变计数值TH0及TL0以产生不同频率的方法产生不同音阶,例如,频率为523Hz,其周期T=1/523=1912μs,因此只要令计数器计时956μs/1μs=956,每计数956次时将I/O反相,就可得到中音DO(523Hz)。

计数脉冲值与频率的关系式(如式2-1所示)是:
N=fi÷2÷fr 2-1
式中,N是计数值;fi是机器频率(晶体振荡器为12MHz时,其频率为1MHz);fr
是想要产生的频率。

其计数初值T的求法如下: T=65536-N=65536-fi÷2÷fr
例如:设K=65536,fi=1MHz,求低音DO(261Hz)、中音DO(523Hz)、高音DO(1046Hz)的计数值。

T=65536-N=65536-fi÷2÷fr=65536-1000000÷2÷fr=65536-500000/fr
低音DO的T=65536-500000/262=63627
中音DO的T=65536-500000/523=64580
高音DO的T=65536-500000/1046=65059
单片机12MHZ晶振,高中低音符与计数T0相关的计数值如表2-2所示
表2-2 音符频率表
我们要为这个音符建立一个表格,单片机通过查表的方式来获得相应的数据低音0-19之间,中音在20-39之间,高音在40-59之间
TABLE: DW 0, 63628, 63835, 64021, 64103, 64260, 64400, 64524, 0, 0
DW 0, 63731, 63928, 0, 64185, 64331, 64463, 0, 0, 0
DW 0, 64580, 64684, 64777, 64820, 64898, 64968, 65030, 0,
DW 0, 64633, 64732, 0, 64860, 64934, 64994, 0, 0, 0
DW 0, 65058, 65110,65157, 65178, 65217, 65252, 65283, 0,
DW 0, 65085, 65134, 0, 65198, 65235, 65268, 0, 0, 0
DW 0
音乐的音拍,一个节拍为单位(C调)(如表2-3所示)
表2-3 曲调值表
对于不同的曲调我们也可以用单片机的另外一个定时/计数器来完成。

琴键处理程序,根据检测到得按键值,查询音律表,给计时器赋值,发出相应频率的声音。

对音调的控制:根据不同的按键,对定时器T1送入不同的初值,调节T1的溢出时间,这样就可以输出不同音调频率的方波。

不同音调下各个音阶的定时器。

在这个程序中用到了两个定时/计数器来完成的。

其中T0用来产生音符频率,T1
用来产生音拍。

4.2.2 程序框图
音乐发声程序框图如图2-4所示:
图2-4 音乐发声程序框图
5总结
通过这次毕业设计,我学到了不少课本上没有的知识,也锻炼了自己的动手能力,将以前学过的零散的知识串到一起。

首先在毕业设计刚开始的调研阶段,我学会了怎么通过各种方式查询相关的资料。

通过对这些资料的学习,我大致了解了单片机的发展现状以及未来的发展趋势,认识到目前单片机方面的各种各样的发展,和它们之间的竞争。

了解了单片机方面的先进技术,这些都为我的未来的学习指明了方向。

我的毕业设计主要涉及硬件和软件两方面的内容,通过这些我的硬件和软件开发能力都获得了提高。

首先硬件方面,基本了解了电子产品的开发流程和所要做的工作。

基本掌握了Protel99SE原理图的方法,并设计了一个单片机最小系统。

通过开发板的设计和硬件搭建的过程,使我对51系单片机的接口有了更深层次的理解,熟悉了一些单片机常用的外围电路引脚和连接方法,如LED数码管,键盘等。

在软件方面,通过串行口调试工具的开发,使我加深了对累封装的理解,熟
悉了51系列单片机内部的寄存器和编程规则,以及如何控制外围电路。

将程序烧入芯片,调试成功后,可任意弹奏自己想要的旋律。

本研究通过制作电子琴,将几个模块很好的融合起来,对使用单片机设计简易电子琴进行了分析,并介绍了基于单片机电子琴统硬件组成。

利用单片机产生不同频率来获得我们要求的音阶,最终可随意弹奏想要表达的音乐。

说明一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,于是我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可,然后我们利用功放电路来将音乐声音放大,同时通过显示模块来确知自己所弹的音符。

不足之处有:
1.可弹奏的音符数较少,只能在一定范围内满足用户需要。

可通过改进键盘识别模块和发生模块来增加其复杂度。

2.音量不可调。

可通过改进功放电路,即在lm386的1脚和8脚间增加一直外界电阻和电容,将3脚与地之间的电阻换为10k的变阻,即可调节其放大增益。

参考书目
[1] 陈明荧,《8051单片机课程设计实训教材[M]》,北京,清华大学出版社,2003年9月
[2] 徐新艳,《单片机原理、应用与实践[M]》,北京,高等教育出版社,2005年3月
[3] 吴金戌,沈庆阳,郭庭吉,《8051单片机实践与应用[M]》,第一版.北京:清华大学出版社,2002年
[4] 吴金戌,沈庆阳,郭庭吉,《8051单片机实践与应用[M]》,清华大学出版社,2001
[5] 冯博琴,《微型计算机原理与接口技术[M],.清华大学出版社,2004
[6] 张毅刚,《MCS-51单片机应用设计[M]》,哈尔滨工业大学出版社,2004
[7] 张淑清,姜万录等,《单片微型计算机接口技术及应用[M]》,国防工业出版社,2003
[8] 吴金戌,沈庆阳,郭庭吉,《8051单片机实践与应用[M]》,清华大学出版社,2001
[9] 龙威林,杨冠声,胡山,《单片机应用入门:AT89S51和AVR[M]》,北京:化学工业出版社,2008
[10] 黄鑫,马善农,赵永科,《基于CPLD的电子琴研究与设计[J]》,科技广场,2007(5)
[11] 赵亮,侯国锐,《单片机C语言编程与实例[M]》,北京:人民邮电出版社,2003
[12] 杨恢先,黄辉先,《单片机原理及应用[M]》,北京:人民邮电出版社,2006
[13] 张虹,《单片机原理及应用[M]》,北京:中国电力出版社,2009
[14] 李云钢,邹逢兴,龙志强,《单片机原理与应用系统计[J]》,北京:中国水利水电出版社,2008
C语言源程序
#include
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char discount;
void delay02s(void)
{
unsigned char i, j, k;
for(i=20;i>0;i--)
for(j=20;j>0;j--)
for(k=248;k>0;k--);
}
void main(void)
{
while(1)
{
for(discount=0;dispcount<10;dispcount++)
{
P0=table[discount];
delay02s();
}
}
}
键盘识别程序框图如图所示:
语言源程序
#include
unsigned char code table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};
unsigned char temp;
unsigned char key;
unsigned char i,j;
void main(void)
{
while(1)
{
P3=0xff;
P3_4=0;
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
switch(temp)
{
case 0x0e:
key=7;
break;
case 0x0d:
key=8;
break;
case 0x0b:
key=9;
break;
case 0x07:
key=10;
break;
}
temp=P3;
P1_0=~P1_0;
P0=table[key]; temp=temp & 0x0f; while(temp!=0x0f) {
temp=P3;
temp=temp & 0x0f; }
}
}
P3=0xff;
P3_5=0;
temp=P3;
temp=temp & 0x0f; if (temp!=0x0f) {
for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3;
temp=temp & 0x0f; if (temp!=0x0f) {
temp=P3;
temp=temp & 0x0f; switch(temp)
{
case 0x0e:
key=4;
break;
case 0x0d:
key=5;
case 0x0b:
key=6;
break;
case 0x07:
key=11;
break;
}
temp=P3;
P1_0=~P1_0;
P0=table[key]; temp=temp & 0x0f; while(temp!=0x0f) {
temp=P3;
temp=temp & 0x0f; }
}
}
P3=0xff;
P3_6=0;
temp=P3;
temp=temp & 0x0f; if (temp!=0x0f) {
for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3;
temp=temp & 0x0f; if (temp!=0x0f) {
temp=P3;
temp=temp & 0x0f; switch(temp)
{
case 0x0e:
break;
case 0x0d:
key=2;
break;
case 0x0b:
key=3;
break;
case 0x07:
key=12;
break;
}
temp=P3;
P1_0=~P1_0;
P0=table[key]; temp=temp & 0x0f; while(temp!=0x0f) {
temp=P3;
temp=temp & 0x0f; }
}
}
P3=0xff;
P3_7=0;
temp=P3;
temp=temp & 0x0f; if (temp!=0x0f) {
for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3;
temp=temp & 0x0f; if (temp!=0x0f) {
temp=P3;
temp=temp & 0x0f;
switch(temp)
{
case 0x0e:
key=0;
break;
case 0x0d:
key=13;
break;
case 0x0b:
key=14;
break;
case 0x07:
key=15;
break;
}
temp=P3;
P1_0=~P1_0;
P0=table[key];
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;}
程序框图
音乐发声程序框图如图所示:
程序
#include
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char temp;
unsigned char key;
unsigned char i,j;
unsigned char STH0;
unsigned char STL0;
unsigned int code tab[]={64021,64103,64260,64400, 64524,64580,64684,64777, 64820,64898,64968,65030, 65058,65110,65157,65178};
void main(void)
{
TMOD=0x01;
ET0=1;
EA=1;
while(1)
{
P3=0xff;
P3_4=0;
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
switch(temp)
{
case 0x0e:
key=0;
break;
case 0x0d:
key=1;
break;
case 0x0b:
key=2;
break;
case 0x07:
key=3;
break;
}
temp=P3;
P1_0=~P1_0;
P0=table[key];
STH0=tab[key]/256;
STL0=tab[key]%6;
TR0=1;
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f; }
TR0=0;
}
}
P3=0xff;
P3_5=0;
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
switch(temp)
{
case 0x0e:
key=4;
break;
case 0x0d:
key=5;
break;
case 0x0b:
key=6;
break;
case 0x07:
key=7;
break;
}
temp=P3;
P1_0=~P1_0;
P0=table[key];
STH0=tab[key]/256;
STL0=tab[key]%6;
TR0=1;
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
}
TR0=0;
}
}
P3=0xff;
P3_6=0;
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
switch(temp)
{
case 0x0e:
key=8;
break;
case 0x0d:
key=9;
break;
case 0x0b:
key=10;
break;
case 0x07:
key=11;
break;
}
temp=P3;
P1_0=~P1_0;
P0=table[key];
STH0=tab[key]/256;
STL0=tab[key]%6;
TR0=1;
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f; }
TR0=0;
}
}
P3=0xff;
P3_7=0;
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
switch(temp)
{
case 0x0e:
key=12;
break;
case 0x0d:
key=13;
break;
case 0x0b:
key=14;
break;
case 0x07:
key=15;
break;
}
temp=P3;
P1_0=~P1_0;
P0=table[key];
STH0=tab[key]/256;
STL0=tab[key]%6;
TR0=1;
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
}
TR0=0;
}
}
}
}
void t0(void) interrupt 1 using 0
{
TH0=STH0;
TL0=STL0;
P1_0=~P1_0;
}
29。

相关文档
最新文档