1.学习PIC12针脚定义

 针脚1及针脚8可接电源+5V和地线。针脚2.3可外接晶振。

针脚4为复位脚,当单片机正常运行时接高电平,若有一个低电平输入,单片机便复位。

针脚5则为单片机的I/O脚,可控制它为输入或输出,输入0,输入1,输出0,输出1.(0即为低电平,1即为高电平)

针脚6.7也可设置输入输出,可以控制继电器,LED灯,A/D转换器,连接喇叭输出音乐等。

2.单片机的寄存器

寄存器又称RAM,单片机的大部分工作在写入或读出寄存器。寄存器是一个能存储8位二进制的数据的单元,而每个单元都有自己的地址编码(地址编码则为十六进制)。

单片机有有专用寄存器和通用寄存器之分。

专用寄存器即该寄存器的功能已由系统分配完成,而通用寄存器则是没有事先设定,可在编程序中随机使用。

该图为PIC12CE519的ram地址地图,其中00h到06h都是专用寄存器。

 该寄存器里的06h为GPIO,该寄存器内的数据可控制针脚的电平高低,上边说过每个寄存器可存储8位二进制数据,一位二进制数据便可控制一个针脚的电平,例如常数2的八位二进制为00000010,即可得数据1对应的GP1针脚输出高电平,而其他针脚输出低电平。

PS:需定义GP1为输出脚,否则无法控制GP1的电平,其他的针脚亦是如此。

3.单片机的指令

movlw 02H 
常数2进入w,H表示该数据为16进制
movwf GPIO
将W复制到GPIO中,GPIO中便有了00000010这样的数据,GP1也就输出高电平

上文曾提出过PIC单片机需先定义针脚输入输出,在这就要引进寄存器TRIS的使用。在TRIS寄存器中,同样是存储8个二进制数据对应针脚,分别定义针脚的输入输出,0即定义针脚为输出,1即定义针脚为输入。假设定义GP1,GP2为输出,则需要向TRIS写入二进制11111001,换算十六进制为F9H。

movlw 0F9H     F9H写入W
movwf TRISA    W内的数据复制如TRIS


注意:PIC12的单片机必须写成
movlw 0F9H
tris GPIO

bsf和bcf指令可以控制某个针脚的电平,bcf为降低某针脚的电平,又称清除;bsf为升高某针脚的电平,又称置位。

学习nop指令,nop可以让单片机处于空白运行状态,常用于延时的应用。

movlw OF9H
tris GPIO     定义GP1,GP2为输出针脚
bsf GPIO,GP1   升高GP1的电平,例如可点亮LED灯
nop         延时
nop
nop
nop
nop
bcf GPIO,GP2     降低GP1的电平,如熄灭LED灯
nop
nop
nop
nop

说到延时,于此,便要引进机器周期的概念,我们日常使用的LED灯都有闪烁的周期,而我们便可以用nop控制点亮熄灭LED灯的间隔,以达到控制lED闪烁。

PIC单片机里,一般的指令都为1个机器周期,而goto(即重复至某一段指令)则为2个机器周期

PIC机器周期=4/振荡频率(微妙)

已知外部晶振的频率为4Mhz,则可求出一个机器周期为4/4Mhz=1微妙

即单片机执行一个普通的指令的时间为1微妙

我们便可设计出一个频繁闪烁的LED灯

movlw 0F9H
       tris GPIO        控制GP1,2为输出针脚
myWAVE:bsf GPIO,GP1     点亮LED灯
       nop
       nop
       nop
       nop
       nop
       nop
       nop
       bcf GPIO,GP1     熄灭LED灯
       nop
       nop
       nop
       nop
       nop
goto myWAVE         单片机重复myWAVE的指令,而不是读写下一行指令

上面的代码可以看出点亮和熄灭LED灯之间间隔了8个机器周期,即8微妙,可得f=1/16=62.5Khz

当频率比较低时,便能接上一个喇叭,听到声音。

当然,频率太低的时候,需要使用大量的nop指令进行延时,这个时候就要引进incfsz指令和decfsz指令。前者是对某一寄存器内的数据进行加1,当检测到加1便至寄存器的极限时(255),下一条指令跳过,不读取下一条指令。而后者则是减1,减至为0时跳过一下条指令。

我们需要大量延时的时候,例如延时24086个周期时,用16进制表示即为5E16H

yanshi:movlw   5EH   
       movwf   0BH     
       movlw   16H
       movwf   0AH       将5E和76分别写入0BH和0AH两个通用寄存器
jixu:decfsz    0AH      开始延时,给0AH内的数据-1。当减至0时便跳过下一条指令,goto不再运行
     goto      jisu
jisu1:decfsz   0AH
     goto      jisu1        
     nop

疑问:1.似乎这跳指令并没有考虑到goto的机器周期

           2.5E放入0BH,那么0BH内的数据不应该是94吗,那么decfsz 0BH只有94次。

call指令和return指令可以让我们做出程序中内嵌另一个程序,能将一段常用的指令做成子程序,在需要该子程序时,用call命令单片机读取该子程序,子程序最后添加return便可回到主程序,这样便可大大减少汇编里的工作量,并简化程序。

注意可在子程序再嵌套子程序,但这根据单片机设计而有限制。

LEDshansuo:bcf   GPIO,GP1
           nop
           nop
           nop
           nop
           nop
           nop
           bsf    GPIO,GP1
           nop
           nop
           nop
           nop
           nop
           nop
           return
call LEDshansuo

转自:https://blog.csdn.net/xinxuey/article/details/120349446