关于atmega16 最小系统驱动1602

用ATmega16驱动的LCD2004的源程序(avr)
> 用ATmega16驱动的LCD2004的源程序(avr)
用ATmega16驱动的LCD2004的源程序(avr)
/*==============================================20x4字符液晶主程序,编译软件(ICCAVR_6.31)CPU内部晶振8M数据线B0~B7接PORTB, E=D7 RW=D6 RS=D5===========================================接线图如下:_______________ ______________| --1|GND || --2| 5V || --3|V0 || | |PD5|--------4|RS |PD6|--------5|RW |PD7|--------6|E |CPU | | |ATmmega16L PB0|--------7|D0 LCD20x4 |PB1|--------8|D1 |PB2|--------9|D2 |PB3|-------10|D3 |PB4|-------11|D4 |PB5|-------12|D5 |PB6|-------13|D6 |PB7|-------14|D7 || | || --15| LED || --16|-LED |_______________| |______________|========================================================*/#includeioM16V.h& //CPU_ATmmega16L#define RS_H asm("sbi 0x12,5") //RS设为高电平#define RS_L asm("cbi 0x12,5") //RS设为低电平#define RW_H asm("sbi 0x12,6") //RW设为高电平#define RW_L asm("cbi 0x12,6") //RW设为低电平#define E_H asm("sbi 0x12,7") //E设为高电平#define E_L asm("cbi 0x12,7") //E设为低电平 //=======================================================//微秒级延时程序void delay_us(int time){do{time--;} while (time & 1);}//=======================================================//毫秒级延时程序void delay_ms(unsigned int time){while(time != 0){ delay_us(1000);time--;}}//=======================================================//读取lcd是否内部操作(忙碌)状态char Lcd_Busy(){DDRB = 0x00; //端口B设为输入方式E_L;RS_L;RW_H; //E=0(致能),RS=0(命令),RW=1(读)delay_us(2); //液晶延时子程序E_H;delay_us(2); //液晶延时子程序r = PINB
0x80; //读取lcd_data第八位E_L;DDRB=0 //端口B设为输出方式 //读取结果返回}//=======================================================//向Lcd发送命令程序void Lcd_Command(unsigned char Command){while(Lcd_Busy()); //判断lcd是否内部操作状态E_L;RS_L;RW_L; //E=0(致能),RS=0(命令),RW=0(写)delay_us(2); //液晶延时子程序E_H;PORTB = C //向Lcd发送命令delay_us(2); //液晶延时子程序E_L;}//=======================================================//向lcd写入一个字符程序void Lcd_Write(unsigned char Data){while(Lcd_Busy()); //判断lcd是否内部操作状态E_L;RS_H;RW_L; //E=0(致能),RS=1(数据),RW=0(写)delay_us(2); //液晶延时子程序E_H;PORTB = D //向lcd写入一个字符delay_us(2); //液晶延时子程序E_L;}/*=======================================================LCD第1行显示地址1~20(0x80~0x93)LCD第2行显示地址1~20(0xc0~0xd3)LCD第3行显示地址1~20(0x94~0xa7)LCD第4行显示地址1~20(0xd4~0xe7)=======================================================*///初始化LCD_8位接口,4行x20字符的工作方式void Lcd_Init(){DDRB = 0 //端口B设为输出方式DDRD = 0 //端口D设为输出方式Lcd_Command(0x38); //Lcd_Command(0x38); //Lcd_Command(0x38); //Lcd_Command(0x38); //Lcd_Command(0x08); //令显示器offLcd_Command(0x01); //清除显示器Lcd_Command(0x06); //令LCD每接收到1Byte数据后,AC自动加1Lcd_Command(0x0C); //令光标,0x0c=不显示,0x0d=显示闪动. }//=======================================================//写ASCII字符串程序void asc_tran(unsigned char *asc){while((*asc) != 0) //判断字是否结束{Lcd_Write(*asc); //向lcd写入字符串 //移下一个字符}}//=======================================================//测试主LCD主程序void main(){Lcd_Init(); //初始化LCDwhile(1){Lcd_Command(0x83); //设置显示位址asc_tran("-----@_@------"); //显示字符串Lcd_Command(0x97); //设置显示位址asc_tran(""); //显示字符串delay_ms(1000); //延迟1秒Lcd_Command(0x01); //清除显示器Lcd_Command(0x83); //设置显示位址asc_tran("-----^_^------"); //显示字符串Lcd_Command(0x94); //设置显示位址asc_tran("http://59.36.96.196"); //显示字符串delay_ms(1000); //延迟Lcd_Command(0x01); //清除显示器}}
led显示器相关文章:
晶振相关文章:
分享给小伙伴们:
我来说两句……
最新技术贴
微信公众号二
微信公众号一ATMEGA16 驱动1602 LCD程序
ATMEGA16 驱动1602 LCD程序
发布: | 作者:-- | 来源: -- | 查看:451次 | 用户关注:
下面表格是16*2 LCD液晶与 单片机 的硬件接法:
接电源,+5V
反视度调整,接地吧
寄存器选择,1-资料、0-指令
读写选择,1-读、0-写,如果LCD函数没有用到这个IO口的话就把它接地
信号使能,E由 1 -& 0 的下降沿时,LCD对
下面表格是16*2 LCD液晶与 单片机 的硬件接法:
接电源,+5V
反视度调整,接地吧
寄存器选择,1-资料、0-指令
读写选择,1-读、0-写,如果LCD函数没有用到这个IO口的话就把它接地
信号使能,E由 1 -& 0 的下降沿时,LCD对RS和DATA进行取样和执行操作
接 单片机 IO口
接 单片机 IO口
接 单片机 IO口
接 单片机 IO口
//&04:lcd_init()&&&&&&&&&&&&//LCD初始化函数 //&05:lcd_DICtate(byte)&&&&&//写指令的函数 //&07:lcd_gotoxy(x,y)&&&&&&&//列行定位函数 //&06:lcd_putchar(byte)&&&&&//以ASCII方式显示一个字节变量 //&08:lcd_hex(byte)&&&&&&&&&//以十六进制显示一个字节变量 //&09:lcd_byte(byte)&&&&&&&&//以十进制显示一个字节变量 //&10:lcd_putsf(地址,&个数)&//显示FLASH里面的字符串
#include &mega48.h& #include &delay.h& #include &1602lcd.h& && unsigned char flash string[]="M8V20"; void main(void) {&& && & lcd_init();&&&&&&&&&&&&&&&&&&&&&&&& //1602LCD初始化函数& & lcd_dICtate(1);&&&&&&&&&&&&&&&&&&&& //LCD清屏指令是(1) & while (1) &&&&&&& {&& &&&&&&&&& byte++; &&&&&&&&& lcd_gotoxy(4,0);&&&&&&&&&&&& //光标定位到第4列第0行&&&&&&&&& &&&&&&&&& lcd_byte(byte);&&&&&&&&&&&&& //以十进制的方式显示键值(字节形)& &&&&&&&&& lcd_putchar('=');&&&&&&&&&&& //显示 = 字符 &&&&&&&&& lcd_putchar(48);&&&&&&&&&&&& //显示数字0 ,数字0的ASCII值是48 &&&&&&&&& lcd_putchar('x');&&&&&&&&&&& //显示 x 字符 &&&&&&&&& lcd_hex(byte);&&&&&&&&&&&&&& //以十六进制的方式显示键值(字节型)&&&&&&&&&&&& &&&&&&&&& lcd_gotoxy(2,1);&&&&&&&&&&&& //定位到第2列第1行&&&&&&&&& &&&&&&&&& lcd_putsf(string,5);&&&&&&&& //显示FLASH里面的字符串&& &&&&&&&&& lcd_putsf("-AVRDIY",7);&&&&& //显示FLASH里面的字符串 &&&&&&&&& delay_ms(500); &&&&&&& } }
/*下面是&1602LCD.h&文件内容
在使用LCD之前先了解一下4位数据线传输的原理1:LCD在E由 1-&0 时对RS和DB4-DB7进行取样和执行操作 2:RS=0 时表示"准备"写指令,RS=1 时表示"准备"写显示的数据 3:不管是指令数据还是显示数据,数据位都是8位,由于LCD用的是4个数据线,所以在传输时先传输数据的高4位(Msb),然后再传输数据的低4位(Lsb) 比如说我们要写一个指令,指令是0b ( 高4位是1100,低4位是1000 )& 那么就要这样: 先传输高4位& |& 接着传输低4位 && E=1 ;&&&& |&&& E=1 ; && RS=0 ;&&& |&&& RS=0 ; && DB7=1;&&& |&&& DB7=1; && DB6=1;&&& |&&& DB6=0; && DB5=0;&&& |&&& DB5=0; && DB4=0;&&& |&&& DB4=0; && E=0;&&&&& |&&& E=0; 这样,我们就完成了写一个指令了,相反,写显示数据时就是把RS=1就可以了 对LCD的写操作只有写指令和写显示数据两种,所以,一个"写指令函数"和一个"写显示数据函数"就可以满足全部要求 */&& #ifndef _1602lcd_INCLUDED_&&&&&&&&&&&& //如果原来没有宏定义本名字就... #define _1602lcd_INCLUDED_&&&&&&&&&&&& //定义一下,防止多次被头文件包含 #include &delay.h&&&&&&&&&&&&&&&&&&&&& //本例使用7线连接(也可以使用6线,但是没有读"忙"功能,不推荐) #define RS&&&&&&& PORTB.4&&&&&&&&&&&&& //请修改LCD与 单片机 的连接IO口 #define RS_DDRn&&& DDRB.4&
#define RW&&&&&&& PORTB.5& #define RW_DDRn&&& DDRB.5&&&&&&
#define E&&&&&&&& PORTB.2 #define E_DDRn&&&& DDRB.2&&
#define DB4&&&&&& PORTC.4 #define DB4_DDRn&& DDRC.4&&
#define DB5&&&&&& PORTC.5 #define DB5_DDRn&& DDRC.5
#define DB6&&&&&& PORTC.6 #define DB6_DDRn&& DDRC.6&
#define DB7&&&&&& PORTC.7& #define DB7_DDRn&& DDRC.7 #define DB7_PINn&& PINC.7&
//====================================================================================== //写LCD //datas是数据,高4位有效,rs决定datas是显示还是指令,read_lcd决定是否需要读取忙标志BF void lcd_h(unsigned char datas,unsigned char rs,unsigned char read_lcd) {&& & RS_DDRn =1;&&&&&&&&&&&&&&&&&&&&&&&& //RS/RW/E设置为输出 & RW_DDRn =1; & E_DDRn& =1;&& & if(read_lcd)&&&&&&&&&&&&&&&&&&&&&&& //如果需要读LCD忙标志就... &&& {&&&&&&& &&&&& DB4_DDRn=0;&&&&&&&&&&&&&&&&&&&& //先把4个数据口设置为输入 &&&&& DB5_DDRn=0; &&&&& DB6_DDRn=0; &&&&& DB7_DDRn=0; &&&&& RS=0;& &&&&& RW=1;&&&&&&&&&&&&&&&&&&&&&&&&&& //读BF &&&&& E=1; &&&&& E=1;&&&&&&&&&&&&&&&&&&&&&&&&&&& //相同的操作相当于等待几个时钟周期 &&&&& E=1; &&&&& while(DB7_PINn);&&&&&&&&&&&&&&& //等待,直到DB7=0& &&& } & RS=&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //写指令或者数据 & RW=0;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //写& & DB4_DDRn=1; & DB5_DDRn=1; & DB6_DDRn=1; & DB7_DDRn=1;& & E=1;&&& & if(datas&128) DB7=1; else DB7=0;& if(datas&64)& DB6=1; else DB6=0;& if(datas&32)& DB5=1; else DB5=0;& if(datas&16)& DB4=1; else DB4=0;& E=0;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //LCD在E下降沿时对RS与DB4-DB7进行取样 }& //================================================================================== void lcd_dictate(unsigned char data)& //写指令函数 {& & lcd_h(data,0,1);&&&&&&&&&&&&&&&&&&& //输出高4位& & lcd_h(data*16,0,1);&&&&&&&&&&&&&&&& //输出低4位 }& //=================================================================================== void lcd_putchar(unsigned char data)& //写显示函数 {&& & lcd_h(data,1,1);&&&&&&&&&&&&&&&&&&& //输出高4位& & lcd_h(data*16,1,1);&&&&&&&&&&&&&&&& //输出低4位 }& //==================================================================================== //初始化函数 void lcd_init(void) {&&& & delay_ms(20); & lcd_h(48,0,0); delay_ms(6);&&&&&&&& //这3条是初始化语句 & lcd_h(48,0,0); delay_ms(5);& & lcd_h(48,0,0);&&&&&&&&&&&&&& & lcd_h(32,0,1);&&&&&&&&&&&&&&&&&&&&& //使能4位数据线 & lcd_dictate(40);&&&&&&&&&&&&&&&&&&& //显示参数设定 & lcd_dictate(12);&&&&&&&&&&&&&&&&&&& //显示参数设定 }& & //====================================================================================== //列/行定位函数,最开头的地址是0列0行 void lcd_gotoxy(unsigned char x, unsigned char y)& //列/行定位函数 {&&&&&& & if(x&=19 && y&=3)&&&&&&&&&&&&&&&&&&& //防止输入的数据不正确 &&& {&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&& if(y==0) lcd_dictate(x+128);&&&& //第0行的地址是从128开始 &&&&& if(y==1) lcd_dictate(x+192);&&&& //第1行...... &&&&& if(y==2) lcd_dictate(x+148); &&&&& if(y==3) lcd_dictate(x+212); &&& } }&&&&& //===================================================================================== void lcd_hex(unsigned char byte_data)&&&&&&&&&&&&&&& //以十六进制显示一个字节变量 { & unsigned char temp_& && & temp_data=byte_data&&4;&&&&&&&&&&&&&&&&&&&&&&&&&&&& //求高4位 & if(temp_data&10) temp_data+=48; else temp_data+=55; //转化为ASCII值 & lcd_putchar(temp_data);&&&&&&&&&&&&&&&&&&&&&&&&&&&& //显示 && & temp_data=byte_data&15;&&&&&&&&&&&&&&&&&&&&&&&&&&&& //求低4位 & if(temp_data&10) temp_data+=48; else temp_data+=55; //转化为ASCII值 & lcd_putchar(temp_data);&&&&&&&&&&&&&&&&&&&&&&&&&&&& //显示 }&& //===================================================================================== void lcd_byte(unsigned char byte_data)&&&&&&&&&&&&&&& //以十进制显示一个字节变量 { & unsigned char temp_& && & temp_data=byte_data/100;&&&&&&&&&&&&&&&&&&&&&&&&&&& //求百位数 & lcd_putchar(temp_data+48);&&&&&&&&&&&&&&&&&&&&&&&&& //转化为ASCII值再显示 && & temp_data=byte_data/10%10;&&&&&&&&&&&&&&&&&&&&&&&&& //求十位数 & lcd_putchar(temp_data+48);&&&&&&&&&&&&&&&&&&&&&&&&& //转化为ASCII值再显示 && & temp_data=byte_data%10;&&&&&&&&&&&&&&&&&&&&&&&&&&&& //求个位数 & lcd_putchar(temp_data+48);&&&&&&&&&&&&&&&&&&&&&&&&& //转化为ASCII再再显示 }&& //===================================================================================== void lcd_putsf(flash unsigned char *string , unsigned char n) //显示FLASH里面的字符串 {&&&&&&&& & unsigned char i=0; & while(i&n) &&&&&& {&& &&&&&&&& lcd_putchar( string[ i ] ) ;&&&&&&&&&&&&&&&& //顺序显示字符 &&&&&&&& i++;&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&& } }& //===================================================================================== #endif//
本页面信息由华强电子网用户提供,如果涉嫌侵权,请与我们客服联系,我们核实后将及时处理。
&&& 目前,处理器性能的主要衡量指标是时钟频率。绝大多数的集成电路 (IC) 设计都基于同21ic官方微信-->
后使用快捷导航没有帐号?
查看: 2311|回复: 8
atmega16断电后再上电1602液晶无显示
&&已结帖(20)
主题帖子积分
中级技术员, 积分 108, 距离下一级还需 192 积分
中级技术员, 积分 108, 距离下一级还需 192 积分
主题帖子积分
专家等级:结帖率:86%
主题帖子积分
中级技术员, 积分 108, 距离下一级还需 192 积分
中级技术员, 积分 108, 距离下一级还需 192 积分
本帖最后由 zage2009 于
12:36 编辑
写了个操作1602显示字符的程序,烧写后运行正常,不过断电后,再上电,1602就无显示内容,需要按一下复位键后,液晶才显示,请问哪里没有设置好?程序如下#include&avr/io.h&
#define uchar unsigned char
#define uint unsigned int
void delay(uint z)
{
& && &&&uint i,j;
& && &&&for(i=z;i&0;i--)
& && && && && & for(j=1140;j&0;j--);
}
void write_com(uchar com)
{
& && &&&PORTA&=~(1&&4);//lcdrs=0;
& && &&&PORTB=
& && &&&delay(5);
& && &&&PORTA|=(1&&6);//lcden=1
& && &&&delay(5);
& && &&&PORTA&=~(1&&6);//lcden=0;
}
void write_data(uchar data)
{
& && &&&PORTA|=(1&&4);//lcdrs=1;
& && &&&PORTB=
& && &&&delay(5);
& && &&&PORTA|=(1&&6);//lcden=1;
& && &&&delay(5);
& && &&&PORTA&=~(1&&6);//lcden=0;
}
void init(void)
{
& && &&&DDRA=0
& && &&&DDRB=0
& && &&&PORTA&=~(1&&5);//lcdwr=0;
& && &&&PORTA&=~(1&&6);//& && &&&lcden=0;
& && &&&write_com(0x38);
& && &&&write_com(0x0e);
& && &&&write_com(0x06);
& && &&&write_com(0x01);
& && &&&write_com(0x80);
}
int main(void)
{
& && &&&
& && &&&const&&char * p=&I like mcu&;& && &&&
& && &&&init();
& && &&&while(1)
& && &&&{
& && && && && & while(*p)
& && && && && & {
& && && && && && && && &write_data(*p);
& && && && && && && && &delay(30);
& && && && && && && && &p++;
& && && && && & }& && &&&
& && &&&}& && &&&
}
复制代码
满意回复+20
PORTA&=~(1
主题帖子积分
中级技术员, 积分 255, 距离下一级还需 45 积分
中级技术员, 积分 255, 距离下一级还需 45 积分
主题帖子积分
专家等级:结帖率:33%
主题帖子积分
中级技术员, 积分 255, 距离下一级还需 45 积分
中级技术员, 积分 255, 距离下一级还需 45 积分
在& &PORTA&=~(1&&6);//lcden=0; 后延时 5ms试试。。
主题帖子积分
中级技术员, 积分 108, 距离下一级还需 192 积分
中级技术员, 积分 108, 距离下一级还需 192 积分
主题帖子积分
专家等级:结帖率:86%
主题帖子积分
中级技术员, 积分 108, 距离下一级还需 192 积分
中级技术员, 积分 108, 距离下一级还需 192 积分
selfstudy 改了以后,可以了,看来还是液晶的时序问题。
主题帖子积分
高级工程师, 积分 6837, 距离下一级还需 1163 积分
高级工程师, 积分 6837, 距离下一级还需 1163 积分
主题帖子积分
专家等级:结帖率:51%
主题帖子积分
高级工程师, 积分 6837, 距离下一级还需 1163 积分
高级工程师, 积分 6837, 距离下一级还需 1163 积分
为什么 加延时呢
主题帖子积分
高级技术员, 积分 588, 距离下一级还需 412 积分
高级技术员, 积分 588, 距离下一级还需 412 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
高级技术员, 积分 588, 距离下一级还需 412 积分
高级技术员, 积分 588, 距离下一级还需 412 积分
液晶小知识
RST脚,复位脚。
一般上电后,先拉低300MS,再拉高300MS,然后再一直保持高电平进行初始化。
这是标准的液晶复位流程。
如果没有复位脚,也建议客户上电后延时500MS再初始化。
我是做液晶的
主题帖子积分
中级技术员, 积分 108, 距离下一级还需 192 积分
中级技术员, 积分 108, 距离下一级还需 192 积分
主题帖子积分
专家等级:结帖率:86%
主题帖子积分
中级技术员, 积分 108, 距离下一级还需 192 积分
中级技术员, 积分 108, 距离下一级还需 192 积分
很对,只有在初始化之前延时一段时间,实验板上电后液晶才有显示,我只是延时了五六十毫秒也可以显示。
主题帖子积分
中级技术员, 积分 108, 距离下一级还需 192 积分
中级技术员, 积分 108, 距离下一级还需 192 积分
主题帖子积分
专家等级:结帖率:86%
主题帖子积分
中级技术员, 积分 108, 距离下一级还需 192 积分
中级技术员, 积分 108, 距离下一级还需 192 积分
RE: atmega16断电后再上电1602液晶无显示
液晶小知识
RST脚,复位脚。
一般上电后,先拉低300MS,再拉高300MS,然后再一直保持高电平进行初始化。
这是标准的液晶复位流程。
如果没有复位脚,也建议客户上电后延时500MS再初始化。
我是做液晶的
joing1999 发表于
最近在万用板上焊了最小系统,只引出了32个IO(atmega16),又碰到这个问题了。发现确实只有在液晶初始化函数之前延时500ms左右,才能使1602液晶断电后再上电能够显示出数据。在写命令和写数据的PORTA&=~(1&&6);//lcden=0;只延时5ms没有用。
主题帖子积分
实习生, 积分 3, 距离下一级还需 47 积分
实习生, 积分 3, 距离下一级还需 47 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 3, 距离下一级还需 47 积分
实习生, 积分 3, 距离下一级还需 47 积分
恩,我也哟那样的情况
主题帖子积分
主题帖子积分
专家等级:结帖率:8%
主题帖子积分
注意看datasheet的时序
勿在浮沙筑高台。
广州电子工程师朋友交流群,电子行业相关朋友交流技术,畅谈未来,活动聚会交友群。广州电子技术交流
技术高手奖章
人才类勋章
时间类勋章
无冕之王奖章
等级类勋章
技术奇才奖章
人才类勋章
时间类勋章
沉静之湖泊
发帖类勋章
涓涓之细流
发帖类勋章
时间类勋章
技术新星奖章
人才类勋章
核心会员奖章
等级类勋章
坚毅之洋流
发帖类勋章
时间类勋章
技术导师奖章
人才类勋章
热门推荐 /4后使用快捷导航没有帐号?
查看: 1400|回复: 4
1602液晶显示与PWM生成冲突问题
在线时间50 小时
芯币248 枚
TA的帖子TA的资源
一粒金砂(中级), 积分 38, 距离下一级还需 162 积分
一粒金砂(中级), 积分 38, 距离下一级还需 162 积分
最近我在写一个程序,T1两路输出比较口生成PWM波,两路外部中断输入分别是对应PWM波电压升高,第三路外部中断输入为同时减小两路PWM波电压,另外我还加了一块1602液晶显示数据,数据端口为PA口,控制端口为PC4,5,6口。所有子程序均是正确的,因为我以前都成功使用过。现在的问题是如果我删掉下面主程序注释的几行,则脉宽生成与控制能够正常执行,一旦加上后不但液晶屏不亮,而且脉宽生成与控制也不能够正常工作。我曾考虑过JTAGEN熔丝位,烧为1或0都试过。请问哪位高手能解决这个问题?是程序构架问题还是哪个细节没有注意到?
//======================================
const uchar str0[]={&-L_Revo: ,& &rm-&};
const uchar str1[]={&-R_Revo: ,& &rm-&};
//========函数声明=========
void ePutstr(uchar x,uchar y,uchar const *ptr);
void LocateXY(char posx,char posy);
void DisplayOneChar(uchar x,uchar y,uchar Wdata);
void InitLcd(void);
void LcdWriteCommand(uchar CMD,uchar Attribc);
void LcdWriteData(uchar W);
void WaitForEnable(void);
void init_devices(void);
void port_init(void);
void timer1_init(void);
void timer0_init(void);
//void adc_init(void);
void delay_ms(unsigned int time);
void delay_us(int time);
/*********************************************/
//**********************显示指定座标的一串字符子函数**************
void ePutstr(uchar x,uchar y,uchar const *ptr)
uchar i,l=0;
& & & & while(ptr[l]&31){l++;}
& & & & for(i=0;i&l;i++){
& & & & DisplayOneChar(x++,y,ptr);
& & & & if(x==16){
& & & & & & & & x=0;y^=1;
/*********************************************/
void init_devices(void)
port_init();
//adc_init();
timer0_init();& & & & & & & & & & & &
timer1_init();
TIMSK = 0x01;
MCUCR =0x00;
MCUCSR=0X40;
GICR&&= 0x00;
ACSR=0x80;&&
SREG=0x80;
/******************端口初始化**********************/
void port_init(void)
PORTA = 0xFF;//初始化输出
DDRA&&= 0xFF;//PA为输出
PORTB = 0xFF;//PB2必须为高
DDRB&&= 0x0F; //PB0,1,2,3输入其他为输出
PORTC = 0xFF; //初始化输出
DDRC&&= 0xFF; //PC全部设为输出
PORTD = 0xFF;& & & & //PD2,3必须为高
DDRD&&= 0xB3;//PD2,3,6输入其他为输出
//***************************
void timer1_init(void)& & & & & & & &
TCCR1A = 0xA3;& & & &
TCCR1B = 0xC2;
//***************************
void timer0_init(void)
{& & & & & & & & & & & & & & & & & & & & & & & & & & & &
TCNT0 = 0x83; & & & &
TCCR0 = 0x03; & & & &
}& & & & & & & & & & & & & & & &
//**************T/C0中断服务子函数*************
#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)& & & &
{& & & & & & & & & & & & & & & & & & & & & & & & & & & &
TCNT0 = 0x83;
if(++key_cnt&100)key_cnt=0;
if(key_cnt==0)& & & &
if(SINT0==0){if(Wide1&1023)Wide1=Wide1+15;}
if(SINT1==0){if(Wide2&1023)Wide2=Wide2+15;}
if(SINT2==0){if(Wide1&0)Wide1=Wide1-15;}
if(SINT2==0){if(Wide2&0)Wide2=Wide2-15;}
/****************************************************/
//***************************
void main(void)& & & & & & & & & & & & & & & &
& & & & init_devices();
& & & & & & delay_ms(2);
& & & & InitLcd();//LCD初始化
& & & & LcdWriteCommand(0x01,1); //清屏
& & & & LcdWriteCommand(0x0c,1); //显示开
& & & & ePutstr(0,0,str0);&&//字符串一
& & & & delay_ms(2);
& & & & ePutstr(0,1,str1);&&//显示字符串二
& & & & delay_ms(2);
& & & & /********************************************/
& & & & /********************************************/
& & & & & & & & while(1)& && && && &
& & & & & & & & {
& & & & & & & & OCR1AH=(uchar)(Wide1&&8);
& & & && &&&OCR1AL=(uchar)(Wide1&0x00ff);
& & & & & & & & OCR1BH=(uchar)(Wide2&&8);
& & & && &&&OCR1BL=(uchar)(Wide2&0x00ff); }
主程序你哪一行注释了&
在线时间471 小时
威望748 分
芯币737 枚
TA的帖子TA的资源
纯净的硅(初级), 积分 748, 距离下一级还需 52 积分
纯净的硅(初级), 积分 748, 距离下一级还需 52 积分
回复 楼主落日归侠 的帖子
主程序你哪一行注释了
InitLcd();//LCD初始化
LcdWriteCommand(0x01,1); //清屏
LcdWriteCommand(0x0c,1); //显示开
ePutstr(0,0,str0);
//字符串一
delay_ms(2);
ePutstr(0,1,str1);
在线时间50 小时
芯币248 枚
TA的帖子TA的资源
一粒金砂(中级), 积分 38, 距离下一级还需 162 积分
一粒金砂(中级), 积分 38, 距离下一级还需 162 积分
InitLcd();//LCD初始化
& && &&&LcdWriteCommand(0x01,1); //清屏
& && &&&LcdWriteCommand(0x0c,1); //显示开
& && &&&ePutstr(0,0,str0);&&//字符串一
& && &&&delay_ms(2);
& && &&&ePutstr(0,1,str1);&&//显示字符串二
就是这几行
在线时间50 小时
芯币248 枚
TA的帖子TA的资源
一粒金砂(中级), 积分 38, 距离下一级还需 162 积分
一粒金砂(中级), 积分 38, 距离下一级还需 162 积分
回复 沙发wudayongnb 的帖子
InitLcd();//LCD初始化
& && &&&LcdWriteCommand(0x01,1); //清屏
& && &&&LcdWriteCommand(0x0c,1); //显示开
& && &&&ePutstr(0,0,str0);&&//字符串一
& && &&&delay_ms(2);
& && &&&ePutstr(0,1,str1);&&//显示字符串二
就是这几行
这个可能是你LCD 的驱动程序有问题&
在线时间471 小时
威望748 分
芯币737 枚
TA的帖子TA的资源
纯净的硅(初级), 积分 748, 距离下一级还需 52 积分
纯净的硅(初级), 积分 748, 距离下一级还需 52 积分
回复 4楼落日归侠 的帖子
这个可能是你LCD 的驱动程序有问题
Powered by
逛了这许久,何不进去瞧瞧?

我要回帖

 

随机推荐