查看: 556|回复: 1

[ATmega168] atmega168 Xplained mini 驱动1602

[复制链接]

7

主题

0

好友

439

积分

秀才

Rank: 3Rank: 3

  • TA的每日心情
    慵懒
    2014-7-28 10:46
  • 签到天数: 35 天

    [LV.5]常住居民I

    发表于 2014-5-31 13:00:23 |显示全部楼层
    额也许很简单  不过这个是我的学习过程  我想争取一直写  知道把avr单片机玩透彻0.0
    因为1602液晶曾经在51单片机上写过 这回呢 我只看资料 没有例程也没有其他的什么  就徒手去写这个程序
    虽然程序不是最精简 有效的  毕竟是一笔一笔写出来的很有感觉

    废话就不说开始进入正题!
    资料是用的之前学51郭天祥教程里的资料、
    1602液晶说明_长沙太阳人_lxy.pdf (246.31 KB, 下载次数: 0)
    然后根据资料链接查看

    在引脚上1602有3个功能引脚 分别是r/s , r/w , e
    r/s 是  数据/命令选择端  高电平为数据,低电平为命令
    r/w是 读/写选择端    高电平读,低电平写
    e是使能端  高电平有效

    简单的来说操作这个液晶并没有什么难度;很多人都会,写出来 1 是为给新手看,2 是自己的学习记录
    上程序吧  读写时序或者神马的都在文档里看看就知道了

    /*
    * GccApplication8.c
    *
    * Created: 2014/5/29 19:34:10
    *  Author: -Shadow-
    */


    #include <avr/io.h>

    // rs  数据/命令 1/0  PB0
    // r/w   读/写   1/0  PB1
    // E                  PB2

    void init_1602();
    void init_avr168();
    void delay_1ms();
    void delay_ms(unsigned int n);

    unsigned char read_mang();
    unsigned char read_data(unsigned char i);
    void write_Instruction(unsigned char i);
    void write_data(unsigned char i);

    unsigned char k1[]="I LOVE YOU";
    unsigned char k2[]="";

    int main(void)
    {
        while(1)
        {
            //TODO:: Please write your application code
                    unsigned char i;
                    init_avr168();
                    init_1602();
                    delay_ms(100);
                   
                    write_Instruction(0x80);
                    for(i=0;i<10;i++)
                    {
                            write_data(k1);
                            delay_ms(20);
                    }
                    while(1);
            }
    }

    void init_avr168()
    {
            DDRD = 0xff;
            DDRB = 0xff;
    }

    void init_1602()
    {
            PORTB = 0x00;
            write_Instruction(0x38);
            delay_1ms();
            write_Instruction(0x0e);
            delay_1ms();
            write_Instruction(0x06);
            delay_1ms();
            write_Instruction(0x01);
            delay_1ms();       
    }

    void delay_1ms()        //1ms延时函数
    {
            volatile unsigned int i;
            for(i=1;i<2000;i++);
    }

    void delay_ms(unsigned int n)         //延时函数
    {
            volatile unsigned int i;
            for(i=1;i<n;i++);
    }

    unsigned char read_mang()        //读状态 判忙
    {
            DDRD = 0x00;
            PORTB = 0x04;
            delay_1ms();
            return PIND;
    }

    void write_Instruction(unsigned char i)                //写指令
    {
            DDRD = 0xff;
            PORTD = i;
            PORTB = 0x00;
            delay_1ms();
            PORTB = 0x04;
            delay_1ms();
            PORTB = 0x00;       
    }

    void write_data(unsigned char i)         //写数据
    {
            DDRD = 0xff;
            PORTD = i;
            PORTB = 0x00;
            delay_1ms();
            PORTB = 0x05;
            delay_1ms();
            PORTB = 0x01;
    }
    IMG_20140531_122514.jpg

    IMG_20140531_122520.jpg

    IMG_20140531_122530.jpg

    IMG_20140531_122538.jpg

    额由于偏压的问题开始没有显示    没办法 就用之前的51上的电位器代替下0.0
    希望对新手能有点帮助!


    回复

    使用道具 举报

    7

    主题

    0

    好友

    439

    积分

    秀才

    Rank: 3Rank: 3

  • TA的每日心情
    慵懒
    2014-7-28 10:46
  • 签到天数: 35 天

    [LV.5]常住居民I

    发表于 2014-6-1 10:06:37 |显示全部楼层
    额额  貌似太基础了0.0  好吧  慢慢的 会上比较有分量的0.0  
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

    站长推荐上一条 /5 下一条


    手机版|爱板网 |网站地图  

    GMT+8, 2016-12-10 22:40 , Processed in 0.126578 second(s), 11 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部