📄 m128._c
字号:
#include <iom128v.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转换后的值
/* 传送ASCII字母到LCD */
/* x:0x00~0x0f y:0~64 */
void asc_tran1(unsigned char x,unsigned char y,unsigned char *asc_p)
{
x+=4;
//while((*asc_p)!=0)
{
ocmj_write(0xf1);
ocmj_write(x);
ocmj_write(y);
ocmj_write(*asc_p);
asc_p++;
if (x<0x13)
x++;
else
{
x=0x04;
y+=8;
}
}
}
void main(void)
{int x=0,a=0,i=0;
char code[]={'0','1','2','3','4','5','6','7','8','9',};
ocmj_init();//初始化
ocmj_write(0xf4);//清屏
hz_tran(3,0,"数模转换");//传送内部汉字
while(1)
{
x=(int )AdcVal(1);
for(i=0;i<7;i++)
{a=x%10;
asc_tran1(10-i,50,& code[a]);
x=x/10;
}
x=0;
/* ADCSRA = 0x00; //disable adc
ADMUX = 0x00; //select adc input 0
ACSR = 0x80;
ADCSRA = 0x86;*/
}
}
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 ;
ADCSRA=0x00 ;
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 + -