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