//根据硬件功能,分别显示两个不同的数据,分两次调用子程序,则显示出指定的数据。<br />//考虑 结合AD转换功能模块,显示转换AD之后的 数字量。综合2个功能模块编程<br /><br />#include"pic.h"<br />#include"pic1687x.h"<br />unsigned char Table0[10]={0XBF,0X86,0XDB,0XCF,0XE6,0XED,0XFD,0XF7,0XFF,0XEF}; //LED 共阴极数码管显示代码,带点。 单独RD7 显示部分。<br />unsigned char Table[10]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};<br /><br />const char table[16]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XD8,0X80,0X90,0X88,0X83,0XC6,0XA1,0X86,0X8E}; // 共阳极代码 595处理显示部分。<br />const char table0[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};<br /><br /><br />union adres //考虑 结合AD转换功能模块,显示转换AD之后的 数字量。综合2个功能模块编程<br />{<br />int y1;<br />unsigned char adres1[2];<br />}adres2;<br /><br /><br />void ADinitial()<br />{<br />TRISA2=1; //TRISA1=1;<br />ADCON0=0B01010001; //0X51寄存器 0B01010001选择模拟通道为010 RA2; AD工作时钟频率8分频 01; ADGO/DONE * ADON; 需要AD转换ADON开启但是此刻不需要立刻转换工作 ANGO 0<br />ADCON1=0B10000000; //0X80 ADFM 转换结果排列方式 ADFM=1 则高6为是0000000?????????????? 转换结果放在地位。<br /> //ADCON1 控制寄存器主要用于选择引脚的功能: 通用的数字信号入出的IO引脚; 模拟 量信号的输入功能;参考电压输入的功能RA5---RE0,RE1,RE2; <br /><br />PIE1=0;<br />PIE2=0;<br />ADIE=1;<br />PEIE=1;<br />}<br /><br />void interrupt ADdeal() //功能描述:中断模块必须有标志字, 如同 USART 通讯模块子函数。<br />{<br />ADIF=0;<br />adres2.adres1[0]=ADRESL; //AD模块转换结果,自动存储在 两个结果寄存器中, ADRESH; ADRESL. 必须用共用提变量将其取出再进行处理,产生对应动作。<br />adres2.adres1[1]=ADRESH; <br /> if(adres2.y1==0XCC) <br /> { //程序功能注释:输入部分为接地端部分; 小于3V的时候显示2, 可调电阻、电位器大于3伏特时候显示3。 0X266对应 3伏特电压,0X133对应1.5伏特<br /> //程序改变模拟输入的量,0X133,小于1.5V的时候,显示1,大于1.5V时候显示2 <br /> PORTD=Table0[1];<br />// RC1=1; <br /> }<br />//------------------------------------------------------------------------<br /> else if(adres2.y1==0X199) <br /> { <br /> <br /> PORTD=Table0[2];<br />// RC1=0; <br /> }<br />//----------------------------------------------------------------------------<br /> else if(adres2.y1==0X266) //注意一个常识,严重区别好 等于符号 == 及赋值号。 <br /> { <br /> <br /> PORTD=Table0[3];<br />// RC1=1; <br /> }<br />//-------------------------------------------------------------------------<br /> else if(adres2.y1==0X333) <br /> { <br /> <br /> PORTD=Table0[4];<br />// RC1=0; <br /> }<br /><br />//------------------------------------------------------------------------<br /> else if(adres2.y1==0X400) <br /> { <br /> <br /> PORTD=Table0[4];<br />// RC1=0; <br /> }<br /><br /> ADGO=1; //启动下一次AD采集信号。<br />}<br />//-----------------------------------------------------------------------------------------------------------------------------------------<br />void SYSinitial()<br />{<br />TRISD=0X00;<br />PORTD=0XFF;<br />TRISC1=0; //RC1 为蜂鸣器 1叫。<br />PORTC=0X00;<br />}<br /><br /><br />//***************************************************************************************************************<br />SPIinitial()<br />{<br /> PIR1=0;<br /><br /> SSPCON=0x30;<br /> SSPSTAT=0xc0; <br /><br /> TRISC5=0; <br /> TRISC3=0; <br /><br /> TRISC2=0; <br /><br />}<br /><br />//*************************************************************************************************************<br />void SPILED(char data)<br />{<br />SSPBUF=data; <br /> do<br /> {<br /> ;<br /> }while(SSPIF==0) ; <br />SSPIF=0;<br />}<br />//**************************************************************************************************************<br />void display(char data1)<br />{<br />RC2=0; <br /><br /> SPILED(data1);<br /><br />RC2=1; <br />} <br /><br />//--------------------------------------------------------------------------------------------------------------------------------<br />void main()<br />{<br />SYSinitial();<br /><br />SPIinitial();<br />ADinitial();<br /><br />GIE=1;<br />PEIE=1;<br />ADGO=1; //记得各类中断 功能模块都是有固定程序格式、分使能位?标志位<br /><br /> while(1)<br /> {<br /> ;<br /> }<br /><br />} |
|