?? m16.c
字號:
#include <iom16v.h>
#define uchar unsigned char
#define uint unsigned int
#define LcdBus PORTA
#define BIT(i) (1<<i)
#define rs 2 //LCD端口定義
#define rw 3
#define en 4
const char DisV[]={"V:"} ;//靈敏度
const char DisP[]={"P:"} ;//精確度
void LcdIni(void) ;
void WrOp(uchar dat) ;
void WrDat(uchar dat) ;
void ChkBusy(void) ;
void DisText(uchar addr,uchar *text) ;
void DisTextConst(uchar addr,uchar const *text) ;
void ShowNum(uchar addr,uint num) ; //在addr處顯示數字num
int AdcVal(uchar n) ;
void delayms(uint n) ;
int AdcValPro(uchar n) ;
char BCD[6] ; //十位二進制的顯示碼分別是千百十個位的顯示
int Adc[3] ; //存放Adc轉換后的值
void main(void)
{
LcdIni() ;
DisTextConst(0x80,DisV) ;
DisTextConst(0xc0,DisP) ;
while(1)
{
ShowNum(0x82,AdcVal(1)) ;
ShowNum(0xC2,AdcVal(2)) ;
}
}
int AdcVal(uchar n)
{//軟件濾波
uchar i,k ;
uint tmp=0 ;
for(i=0 ;i<20 ;i++)
tmp=(tmp+AdcValPro(n))/2 ;
k=tmp>Adc[n] ? (tmp-Adc[n]):(Adc[n]-tmp) ;
Adc[n]=k>5 ? tmp:Adc[n] ;
return Adc[n] ;
}
int AdcValPro(uchar n)
{//返回第N個ADC的值從0到7
uchar dat1,dat0 ;
int val ;
DDRA &=~BIT(n) ; //設置對應的ADC口為輸入
PORTA &=~BIT(n) ;
ADMUX=0x40+n ; //選擇AVCC,選擇第N個ADC
ADCSRA=0xc0 ; //允許轉換ADEN,ADSC
while(ADCSRA & BIT(ADSC)) ; //
dat1=ADCH ;
dat0=ADCL ;
val=ADCH*256+ADCL ;
DDRB=0xff;
PORTB=val; return val ;
}
void ShowNum(uchar addr,uint num) //在addr處顯示數字num
{//將num轉化成五個BCD碼存放在全局數組BCD[5]中
uchar i ;
for(i=5 ;i>0 ;i--) //將NUM數據轉化成ASCII碼,如521會轉化為00521
{
BCD[i-1]=(uchar)(num%10+0x30) ; //取出最低位
num/=10 ; //去掉最低位
}
i=0 ;
// while(BCD ==0x30 && i<4) BCD[i++]=' ' ; //NUM轉換成數組存放,但還沒有加上小數點
BCD[5]='\0' ;
DisText(addr,BCD+1) ;
}
void DisText(uchar addr,uchar *p)
{
WrOp(addr) ;
while(*p !='\0')WrDat(*(p++)) ;
}
void DisTextConst(uchar addr,uchar const *p)
{
WrOp(addr) ;
while(*p !='\0')WrDat(*(p++)) ;
}
void LcdIni()
{
uint i ;
DDRD=0XFF ; //設置PA輸出
PORTD=0XFF ; //全部加上上拉電阻
DDRC=0XFF ; //設置PC為輸出
PORTC=0XFF ; //全部加上上拉電阻
WrOp(0x38) ;
WrOp(0x06) ; //光標加1
WrOp(0x0c) ; //開顯示
WrOp(0x01) ;
for(i=0 ;i<5000 ;i++) ;
}
void WrOp(uchar dat)
{
uchar i ;
ChkBusy() ;
PORTD &=~BIT(rs) ; //RS=0
PORTD &=~BIT(rw) ; //RW=0
PORTD &=~BIT(en) ; //EN=0
PORTC =dat ; //送數據
PORTD |=BIT(en) ; //EN=1
for(i=1 ;i ;i++) ; //延時
PORTD &=~BIT(en) ; //EN=0
}
void WrDat(uchar dat)
{
uchar i ;
ChkBusy() ;
PORTD |=BIT(rs) ; //rs=1
PORTD &=~BIT(rw) ; //rw=0
PORTD &=~BIT(en) ; //en=0
PORTC=dat ; //送數據
PORTD |=BIT(en) ; //en=1
for(i=1 ;i ;i++) ; //延時
PORTD &=~BIT(en) ; //en=0
}
void ChkBusy()
{
DDRC=0X00 ; //設置為輸入
PORTC=0X00 ; //不設置上拉電阻
PORTD &=~BIT(rs) ; //RS=0
PORTD |=BIT(rw) ; //RW=1
PORTD |=BIT(en) ; //EN=1
while(PINC & 0x80) ; //送數據
PORTD &=~BIT(en) ; //en=0
DDRC=0xff ; //設置為輸出
}
void delayms(uint n)
{
uchar j ;
uint i ;
for(i=0 ;i<n ;i++)
for(j=0 ;j<250 ;j++) ;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -