//ICC-AVR application builder : 2011-8-26 下午 08:01:50
// Target : M16
// Crystal: 7.3728Mhz
#include <iom16v.h>
#include <macros.h>
#define LCD_RS PC7
#define LCD_RW PC6
#define LCD_EN PC5
#define LCD_DD PD
#define uchar unsigned char
#define uint unsigned int
unsigned char temp[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
unsigned char temp1000,temp100,temp10,temp1;
void PWM_init(void)
{
DDRB=0xFF; //PB口输出高电平,LED全处于熄灭状态
PORTB=0xFF;
TCCR0=0x63; //0b01100001,PWM相位修正模式,无64分频,在升序计数时发
//生比较匹配将清零OC0,降序计数时发生比较匹配将置位OC0
}
void PWM_out(unsigned char m)
{
if(m<2)
OCR0=100;
else
OCR0=255;
}
unsigned int ADC_Init(void)
{
unsigned int dat;
DDRA&=~(1<<PA0);
PORTA&=~(1<<PA0);
ADMUX=0;//ADC多工道寄存器,参考外部电压,右对齐,选取PA第一通道
ADCSRA=0x80;//A通道控制和状态寄存器,取消开始转换,中断标志,自动触发,取消中断使能ADCSR在ICC中可以
ADCSRA|=1<<ADSC;//开始转换指令
while(!(ADCSRA&(1<<ADIF)));//中断使能,检测中断使能位同时为高说明已转换完
ADCSRA |= (1 << ADIF); //清零ADC中断标志位
dat=ADCL;//已定义右对齐,先读低8位
dat=dat+ADCH*256;//在读高8位
return dat;
}
void delayms(unsigned int ms)
{
unsigned int j;
while(ms--)
{
for(j=0;j<1141;j++);
}
}
void LCD1602_Port_Init(void)
{
/*LCD1602数据端口设置*/
DDRD=0xff;//数据口全为输出
PORTD=0;//输出低电平
/*LCD1602控制端口设置*/
DDRC|= (1 <<LCD_RS) | (1 <<LCD_RW) | (1 <<LCD_EN);
PORTC &= ~((1 <<LCD_RS) | (1 <<LCD_RW) | (1 <<LCD_EN));
}
/*LCD1602初始化定义*/
void LCD1602_Init(void)
{
delayms(400);
LCD1602_Write_Command(0x38);//选择显示模式
delayms(15);
LCD1602_Write_Command(0x38);//选择显示模式
delayms(15);
LCD1602_Write_Command(0x38);//选择显示模式
delayms(15);
LCD1602_Write_Command(0x0c);//让显示屏的光标闪烁
delayms(10);
LCD1602_Write_Command(0x06);//写完一个字符,显示地址指针自加一
delayms(10);
LCD1602_Write_Command(0x01);
delayms(10);
}
/*LCD1602写指令函数*/
void LCD1602_Write_Command(unsigned char command)
{
PORTC&=~(1<<LCD_RS);
PORTC&=~(1<<LCD_RW);
PORTD=command;
PORTC|=1<<LCD_EN;
delayms(5);
PORTC&=~(1<<LCD_EN);//1602下降沿送数据
}
/*LCD1602写数据指令函数*/
void LCD1602_Write_Data(unsigned char dat)
{
PORTC|=1<<LCD_RS;
PORTC&=~(1<<LCD_RW);
PORTD=dat;
PORTC|=1<<LCD_EN;
delayms(5);
PORTC&=~(1<<LCD_EN);//1602下降沿送数据
}
/*LCD1602指定一个位置显示一个字符*/
void LCD1602_DisplayOneChar(unsigned char x,unsigned char y,unsigned char dat)
{
unsigned char address;
if(y==1)
address=0x80+x;
else
address=0x0c+x;//算出地址码
LCD1602_Write_Command(address);//找到显示的位置
LCD1602_Write_Data(dat);//显示要显示的字符
}
/*LCD1602指定位置显示一个字符串*/
void LCD1602_DisplayStringChar(unsigned char x,unsigned char y,unsigned char *s)
{
unsigned char address,i;
uint lengh;
if(y==1)
address=0x40+x;
else
address=0xc0+x;
LCD1602_Write_Command(address);
lengh= (uint)strlen(s);//调用字符串函数算出字符的长度,并赋值给lengh
for(i=0;i<lengh;i++)
{
LCD1602_Write_Data(*s);//显示一个字符
s++;
}
}
/*LCD1602显示自定义字符*/
void LCD1602_DisplayMyChar(char xx,char yy,unsigned char *MyChar,unsigned char saveto)//*作用指向对象的地址
{
unsigned char add=(saveto<<3)|0x40;
unsigned char i,t;
t=*(MyChar+0);
LCD1602_Write_Command(add);//选中xx,yy位置5*8点阵中的第一行
LCD1602_Write_Data(t);//写显示数据
t=*(MyChar+1);
LCD1602_Write_Command(add);//选中xx,yy位置5*8点阵中的第二行
LCD1602_Write_Data(t);//写显示数据
t=*(MyChar+2);
LCD1602_Write_Command(add);//选中xx,yy位置5*8点阵中的第三行
LCD1602_Write_Data(t);//写显示数据
t=*(MyChar+3);
LCD1602_Write_Command(add);//选中xx,yy位置5*8点阵中的第四行
LCD1602_Write_Data(t);//写显示数据
t=*(MyChar+4);
LCD1602_Write_Command(add);//选中xx,yy位置5*8点阵中的第五行
LCD1602_Write_Data(t);//写显示数据
t=*(MyChar+5);
LCD1602_Write_Command(add);//选中xx,yy位置5*8点阵中的第六行
LCD1602_Write_Data(t);//写显示数据
t=*(MyChar+6);
LCD1602_Write_Command(add);//选中xx,yy位置5*8点阵中的第七行
LCD1602_Write_Data(t);//写显示数据
t=*(MyChar+7);
LCD1602_Write_Command(add);//选中xx,yy位置5*8点阵中的第八行
LCD1602_Write_Data(t);//写显示数据
for(i=0;i<8;i++)
{
LCD1602_Write_Command(add+i);
LCD1602_Write_Data(*(MyChar+i));
}
LCD1602_DisplayOneChar(xx,yy,saveto);
}
void main(void)
{
uint ad_data;
PWM_init();
LCD1602_Port_Init();
LCD1602_Init();
LCD1602_DisplayStringChar(0,2,"m16 ADC tranform");
SEI();
while(1)
{
ad_data=ADC_Init();
ad_data=(5000*(long)ad_data)/1023;
PWM_out(ad_data);
temp1000=ad_data/1000;
temp100=ad_data%1000/100;
temp10=ad_data%1000%100/10;
temp1=ad_data%1000%100%10;
delayms(20);
LCD1602_DisplayOneChar(1,1,temp[temp1000]);
LCD1602_DisplayOneChar(2,1,temp[temp100]);
LCD1602_DisplayOneChar(3,1,temp[temp10]);
LCD1602_DisplayOneChar(4,1,temp[temp1]);
}
}
这是我写的ad转换加PWM程序,用ICCV7编译出现如下问题:iccv7avrinimakew -f LCD1602.mak
iccavr -c -e -D__ICC_VERSION=722 -DATMega16 -l -g -MLongJump -MHasMul -MEnhanced main.c
!W E:ICCprojectLCD1602+AD程序main.c(67):[warning] calling a function without prototype may cause runtime errors if the function
does not return int or unsigned int
!W E:ICCprojectLCD1602+AD程序main.c(83):[warning] declaration of `LCD1602_Write_Command' does not match previous declaration at E:ICCprojectLCD1602+AD程序main.c(67)
!W E:ICCprojectLCD1602+AD程序main.c(125):[warning] calling a function without prototype may cause runtime errors if the function
does not return int or unsigned int
iccavr -o LCD1602 -g -e:0x4000 -ucrtatmega.o -bfunc_lit:0x54.0x4000 -dram_end:0x45f -bdata:0x60.0x45f -dhwstk_size:30 -beeprom:0.512 -fihx_coff -S2 @LCD1602.lk -lcatmega
Device 9% full.
Done. Wed Aug 31 20:45:56 2011
请大哥大姐指导下啊,这是什么问题
这是我的附件:
LCD1602+AD程序.rar
(129.48 KB, 下载次数: 26)
2011-8-31 20:51 上传
点击文件名下载附件
[
本帖最后由 guowj513 于 2011-8-31 20:51 编辑 ]
此帖出自
小平头技术问答
一周热门 更多>