PIC系列单片机程序设计基础三
扫描二维码
随时随地手机看文章
http:// pic单片机的查表程序可以利用子程序带值返回的特点来实现。具体是在主程序中先取表数据地址放入w,接着调用子程序,子程序的第一条指令将w置入pc,则程序跳到数据地址的地方,再由“retlw”指令将数据放入w返回到主程序。下面程序以f10放表头地址。
movlw table ;表头地址→f10
movwf 10
┋
movlw 1 ;1→w,准备取“1”的线段值
addwf 10,1 ;f10+w =“1”的数据地址
call convert
movwf 6 ;线段值置到b口,点亮led
┋
convert movwf 2 ;w→pc table
retlw 0c0h ;“0”线段值
retlw 0f9h ;“1”线段值
┋
retlw 90h ;“9”线段值
9)“read……data,restore”格式程序
“read……data”程序是每次读取数据表的一个数据,然后将数据指针加1,准备取下一个数据。下例程序中以f10为数据表起始地址,f11做数据指针。
pointer equ 11 ;定义f11名称为pointer
┋
movlw data
movwf 10 ;数据表头地址→f10
clrf pointer ;数据指针清零
┋
movf pointer,0
addwf 10,0 ;w =f10+pointer
┋
incf pointer,1 ;指针加1
call convert ;调子程序,取表格数据
┋
convert movwf 2 ;数据地址→pc
data retlw 20h ;数据
┋
retlw 15h ;数据
如果要执行“restore”,只要执行一条“clrf pointer”即可。
10) pic单片机 延时程序
如果延时时间较短,可以让程序简单地连续执行几条空操作指令“nop”。如果延时时间长,可以用循环来实现。下例以f10计算,使循环重复执行100次。
movlw d‘100’
movwf 10
loop decfsz 10,1 ;f10—1→f10,结果为零则跳
goto loop
┋
延时程序中计算指令执行的时间和即为延时时间。如果使用4mhz振荡,则每个指令周期为1μs。所以单周期指令时间为1μs,双周期指令时间为2μs。在上例的loop循环延时时间即为:(1+2)*100+2=302(μs)。在循环中插入空操作指令即可延长延时时间:
movlw d‘100’
movwf 10
loop nop
nop
nop
decfsz 10,1
goto loop
┋
延时时间=(1+1+1+1+2)*100+2=602(μs)。
用几个循环嵌套的方式可以大大延长延时时间。下例用2个循环来做延时:
movlw d‘100’
movwf 10
loop movlw d‘16’
movwf 11
loop1 decfsz 11,1
goto loop1
decfsz 10,1
goto loop
┋
延时时间=1+1+[1+1+(1+2)*16-1+1+2]*100-1=5201(μs)
11) pic单片机rtcc计数器的使用
rtcc是一个脉冲计数器,它的计数脉冲有二个来源,一个是从rtcc引脚输入的外部信号,一个是内部的指令时钟信号。可以用程序来选择其中一个信号源作为输入。rtcc可被程序用作计时之用;程序读取rtcc寄存器值以计算时间。当rtcc作为内部计时器使用时需将rtcc管脚接vdd或vss,以减少干扰和耗电流。下例程序以rtcc做延时:
rtcc equ 1
┋
clrf rtcc ;rtcc清0
movlw 07h
option ;选择预设倍数1:256→rtcc
loop movlw 255 ;rtcc计数终值
subwf rtcc,0
btfss status,z ;rtcc=255?
goto loop
┋
这个延时程序中,每过256个指令周期rtcc寄存器增1(分频比=1:256),设芯片使用4mhz振荡,则:
延时时间=256*256=65536(μs)
rtcc是自振式的,在它计数时,程序可以去做别的事情,只要隔一段时间去读取它,检测它的计数值即可。
12) 寄存器体(ban