📄 11位的lcd带ad与中断.txt
字号:
#include <intrinsics.h>
#include <iom16.h>
#include <iomacro.h>
#define uint unsigned int
#define uchar unsigned char
//===================定义MCU与LCD的接口===================
#define set_lcd_en PORTB|=0x80;
#define clr_lcd_en PORTB&=0x70;
#define set_lcd_rw PORTB|=0x40;
#define clr_lcd_rw PORTB&=0xb0;
#define set_lcd_rs PORTB|=0x20;
#define clr_lcd_rs PORTB&=0xd0;
uint addate0; //AD转换数据
uint addate1;
uchar flag=0; //转换标志位
float date; //转换结果
uchar t[];
void LCD_init (void);
void avr_io_int (void);
void LCD_wait_Ready(void);
void writecommend(unsigned char c);
void writedata(unsigned char c);
void showchar(unsigned char pos,unsigned char c);
void showstring(unsigned char line, unsigned char *ptr);
//----------------------------------------------------------------------
void delay(void)
{uint i,j,k;
for(i=0;i<5000;i++)
{for(j=0;j<5000;j++)
{for(k=0;k<5000;k++);}
}
}
void avr_io_int(void)
{
DDRC=0xff;
PORTC=0x00;
DDRB=0xff;
PORTB=0x00;
DDRA=0; //设置PA口为输入,无上拉
PORTA=0;
}
//========================================================
void LCD_init(void)
{
writecommend(0x38);
writecommend(0x38);
writecommend(0x06);
writecommend(0x0c);
writecommend(0x01);
writecommend(0x80);
}
void writecommend(unsigned char c)//写指令
{
LCD_wait_Ready();
PORTC&=0x00;
PORTC=c;
clr_lcd_rs;
clr_lcd_rw;
clr_lcd_en;
set_lcd_en;
__delay_cycles(5);
clr_lcd_en;
}
void LCD_wait_Ready(void) //等待LCD空闲
{
DDRC&=0x00; //PC7 I/O口方向设置为输入
set_lcd_rw; //RW=1
clr_lcd_rs; //RS=0
set_lcd_en; //EN=1
while(PINC&0x80); //RW=1,读PC7,为0表示空闲;
clr_lcd_en; //EN=0
DDRC|=0xff;
}
void writedata(unsigned char c) //写数据
{LCD_wait_Ready();
PORTC&=0x00;
PORTC=c;
set_lcd_rs;
clr_lcd_rw;
clr_lcd_en;
set_lcd_en;
__delay_cycles(5);
clr_lcd_en;
}
void showchar(unsigned char pos,unsigned char c)
{unsigned char p;
if(pos<0x10) p=pos+0x80;
else p=pos+0xb0;
writecommend(p);
writedata(c);
}
void showstring(unsigned char line,unsigned char*prt)
{unsigned char l,i;
l=line*0x10;
for(i=0;i<16;i++)
showchar(l++,*(prt+i));
}
void main()
{ uchar i,a=0;
avr_io_int(); //IO口初始化
LCD_init(); //液晶初始化
ADMUX=0Xc0; //内部基准电压,通道0
ADCSRA=0X8f; //模数转换使能,开中断,单触发,64分频
SREG=0X80; //开中断
ADCSRA|=0X40;
while(1)
{ if(flag==1)
{ addate1=addate1*25;
t[0]=addate1/10000%10;
t[1]=10;
t[2]=addate1/1000%10;
t[3]=addate1/100%10;
t[4]=addate1/10%10;
t[5]=addate1%10;
for(i=0;i<6;i++)
{switch (t[i])
{case 0:{ showchar(a,0x30);a++;} break;
case 1: {showchar(a,0x31);a++;} break;
case 2: {showchar(a,0x32);a++;} break;
case 3: {showchar(a,0x33);a++;} break;
case 4: {showchar(a,0x34);a++;} break;
case 5: {showchar(a,0x35);a++;} break;
case 6: {showchar(a,0x36);a++;} break;
case 7: {showchar(a,0x37);a++;} break;
case 8: {showchar(a,0x38);a++;} break;
case 9: {showchar(a,0x39);a++;} break;
default:{showchar(a,'.');a++;} break;
}
}
flag=0; a=0;
ADCSRA|=0X40;
delay();
}
}
}
#pragma vector =ADC_vect
__interrupt void ADC_isr(void)
{addate0=ADCL;
addate1=ADCH;
addate1=(addate1<<8)+addate0;
flag=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -