下载

2下载券

加入VIP
  • 专属下载券
  • 上传内容扩展
  • 资料优先审核
  • 免费资料无限下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 PIC单片机应用开发典型模块各章程序第二章程序

PIC单片机应用开发典型模块各章程序第二章程序.doc

PIC单片机应用开发典型模块各章程序第二章程序

WindomZhong
2018-09-08 0人阅读 举报 0 0 0 暂无简介

简介:本文档为《PIC单片机应用开发典型模块各章程序第二章程序doc》,可适用于IT/计算机领域

()查询方式的键盘程序程序清单(设IO口为P口)如下:START:MOVA,#OFFH置输入方式MOVP,AMOVA,P键状态输入JNBACC,FP号键按下转JNBACC,FP号键按下转JNBACC,FP号键按下转JNBACC,FP号键按下转JNBACC,FP号键按下转JNBACC,FP号键按下转JNBACC,FP号键按下转JNBACC,FP号键按下转SJMPSTART无键按下返回FP:LJMPPROMFP:LJMPPROM……FP:LJMPPROM入口地址表PRMO:………………号键功能程序………………LJMPSTART号键执行完返回PRMO:………………………………LJMPSTART……PRMO:………………………………LJMPSTART功能:对PICF的C端口八位输入进行扫描然后将其输入通过D口的八位输出来显示。STATUSEQUH定义状态寄存器地址PORTCEQUH定义端口C的数据寄存器地址PORTDEQUH定义端口D的数据寄存器地址TRISCEQUH定义端口C的方向寄存器TRISDEQUH定义端口D的方向寄存器RPEQUH定义状态寄存器中的页选位RPRPEQUH定义状态寄存器中的页选位RPZEQUH定义状态寄存器中的标志位ZDATAEQUH定义外循环变量DATAEQUH定义内循环变量TEMPEQUH定义临时变量存储端口D的输入COUNTEQUFH定义存储外循环次数的变量COUNTEQUFFH定义存储内循环次数的变量ORGH初始定位GOTOMAINMAIN初始化BCFSTATUS,RP转到BANKBSFSTATUS,RPMOVLWH将端口D的方向控制字先送到WMOVWFTRISD然后再转送到端口D的方向寄存器MOVLWFFH将端口C的方向控制字先送到WMOVWFTRISC然后再转送到端口C的方向寄存器BCFSTATUS,RP转到BANK第一次查询端口D的状态CHECKMOVFTRISD,将端口D的状态先送到WMOVWFTEMP再将端口D的状态暂存到TEMPCALLDELAY调用延时程序DELAY延时msCHECKMOVFTRISD,将端口D的状态先送到WSUBWFTEMP,将端口D的状态与第一次读取的值相减BTFSSSTATUS,Z测试状态寄存器值如果是则两次的值不相等GOTOWAIT转到等待ms在进行下一次测试GOTOOUTPUT如果是则两次的值相等转到输出部分WAITCALLDELAY延时msGOTOCHECK转到CHECK进行下一次扫描OUTPUTMOVFTEMP,将扫描到的端口D的数据存到W中MOVWFPORTC将端口D的数据输出到端口CGOTOCHECK转到CHECK进行下一次扫描***************************延时子程序****************************************DELAYMOVLWCOUNT设置外部循环的次数MOVWFDATALOOPMOVLWCOUNT设置内部循环的次数MOVWFDATALOOPDECFSZDATA,内部循环变量自减为则跳转GOTOLOOPDECFSZDATA,外部循环变量自减为则跳转GOTOLOOPRETURN延时子程序返回***************************延时子程序结束*************************************END源程序结束()LED显示程序#include<picFxh>#include“mydefineh”#include<pich>staticintflag,flag,flag,flag,leddstaticintdata,data,data,data,sdata=================子程序=================端口初始化子程序voidinitport(){PORTA=PORTB=PORTC=PORTD=ADCON=xTRISA=x设RARA为输入TRISB=xE设RBRBRBRB为输出TRISC=xFF设C口为输入}intadrjud(intx){ntadress,yadress=PORTAxx=xadress=adress<<if(adress==x)y=elsey=CLRWDT()Return(y)}显示初始化子程序voidinitdis(){PORTB=xFE选通数码管PORTD=xCPORTB=xFD选通数码管PORTD=xCPORTB=xFB选通数码管PORTD=xF选通小数位PORTD=xCPORTB=xEF选通数码管PORTD=xC}读次数据判是否有次相等intjudge(array)intarry{inti,j,kfor(i=i<=i){k=for(j=j<=j){if(arryi==arryj)kif(k>){flag=data=arryireturn(flag)}elseflag=}}return(flag)}数据转换子程序intconvert(intd,intd){autointdd,ddinti,j,k,i,j,mdd=ddd=dj=xk=d=for(i=i<=i){if(j==(ddj))m=elsem=d=dm*kj=jk=k}j=xd=for(i=i<=i){if(j==(ddj))m=elsem=d=dm*kj=jk=k}data=ddreturn(data)}显示子程序intdisplay(intx){intl,l,l,ll=xPORTB=xFE选通数码管PORTD=ledll=(xl*)PORTB=xFD选通数码管PORTD=xFPORTD=ledl选通数码管L=xl*l*l*PORTB=xEF选通数码管PORTD=ledl}中断服务子程序voidinterruptintserve(){PIR=TMRL=xETMRH=xBEdi()sdata=PORTCxei()}开中断子程序voidintopen(){inportc=PORTCxif(inportc==)returnelsedata=~PORTCflag=adrjud(data)if(flag==)return地址不同返回elsedata=~PORTCdata=~PORTCif(data==data)if(data==data){flag=PIR=开通总中断前清所有中断标志位TMRIE=TMR溢出中断使能PEIE=Ei()TMRL=xETMRH=xBEms中断次TMRH=x设TM为分频计数器方式工作Elsereturn}读第帧子程序voidread(){intjfor(j=j<=j)dataj=~PORTCflag=judge(data)if(flag==){data=dataflag=count}flag=adrjud(data)if(flag==){for(j=j<=j)dataj=~PORTCflag=judge(data)if(flag==){data=dataflag=count}}}主程序main(){inti,ii,Iflag=flag=flag=count=count=data=data=ledd=led=xcled=xfled=xaled=xbled=xled=xled=xled=xfled=xled=xinitport()OPTION=xFEInitdis()While(){If(flag==)intopen()Else{If(sdata==x){If(flag==){For(i=i<=i)datai~PORTCFlag=judge(data)If(flag=judge(data)If(flag==){Data=dataFlag=Count}}}elseif(sdata==){if(flag=){data=~PORTCif(flag==){for(j=,j=<=j)dataj=~PORTCflag=judge(data)if(flag==){if(data=data)flag=counnt}}}}CLRWDT()If(count==countledd=convert(data,data){display|(ledd)}}}汇编程序如下:STATUSEQUH定义状态寄存器地址PORTCEQUH定义端口C的数据寄存器地址PORTDEQUH定义端口D的数据寄存器地址TRISCEQUH定义端口C的方向寄存器TRISDEQUH定义端口D的方向寄存器PCLEQUH定义程序指针寄存器RPEQUH定义状态寄存器中的页选位RPRPEQUH定义状态寄存器中的页选位RPZEQUH定义状态寄存器中的标志位ZDATAEQUH定义外循环变量DATAEQUH定义内循环变量COUNTEQUH定义已经点亮LED的次数COUNTEQUH定义个位的计数值COUNTEQUH定义十位的计数值NEQUFH定义存储外循环次数的变量NEQUFFH定义存储内循环次数的变量******************************************************************************ORGH初始定位GOTOMAINNOP***************************主程序开始*****************************************MAIN***************************初始化*********************************************BCFSTATUS,RP转到BANKBSFSTATUS,RPMOVLWFFH将端口D的方向控制字先送到WMOVWFTRISD然后再转送到端口D的方向寄存器设置端口D为输出MOVLWFFH将端口C的方向控制字先送到WMOVWFTRISC然后再转送到端口C的方向寄存器设置端口C为输出***************************初始化结束*****************************************BCFSTATUS,RP转到BANKBCFSTATUS,RPSTARTMOVLWH将先输入到WMOVWFCOUNT将COUNT置零MOVWFCOUNT将COUNT置零MOVLWHMOVWFPORTDMOVLWH将H输入到WMOVWFPORTC端口C的BIT为高电平十位不点亮端口C的BIT为低电平个位不点亮STARTMOVLWAH将AH转到WXORWFCOUNT,COUNT和AH异或BTFSSSTATUS,Z如果Z为则COUNT是AH如果Z为则COUNT不是AHGOTOBITFULL转到BITFULLSTARTMOVLWH将H转到WXORWFCOUNT,COUNT和H异或BTFSSSTATUS,Z如果Z为则COUNT是H如果Z为则COUNT不是HGOTOBITFULL转到BITFULLMOVFCOUNT,将COUNT存到WCALLTABLE查表得到输出个位数据的LED显示BSFPORTC,先让十位输出失效MOVWFPORTD在端口D输出BSFPORTC,个位输出使能CALLDELAY输出延时MOVFCOUNT,将COUNT存到WCALLTABLE查表得到输出十位数据的LED显示BSFPORTC,先让个位输出失效MOVWFPORTD在端口D输出BSFPORTC,十位输出使能CALLDELAY输出延时INCFCOUNTCOUNT自加GOTOSTART跳到STARTBITFULLINCFCOUNTCOUNT自加CLRFCOUNTCOUNT清零GOTOSTART跳到STARTBITFULLMOVLWAH将AH转到WXORWFCOUNT,COUNT和AH异或BTFSSSTATUS,Z如果Z为则COUNT是H如果Z为则COUNT不是HGOTOSTART转到STARTINCFCOUNTCOUNT自加CLRFCOUNTCOUNT清零GOTOSTART跳到START***************************主程序结束********************************************************************查表程序TABLE开始************************TABLEADDWFPCL加偏移量到PCLRETLWB''输出RETLWB''输出RETLWB''输出RETLWB''输出RETLWB''输出RETLWB''输出RETLWB''输出RETLWB''输出RETLWB''输出RETLWB''输出***************************查表程序TABLE结束***************************************************查表程序TABLE开始************************TABLEADDWFPCL加偏移量到PCLRETLWB''输出RETLWB''输出RETLWB''输出RETLWB''输出RETLWB''输出RETLWB''输出RETLWB''输出RETLWB''输出RETLWB''输出RETLWB''输出***************************查表程序TABLE结束***************************************************查表程序TABLE结束***************************************************查表程序TABLE开始************************TABLEADDWFPCL加偏移量到PCLRETLWB''输出RETLWB''输出RETLWB''输出RETLWB''输出RETLWB''输出RETLWB''输出RETLWB''输出RETLWB''输出RETLWB''输出RETLWB''输出***************************查表程序TABLE结束************************()LCD应用程序unsignedcharTRANSunsignedcharPAGEADD存放页地址寄存器unsignedcharPAGENUM存放总页数寄存器unsignedcharCLMSUM存放总列数寄存器unsignedcharCLMADD存放列地址寄存器unsignedcharWRITE存放显示数据寄存器unsignedcharrow存放显示起始行寄存器unsignedcharik通用寄存器系统各口的输入输出状态初始化子程序voidINITIAL(){ADCON=X设置PORTA口和PORTE口为数字IO口TRISA=TRISB=TRISE=X设置液晶的个控制脚为输出}读液晶显示器状态子程序voidLCDSTA(){while(){TRISD=XFF设置D口为输入RB=E=RA=E=RE=RW=RE=A=if(RD==)break为忙状态则继续等待其为空闲}}对液晶显示器发指令子程序(指令保存在TRANS寄存器中)voidTRANS(){LCDSTA()判断液晶是否为忙TRISD=X置D口为输出RB=E=RA=E=RE=RW=RE=A=PORTD=TRANS需要写入的命令字送入数据线RB=E=写入指令RE=RW=}对液晶显示器写数据子程序(数据保存在WRITE寄存器中)voidWRITE(){TRANS=CLMADD设置列地址TRANS()LCDSTA()查询液晶是否为空闲TRISD=XD口为输出RB=E=RA=E=RE=RW=RE=A=PORTD=WRITE需要写入的数据放入D口RB=E=写入数据CLMADD列地址加RE=RW=}开E显示子程序voidDISP(){while(){TRANS=XAFTRANS()送出控制命令LCDSTA()判断液晶是否为空闲TRISD=XFF设置D口为输入RB=E=RA=E=RE=RW=RE=A=if(RD==)break如果液晶没被关闭则继续关}}E边清屏子程序voidCLEAR(){PAGEADD=xB设置页地址代码for(PAGENUM=XPAGENUM>PAGENUM){TRANS=PAGEADDTRANS()CLMADD=x设置起始列for(CLMSUM=XCLMSUM>CLMSUM){LCDSTA()判断液晶是否为空闲WRITE=XWRITE()写入H以清屏}PAGEADD页号增}}关E显示子程序voidDISOFF(){while(){TRANS=XAETRANS()发出控制命令LCDSTA()判断液晶是否为空闲TRISD=XFFD口设置为输入RB=E=RA=E=RE=RW=RE=A=if(RD==)break如果液晶没被关闭则继续关}}有了以上的通用子程序就可以构造出各种显示程序如字符、汉字、曲线等。执行这些程序前必须对液晶进行初始化。初始化的顺序为:关显示→正常显示驱动设置→占空比设置→复位→ADC选择→清屏→开显示程序如下:E边初始化voidlcd(){DISOFF()关显示ETRANS=XA静态显示驱动TRANS()发出控制命令TRANS=XA占空比为TRANS()发出控制命令TRANS=XE复位TRANS()发出控制命令TRANS=XAADC选择正常输出TRANS()发出控制命令CLEAR()清屏LCDSTA()判断液晶是否为空闲DISP()开显示}()针对MG模块的编程lcdfialequx存放标志位sbdataequlcdflag存放显示数据clmaddequsbdata存放列地址pageaddequclmadd存放页地址pagenumequpageadd存放总页数clmsumequpagenum存放总列数intscodeequclmsum存放指令代码读液晶显示器状态子程序StebsfSTATUS,RP选中存储区movlwxffmovwfTRISD设置D口为输入bcfSTATUS,RP选中存储区bsfPORTB,E=bsfPORTB,RW=bcfPORTB,A=TaemovfPORTD,将状态字读入W中movwflcdfiag将W中的状态字存入lcdfiag中btfsclcdflag,判断D位是否为gotoTaeD=为忙状态return对液晶显示器发指令子程序(指令保存在W寄存器中)CweMovwfintscode指令暂存intscodeBcfPORTB,RW=BcfPORTB,A=movfintscode,movwfPORTDbcfPORTB,E=写入指令return对液晶显示器写数据子程序(数据保存在W寄存器中)DweMovwfsbdata数据暂存sbdataMovfclmadd,CallCwe设置列地址CallSteBsfSTATUS,RPclrfTRISD设置D口为输出方式bcfSTATUS,RPbsfPORTB,E=bcfPORTB,RW=bsfPORTB,A=movfsbdata,movwfPORTDbcfPORTB,E=,写入数据callSteinctclmadd,列地址加return液晶显示器开显示、关显示和清屏子程序Disp开E显示movlwxal将控制命令放在W中callCwebsfPORTB,E=callSte判是否忙inctclmadd,列地址加return液晶显示器开显示、关显示和清屏子程序Disp开E显示movlwxal将控制命令放在W中callCwebsfPORTB,E=callSte判是否忙bsfSTATUS,RPclrfTRISD设置D口输出方式bcfSTATUS,RPbsfPORTB,E=bsfPORTB,RW=bcfPORTB,A=bsfSTATUS,RPmovlwxffmovwfTRISD设置D口输入方式bcfSTATUS,RPmovfPORTD,movwflcdflag读入状态并查询btfsclcdflag,是否确定打开gotoDispreturnDisoff关E显示movlwxae控制命令入在W中callCwebsfPORTB,E=bsfPORTB,RW=bcfPORTB,A=bsfSTATUS,RPmovlwxffmovwfTRISDbcfSTATUS,RPmovfPORTD,movwflcdfiag读入状态并查询btfsslcdfiag,判是否关闭gogoDisoffreturnCler清屏movlwxb设置页地址代码movwfpageaddmovlwxmovwfpagenum设置总页数clrmovfpageadd,callCwemovlwx设置总列数movwfclmsum或列movlwxmovwfclmadd设置起始列clrmovlwxcallDwe写入Hclardecfszclmsum,本页未清完gotopageadd,页号增decfszpagenum,页未清完gotoclr返回继续return初始化子程序LcdinitcallDisoff关显示movlwxa静态显示驱动callCwemovlwxe复位callCwemovlwxaADC选择正常输出callCwemovlwx占空比为callCwecallCler清零callDisp开显示return()对IC卡操作代码********************检查IC卡是否插入并进行处理********************PRQCCHECKICCARD:BSFSTATUS,STATUSRPOBSFTRISBPLUGTEST设置PLUSGTEST为输入口BCFSTATUSSTATUSRPOBTFSSPORTBPLUGTEST是否有卡插入GOTOLBCHECKICCARD有卡插入则转移BCFFLAGBYTE,ICBEINGPLUGEDFLAG没有卡插入卡一直在插入标志清零BCFFLAGBYTE,ICCARDERRORFLAG错卡标志清零GOTOLBCHECKICCARDLBCHECKICCARD:BTFSCFLAGBYTEI,ICBEINGPLUGEDFLAGIC卡是否是一直插入GOTOLBCHECKICCARD是的则转移CALLPROCDELAYMS延时lMS去除抖动BTFSSPORTB,PLUGTEST是否有卡插入GOTOLBCHECKICCARD有卡插入则转移BCFFLAGBYTEI,ICBEINGPLUGEDFLAG没有卡插入IC卡一直在插入标志清零GOTOLBCHECKICCARDLBCHECKICCARDCALLPROCSHORTSPEAKER延时MS去除抖动BCFFLAGBYTE,LCDOFFFLAG有卡插入时唤醒LCDCLRFTIMINGCOUNT*************************************************************BSFFLAGBYTE,ICBEINGPLUGEDFLAGIC卡一直插入状态置位BSFSTATUS,STATUSRPOBCFTRISB,ICVCC设置ICVCC为输出口BCFSTATUS,STATUSRPOBCFPORTB,ICVCC当有卡插入时卡上电CALLPROCDELAYlMS延时lMS去处抖动BSFSTATUS,STATUSRPOBSFTRISB,SHORTTEST设置SHORTTEST为输入口BCFSTATUS,STATUSRPOBTFSCPORTB,SHORTTEST卡电源是否短路GOTOLBCHECKICCARD卡电源没有短路转移BSFFLAGBYTEI,ICCARDERRORFLAG卡电源短路则错卡标志置位GOTOLBCHECKICCARDLBCHECKCCARD:CALLPROCDELAYMS延时MSCALLPROCDELAYMSCALLPROCDELAYMSCALLPROCDELAYMSCALLPROCICRESET卡复位及应答CALLPROCDELAYMS延时MSCALLPROCICRESET重做复位应答使可靠CALLPROCICKEYVERIFY密码校验流程BTFSCFLAGBYTE,ICCARDERRORFLAG密码校验是否正确GOTOLBCHECKICCARD密码错误则转移退出CALLPROCICREADMAIN密码正确则读出卡主存H到RAM的HCALLPROCDISPOSEICDATA调用IC数据处理流程LBIOCHECKICCARD:BCFSTATUS,STATUSPR检测完毕或读卡后下电BSFPORTB,ICVCCRETURN

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

评分:

/18

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利