?? 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 + -