系统程序主要包括按键扫描及键值处理模块、定时器控制模块。简易电子琴的主程序流程如图1-2所示。主程序首先调用键值读取函数Get_Key()读取键值,并返回键值索引,然后调用函数Play()启动或停止蜂鸣器。
图1-2 简易电子琴的主程序流程
主程序代码如下。
说明
根据系统采用的晶振频率和所用单片机计数器的计数周期计算音阶对应的计数初值,存储在数组中供程序使用。
Get_Key()为键值读取函数。系统按键采用单线单键结构,程序采用扫描方式读取键值。程序扫描到按键后并不直接返回键值,而是查找键值表keymode[],获取并返回键值索引i。这样处理方便后续程序将键值转换为该按键对应的计数初值。Get_Key()的代码如下。
系统初始化函数Sys_Init()用于设定定时器T1的工作模式,开启总中断。Sys_Init()的代码如下。
函数Play()根据Get_Key()返回的键值索引,决定是否开启T1。在T1中断服务程序中,通过取反P0.1引脚控制蜂鸣器发声。Play()的代码如下。
T1主要用于生成音阶对应的信号频率。在T1中断服务程序timer0()中,将P0.1引脚取反后输出方波信号,通过对T1重新赋计数初值生成不同的信号频率。timer0()的代码如下。