历史上的今天
今天是:2024年11月09日(星期六)
2019年11月09日 | PIC单片机ad采样在LCD上显示
2019-11-09 来源:51hei
/* Main.c file generated by New Project wizard
*
* Created: 周二 4月 10 2018
* Processor: PIC18F452
* Compiler: MPLAB C18
*/
#include #define RW PORTBbits.RB5 #define RS PORTBbits.RB6 #define EN PORTBbits.RB7 #define P0 PORTD #define ADGO ADCON0bits.GO void tmr(void); void KeyInterrupt1 (void); //中断服务函数 void KeyInterrupt2 (void); //中断服务函数 void KeyInterrupt3 (void); //中断服务函数 void lcd_show(void); void lcd_show1(void); void lcd_show2(void); void lcd_show3(void); void lcd_show4(void); void lcd_show5(void); void lcd_show6(void); unsigned int AD_Trs(void); unsigned int AD_Trs1(void); unsigned int AD_Trs2(void); //int j=0; //int time=0; //int timem=0; int intermode=0; unsigned int lednum=0; int max=4000,max1=3900,max2=3800,max3=3700; int min=1000,min1=900,min2=800,min3=1000; unsigned char time2[7]="wangkuod"; unsigned int a1=0,a2=0,a3=0; int init(); //声明初始化函数 int write_com(unsigned char);//声明写命令函数 int write_date(unsigned char);//声明写数据函数 int delay(unsigned char);//声明延迟函数 unsigned char x; //sbit RS = P1^0; // sbit RW = P1^1; //sbit EN = P1^2; //unsigned char table[]="HELLO!"; //unsigned char table1[]="2018/4/16"; void main(void)//主函数 { TRISD=0; TRISBbits.TRISB0=1; TRISBbits.TRISB1=1; TRISBbits.TRISB2=1; TRISBbits.TRISB5=0; TRISBbits.TRISB6=0; TRISBbits.TRISB7=0; TRISAbits.TRISA0=1; TRISAbits.TRISA1=1; TRISAbits.TRISA2=1; TRISAbits.TRISA6=0; // INTCON |= 0xa0; //开全局中断及Timer0 中断 //INTCONbits.TMR0IE=1; INTCONbits.GIE=1; //INT0 INTCON2bits.INTEDG0=1; INTCONbits.INT0IF=0; INTCONbits.INT0IE=1; //INT1 INTCON2bits.INTEDG1=1; INTCON3bits.INT1IF=0; INTCON3bits.INT1IE=1; //int2 INTCON2bits.INTEDG2=1; INTCON3bits.INT2IF=0; INTCON3bits.INT2IE=1; //TMR0H = 25536/256; //高8 位 //TMR0L = 25536%256; //低8 位 //T0CON = 0x88; //使能Timer0,并设置为16 位定时器,没有预分频 //AD ADCON0=0x81; //-- ADFM ADCS2 —— —— PCFG3 PCFG2 PCFG1 PCFG0 //-- 1 0 0 0 1 1 1 0 //右对齐(ADRESH 寄存器的高6 位读作0),AN0 为模拟输入位,参考正负电压 //分别为VDD 和VSS ADCON1 = 0x8e; init(); // write_com(0x80); // for(x=0;x<6;x++) // { // write_date(table[x]); // delay(150); // } //for(x=0;x<6;x++) // { // write_date(time); // delay(150); // } // write_com(0x80); // for(x=0;x<17;x++) // { // write_date(table1[x]); // delay(150); // } while(1) { unsigned int a; lednum = AD_Trs(); write_com(0x80); time2[1]='0'; lcd_show(); lednum = AD_Trs1(); write_com(0x80+0x08); time2[1]='1'; lcd_show(); lednum = AD_Trs2(); write_com(0x80+0x40); time2[1]='2'; lcd_show(); switch(intermode) { case 0: {write_com(0x80+0x40+0x08); lcd_show1();break; } case 1: {write_com(0x80+0x40+0x08); lcd_show2();break;} case 2: {write_com(0x80+0x40+0x08); lcd_show3();break; } case 3: {write_com(0x80+0x40+0x08); lcd_show4();break; } case 4: {write_com(0x80+0x40+0x08); lcd_show5();break; } case 5: {write_com(0x80+0x40+0x08); lcd_show6();break; } default: {write_com(0x80); lcd_show1();break; } } if(lednum>max1|lednum>max2|lednum>max3|lednum //{PORTAbits.RA3=0; // delay(50); // PORTAbits.RA3=1; // delay(50); // PORTAbits.RA3=0; // delay(50); // PORTAbits.RA3=1; // delay(50);} PORTAbits.RA6=1; } } } #pragma code xx=0x0008 //MCC18 的中断必需用一段汇编实现 void inter(void) //xx 为优先级,没有优先级时,可省略xx { if(INTCONbits.INT0IF){ _asm goto KeyInterrupt1 _endasm} else if(INTCON3bits.INT1IF){ _asm goto KeyInterrupt2 _endasm } else { _asm goto KeyInterrupt3 _endasm } } //=======中断服务函数========== #pragma interrupt KeyInterrupt1 void KeyInterrupt1 (void) { if (INTCONbits.INT0IF && INTCONbits.INT0IE) //中断标志位判断 { //T0CONbits.TMR0ON=~T0CONbits.TMR0ON; INTCONbits.INT0IF = 0; //中断标志位清零 switch(intermode) { case 0: {max1=max1+100; break; } case 1: {max2=max2+100;break;} case 2: {max3=max2+100;break; } case 3: {min1=min1+100;break; } case 4: {min2=min2+100;break; } case 5: {min3=min3+100;break; } default: {max1=max1+100;break; } } } } #pragma code //=======中断服务函数========== #pragma interrupt KeyInterrupt2 void KeyInterrupt2 (void) { if (INTCON3bits.INT1IF && INTCON3bits.INT1IE) //中断标志位判断 { //T0CONbits.TMR0ON=~T0CONbits.TMR0ON; //intermode=~intermode; INTCON3bits.INT1IF = 0; //中断标志位清零 intermode++; if(intermode>5) {intermode=0;} } } #pragma code #pragma interrupt KeyInterrupt3 void KeyInterrupt3 (void) { if (INTCON3bits.INT2IF && INTCON3bits.INT2IE) //中断标志位判断 { //time=timem=j=0; // T0CONbits.TMR0ON=0; INTCON3bits.INT2IF = 0; //中断标志位清零 switch(intermode) { case 0: {max1=max1-100; break; } case 1: {max2=max2-100;break;} case 2: {max3=max2-100;break; } case 3: {min1=min1-100;break; } case 4: {min2=min2-100;break; } case 5: {min3=min3-100;break; } default: {max1=max1-100;break; } } } } #pragma code int init()//初始化函数体 { EN = 0; write_com(0X38);//设置16*2显示,5*7点阵,8位数据接口 write_com(0X0C);//设置开显示,不显示光标 write_com(0X06);//写一个字符时,整屏右移 write_com(0X01);//显示清零 return 0; } int write_com(unsigned char com)//写命令的函数体 { RS = 0; RW = 0; P0 = com; delay(5); EN = 1; delay(5); EN = 0; return 0; } int write_date(unsigned char date)//写数据的函数体 { RS = 1; RW = 0; P0 = date; delay(5); EN = 1; delay(5); EN = 0; return 0; } int delay(unsigned char xms) { unsigned char x,y; for(x=xms;x>0;x--) for(y=110;y>0;y--); return 0; } void lcd_show1(void) { // unsigned char a,b; // unsigned char time2[7]; // unsigned int time1[2]; // unsigned int time3[2]; //time3[0]=j/10; //time3[1]=j%10; //time1[0]=time/10; //time1[1]=time%10; //此算法用于取出一个整数的各个位,来显示在LCD 上 a1 = max1/1000; a2 = max1%1000/100; a3 = max1%100/10; //a4 = lednum%10; time2[0]='A'; time2[1]='0'; time2[2]='M'; time2[3]='0'+a1; time2[4]='.'; time2[5]='0'+a2; time2[6]='0'+a3; for(x=0;x<7;x++) { write_date(time2[x]); delay(15); } } void lcd_show2(void) { // unsigned char a,b; // unsigned int time1[2]; // unsigned int time3[2]; // unsigned int a1=0,a2=0,a3=0; //time3[0]=j/10; //time3[1]=j%10; //time1[0]=time/10; //time1[1]=time%10; //此算法用于取出一个整数的各个位,来显示在LCD 上 a1 = max2/1000; a2 = max2%1000/100; a3 = max2%100/10; //a4 = lednum%10; time2[0]='A'; time2[1]='1'; time2[2]='M'; time2[3]='0'+a1; time2[4]='.'; time2[5]='0'+a2; time2[6]='0'+a3; for(x=0;x<7;x++) { write_date(time2[x]); delay(15); } } void lcd_show3(void) { // unsigned char a,b; // unsigned char time2[7]; // unsigned int time1[2]; // unsigned int time3[2]; // unsigned int a1=0,a2=0,a3=0; //time3[0]=j/10; //time3[1]=j%10; //time1[0]=time/10; //time1[1]=time%10; //此算法用于取出一个整数的各个位,来显示在LCD 上 a1 = max3/1000; a2 = max3%1000/100;
史海拾趣
|
本帖最后由 paulhyde 于 2014-9-15 09:42 编辑 :$ :$ :$ 毕业设计运气不好:剩下了一个最难的课题 完全不懂该怎么入手 求求万能的电子工程世界的论坛友友们帮帮忙?给点思路也行 谢谢了 任务:采用单片机或CPLD完成信号发生器的设计 ...… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 09:18 编辑 该考试的考完了,该毕业的毕业了,是时候该准备比赛了。 有老师带,可以有比较完备的备赛准备 但是没有老师带的同学,就似乎有些摸不着头脑了 那胸有成竹的朋友分享下你们现在在干嘛?该如何备赛 ...… 查看全部问答> |
|
AnalogicTech offers a complete portfolio of products for smartphones and other handheld equipment to fully optimize available energy, minimize losses, and prolong battery life. For Li-ion polymer batteries, linear & ...… 查看全部问答> |
|
LED由于环保、寿命长、光电效率高等众多优点,近年来在各行业应用得以快速发展,LED的驱动电源成了关注热点,理论上,LED的使用寿命在10万小时以上,但在实际应用过程中,由于驱动电源的设计及驱动方式选择不当,使LED极易损坏.随着LED的应用日益广泛,LED ...… 查看全部问答> |
|
我自己搭了个简单的,发送管直接接IO,收接用三极管放大一次,好像能接收,不过数据不正确........郁闷中....... 高手进来说说通常都怎样弄的吧.....… 查看全部问答> |
|
我用CAB打包后,出的错误Log文件的内容是 “Error: Section [SourceDisksFiles] - file D:\\Program Files\\HelloCE\\HelloCE\\bin\\Debug\\HelloCE.exe cannot have a drive or pathname” 请问是什么原因?谢谢… 查看全部问答> |




