配置:
ATMega16L @3.3V @7.3728MHz
1602B LCD @5.0V @6 lines
Compiler: WinAVR 20060125
我自己搭的万用板,1602用5V供电,M16用3.3V供电。为了使LCD尽快投入运转,同时也因为懒惰 ... 便参考了网站上很多的1602的帖子,包括网站收集帖,程序下载后稍加修改,编译通过,下载到M16中,总是没有反应。
在这个过程中,我确信我的1602硬件是没有问题的,因为我手头上有个以前用51做的时间温度计(1602+18B20),放到上面都能正常显示。
整个过程中,感觉不管是网站收集的精华帖,还是普通帖子里面的1602程序,冗长繁杂 ... 比如我在一个帖子中,看到的一个1602的初始化函数,居然用了10几行代码!我在51中,不过也就4句而已啊 ...
后来,遇到了下面的程序,简明扼要,一次成功。当然,这也是从论坛中COPY的,我做了一些修改:
#include
#define LCD_EN_PORT PORTC
#define LCD_RW_PORT PORTC
#define LCD_RS_PORT PORTC
#define LCD_DATA_PORT PORTA
#define LCD_DATA_DDR DDRA
#define LCD_DATA_PIN PINA
//LCD的 r/w 脚直接接 GND
#define LCD_EN 0x80 //portd7 out
#define LCD_RS 0x40 //portc6 out
#define LCD_DATA 0xF0 //porta 4/5/6/7 out
/*--------------------------------------------------------------------------------------------------
PublIC function prototypes
--------------------------------------------------------------------------------------------------*/
void LCD_init (void);
void LCD_en_write (void);
void LCD_write_char (unsigned command,unsigned data);
void LCD_set_xy (unsigned char x, unsigned char y);
void LCD_write_string (unsigned char X,unsigned char Y,unsigned char *s);
void delay_nus (unsigned int n);
void delay_nms (unsigned int n);
void LCD_init(void) //液晶初始化
{
delay_nms(15);
DDRA |= LCD_DATA; // 数据为输出
DDRC |= LCD_RS | LCD_EN; //置位RS.EN
LCD_write_char(0x28,0); //4位显示
LCD_write_char(0x0c,0); //显示开
LCD_write_char(0x01,0); //清屏
delay_nms(60);
}
void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)
{
LCD_set_xy( X, Y ); //写地址
while (*s) {
LCD_write_char( 0, *s );
s ++;
}
}
void LCD_set_xy( unsigned char x, unsigned char y ) //写地址函数
{
unsigned char address;
if (y == 0)
address = 0x80 + x;
else
address = 0xc0 + x;
LCD_write_char(address, 0 );
}
void LCD_en_write(void) //液晶使能
{
LCD_EN_PORT |= LCD_EN;
delay_nus(1);
LCD_EN_PORT &= ~LCD_EN;
}
void LCD_write_char(unsigned command,unsigned data) // 写数据
{
unsigned command_temp,data_temp;
command_temp = command;
data_temp = data;
delay_nus(16);
if(command == 0) {
LCD_RS_PORT |= LCD_RS; //RS=1
LCD_DATA_PORT &= 0X0f;
LCD_DATA_PORT |= data_temp & 0xf0; //写高四位
LCD_en_write();
data_temp = data_temp << 4;
LCD_DATA_PORT &= 0X0f;
LCD_DATA_PORT |= data_temp & 0xF0; //写低四位
LCD_en_write();
}
else {
LCD_RS_PORT &= ~LCD_RS; //RS=0
LCD_DATA_PORT &= 0X0f;
LCD_DATA_PORT |= command_temp & 0xF0; //写高四位
LCD_en_write();
command_temp = command_temp << 4;
LCD_DATA_PORT &= 0x0F;
LCD_DATA_PORT |= command_temp & 0xF0; //写低四位
LCD_en_write();
}
}
int main(void)
{
LCD_init();
LCD_write_string(0,0,"Hello,AVR WORLD!!!");
LCD_write_string(0,1,"hitro@tom.com");
while(1);
}
/*-----------------------------------------------------------------------
延时函数
系统时钟:8M
-----------------------------------------------------------------------*/
void delay_1us(void) //1us延时函数
{
asm("nop");
}
void delay_nus(unsigned int n) //N us延时函数
{
unsigned int i=0;
for (i=0;i
}
void delay_1ms(void) //1ms延时函数
{
unsigned int i;
for (i=0;i<1356;i++);
}
void delay_nms(unsigned int n) //N ms延时函数
{
unsigned int i=0;
for (i=0;i
}
上一篇:用89S51制作简易并行编程器ATmega16
下一篇:AVR并口ISP下载器
推荐阅读最新更新时间:2024-03-16 15:50
设计资源 培训 开发板 精华推荐
- 南芯SC8905 评估板免费测评,支持充放电双向操作
- 创通联达高通 IOT 平台解决方案及成功案例|报名直播赢【蓝牙耳机、音箱、京东卡】等好礼
- “泰”想开车智能篇(下):新一代智能汽车智能化
- 有奖直播|围观 普源 全新中国“芯”示波器
- EEWorld邀你来拆解(第10期)——玩具总动员
- 任选下载有礼| ADI 【锂电池解决方案、参考电路合集】
- 全球首款Cortex-M23内核物联网芯片SAML10和SAM L11系列 闯关获取SAML10/SAML11法宝,拆除电子界安全危机,赢好礼!
- 免费申请评测:欧时电子(RS Components)树莓派3来袭,待你玩耍带你飞
- 意法半导体工业峰会2023 直播结束