1. 目的
□电路上:使用1015BJT PNP三极管来做扫描显示的开关切换。
□程序上:学习如何写计数程序与扫描显示的程序。
2. 材料

图5-31 原理图
4. 实照
图5-32 实照
5. 步骤
1. 连接PIC的基本运行电路:
□将Vcc与MCLR引脚接上+5V,Vss引脚接上+0V.
□将石英振荡器的两个引脚,分别接上PIC的OSC1、OSC2引脚。
□将两个电容的其中一个电容,一脚接OSC1、另一脚接+0V,至于另一个电容,则是一脚接振荡,另一脚与前一个电容的作法一样,接+0V。
2. 连接按钮的电路:
□按钮上有两个引脚,先将其中的一具引脚直接+0V。
□另一个引脚分开成两条,其中一个串联一个2kΩ的电阻后与+5V连接,另一条则直接接PIC的RC0引脚。
□以上两个步骤即可完成一个按钮的连接,另外一个连接方式也是相同的,只不过最后是连接PIC的RC1的按钮是归零按钮。)
3. 连接三极管电路:
□本次我们用两个1015三极管,先连接第一个三极管,把1015的基极串一个2kΩ的电阻后,再与PIC的RC2引脚连接。
□接着把1015的发射极直接接+5V,集电极接显示"个位数"的数码管的共阳引脚。
□另一个1015也如上所述照接,但是RC2改成RC3,"个位数"数码管改成显示"十位数"数码管,其电路结构雷同。
4. 最后连接扫描显示电路:
□将十位数数码管与个位数数码管的a到g引脚对应接在一块,但是共阳引脚保留不接。
□将数码管的a到g七个引脚各串一个220Ω电阻,然后再与7447的a到g引脚对应连接。
□将7447的Vcc接+5V,VSS接+0V,然后将RBI、RBO、LT等引脚接+0V。
□将7447的1、2、4、8引脚分别与PIC的RC4、RC5、RC6、RC7引脚连接。
6. 流程图
5-33 流程图
7. 程序
□标号说明:
·RESET:起始程序的进入点
·DISP0:显示"00"字样操作的进入点
·SCAN:读取按钮电位的进入点
·CHK_KEYA:确认递增按钮是否被按的进入点
·CHK_KEYB:确认递增按钮是否被按的进入点
·INC_KEY:递增计数值的进入点
·NO_CY_ONE:个位数未进位的处理进入点
·NO_CY_TEN:十位数未进位的处理进入点
·DISPLAY:显示作用的子程序进入点
·DELAY_7US:延时作用的子程序进入点
·RE:延时作用的标号,请自行参考实习先例
·DELAY_15MS:延时作用的标号,请自行参考实习先例
·DLY1:延时作用的标号,请自行参考实习先例
·DLY2:延时作用的标号,请自行参考实习先例
·DELAY_5MS:延时作用的标号,请自行参考实习先例
·DDY1:延时作用的标号,请自行参考实习先例
·DDY2:延时作用的标号,请自行参考实习先例
□寄存器使用配置情况
·F7:I/O作用,包含读取按钮电位、显示值输出、显示器不能切换等操作。
·F23:延时作用的寄存器,请自行参考实习先例
·F24:延时作用的寄存器,请自行参考实习先例
·F25:延时作用的寄存器,请自行参考实习先例
·F26:延时作用的寄存器,请自行参考实习先例
·F27:延时作用的寄存器,请自行参考实习先例
·F28:数据转移的存放用途
·F29:保存计数值十位数用
·F30:保存计数值十位数用
·F31:保存计数值用

(1)初始操作
由于本次的所有控制都依赖PORTC来完成,所以事先设置PORTC的输出输入模式。
(2)清除计数值
由于开机时一开始要显示"00"字样,所以这里会清除计数值,然后作"00"的显示。
(3)显示计数值
调用显示子程序,将 定时值取出,显示在数码管上。
(4)检查递增按钮有否被按?
取入递增钮的电位,如果为HI,则没有被按下,反之则有按下,但是可能为抖动。
(5)检查归零按钮有否被按?
取入归零钮的电位,如果为HI,则没有被按下,反之则有按下,但是可能为抖动。
(6)显示计数值并重回扫描
回头检查按钮是否被按下,并显示计数值。由于每次扫描的时间很短,所以看起来不会有间断的感觉,这也就是快速扫描的原理。 (7)如果被按,转往递增处理
延时一段时间后,确定按钮被持续按着的话,便会进入执行递增操作的程序。但再次被检查的按钮值与原先的不符,便视为抖动,不做任何操作,重回扫描程序。
(8)如果被按,转生归零处理
延时一一段时间后,确定按钮被持续按着的话,便会进入执行递增操作的程序。但再次被检查的按钮值与原先的不符,便视为抖动,不做任何操作,重回扫描程序。
(9)递规则操作处理流程
首先判断计数值的个位数加一后会不会超过九,如果不会,就直接把个位数加一。 如果个位数超过九,则转入十位数的判断,若因为个位数的递增革命家使十位数由九变成十,则跳到"DISP0"的标号开始往下执行,这样就代表十位数与个位数都进位,便等于归零的操作 。
假如个位数进位,但十位数并没有因此进位,则把个位数的值清除,再把十进位的值加一。
所以有三种递增的结果:
□个位数加一,十位数不进位
□个位数进位,十位数加一
□个位数进位,十位数进位
上面三种递增结果都会将计值改变,改变完后就交给显示子程序来显示新的计数值。
(10)显示计数值
由于递增程序中已做了个位数与数的单独保存,所以显示程序不需要再去分离计数值的寄存器值,就可以做显示。
(11)延时7μs
这里的延时作用在关闭数码管后,停顿一下再做下一次显示。
(12)延时15μs
这里的程序是做消除抖动的延时以及显示所停留的时间所使用。
(13)延时5μs
这是使数码管显示的持续时间。
9. 除错
□线路方面可能的错误
1. 可能将1015三级管的引脚极性弄错,此时须拨出1015人三极管重新测量极性再接。
2. 数码管的RBO、BTI、LP TEST引脚必须确实接+5V.
3. 两个数码管的共阳引脚不可短路连接
4. 按钮的接触是否良好?由于所有控制线路都集中在PORT C,所以线路较密集,容易出错。
□程序方面可能的错误
1. 有数处地方调用子程序,若漏了就会发生显示操作错误或与预期有出入。
2. 本次的递增操作处理流程部分,数据转向复杂,务必要清晰理解,数据转向的操作数也不得输错。
3. 延时程序的延时参数必须谨慎设置。
4. 显示程序的流程与递增操作类似,在数据转向上都较为复杂, 要特别注意。