KS0108_AVR驱动[0617]

2019-12-04来源: eefocus关键字:KS0108  AVR驱动  IAR

前几天,一直在玩这个,

因为RAM读时序的问题,因为proteus仿真的问题...

本来简单的东西也会被拖很久的。。。

这里仅列出代码,注释什么的有时间再不上吧。

开发平台为IAR EWAVR 5.20(编译/硬件调试) + SlickEdit(编辑) + Proteus(软件仿真),但是为了尽量保证可一直性,并没有使用IAR特有的位操作的形式,只需稍加改动,即可移植到winavr或iccavr上,

另外proteus请不要使用忙位检测,不要使用超过4mhz的时钟,高版本可选内部4mhz的时钟
这些感觉是proteus的问题,就像1602也是不能检测忙位一样,不是我程序的问题!

示例中的main函数实现了隔点画点的功能,仅此而已。

但对于这款芯片来说最重要的其实就是画点了!


/*

    AVR KS0108 DRIVERLIB

*/


/*

    Definition of the PORTS

*/

 

#include

#include

#include "jlib.h"

#define    KS0108_PORT_DATA    PORTB

#define KS0108_PORT_CONTROL    PORTC

#define    KS0108_DDR_DATA        DDRB

#define KS0108_DDR_CONTROL    DDRC

#define KS0108_PIN_DATA        PINB

#define KS0108_PIN_CONTROL    PINC

/*

    Definition of the PORTS for Bit Operation

*/

#define KS0108_RS        0

#define KS0108_RW        1

#define KS0108_CS1        2

#define KS0108_CS2        3

#define KS0108_ENABLE    4

#define KS0108_RESET    5

/*


*/

#define KS0108_CMD_ON        0x3F

#define KS0108_CMD_OFF        0x3E

#define KS0108_ROW_BASE        0xC0

#define KS0108_COLUMN_BASE    0x40

#define KS0108_PAGE_BASE    0xB8


#define KS0108_STATE_BUSY        7

#define KS0108_STATE_SHOW        5

#define KS0108_STATE_RESET        4




void ks0108_init(void);

unsigned char ks0108_get_state(void);            //得到LCD状态字

unsigned char ks0108_busy_test(void);

void ks0108_exec_cmd(unsigned char command);        //发送命令字

void ks0108_on(void);                //打开LCD

void ks0108_off(void);

void ks0108_set_row(unsigned char);

void ks0108_set_page(unsigned char);

void ks0108_set_column(unsigned char);

void ks0108_write_data(unsigned char,unsigned char);

unsigned char ks0108_read_data(unsigned char);

void ks0108_draw_point(unsigned char ,unsigned char );


int main(void)

{

    int i,j; 

    ks0108_init();

    ks0108_on();


    j=0;

   for(i=0;i<128;i++)

   {

       for(;j<64;j+=2)

       ks0108_draw_point(i,j);

       if(j==64)

       j=1;

       else

       j=0;

   }

 


    return 0;

}

void ks0108_init()

{

    KS0108_DDR_CONTROL=0xFF;

    KS0108_DDR_DATA=0xFF;

    KS0108_PORT_DATA=0xFF;

    j_clrbit(KS0108_PORT_CONTROL,KS0108_RESET);

    //j_us(2);

    KS0108_PORT_CONTROL=0xFF;

}


unsigned char ks0108_get_state()

{

    //

    unsigned char data=0;

    KS0108_DDR_DATA=0;

    KS0108_PORT_DATA=0xFF;


    j_clrbit(KS0108_PORT_CONTROL,KS0108_ENABLE);

    j_setbit(KS0108_PORT_CONTROL,KS0108_RW);

    j_clrbit3(KS0108_PORT_CONTROL,KS0108_RS,KS0108_CS1,KS0108_CS2);

    //j_us(2);

    

    j_setbit(KS0108_PORT_CONTROL,KS0108_ENABLE);

    data=KS0108_PIN_DATA;

    //j_us(2);

    j_clrbit(KS0108_PORT_CONTROL,KS0108_ENABLE);


    //j_us(2);

    j_setbit2(KS0108_PORT_CONTROL,KS0108_CS1,KS0108_CS2);

    return data;

}


unsigned char ks0108_busy_test()

{

    unsigned char state=0;

    state=ks0108_get_state();

    if(state&KS0108_STATE_BUSY)

    {   //BUSY

        return 1;

    }

    else

    {   //idle

        return 0;

    }

}




void ks0108_on()

{

    //while(ks0108_busy_test());

    //j_us(2);

    ks0108_exec_cmd(KS0108_CMD_ON);

}

void ks0108_off()

{

    //while(ks0108_busy_test());

    //j_us(2);

    ks0108_exec_cmd(KS0108_CMD_OFF);

}

void ks0108_set_row(unsigned char row)

{

    row|=KS0108_ROW_BASE;

    //while(ks0108_busy_test());

    //j_us(2);

    ks0108_exec_cmd(row);

}

void ks0108_set_column(unsigned char column)

{

    column|=KS0108_COLUMN_BASE;

    //while(ks0108_busy_test());

    //j_us(2);

    ks0108_exec_cmd(column);

}

void ks0108_set_page(unsigned char page)

{

    page|=KS0108_PAGE_BASE;

    //while(ks0108_busy_test());

    //j_us(2);

    ks0108_exec_cmd(page);

}


void ks0108_exec_cmd(unsigned char cmd)

{



    //while(ks0108_busy_test());

    //j_us(2);


    KS0108_DDR_DATA=0xFF;


    j_clrbit(KS0108_PORT_CONTROL,KS0108_ENABLE);

    j_clrbit2(KS0108_PORT_CONTROL,KS0108_CS1,KS0108_CS2);

    j_clrbit2(KS0108_PORT_CONTROL,KS0108_RW,KS0108_RS);

    KS0108_PORT_DATA=cmd;

    //j_us(2);

    j_setbit(KS0108_PORT_CONTROL,KS0108_ENABLE);

    //j_us(2);

    j_clrbit(KS0108_PORT_CONTROL,KS0108_ENABLE);

    //j_us(2);

    j_setbit2(KS0108_PORT_CONTROL,KS0108_CS1,KS0108_CS2);

    

}

void ks0108_write_data(unsigned char data,unsigned char left_right)

{    //写显示数据

    //while(ks0108_busy_test());

    //j_us(2);

    KS0108_DDR_DATA=0xFF;


    //j_clrbit(KS0108_PORT_CONTROL,KS0108_ENABLE);

    if(left_right==1)

    {   //选择左半屏

        j_clrbit(KS0108_PORT_CONTROL,KS0108_CS1);

        j_setbit(KS0108_PORT_CONTROL,KS0108_CS2);

    }

    else 

    {   //选择右半屏

        j_setbit(KS0108_PORT_CONTROL,KS0108_CS1);

        j_clrbit(KS0108_PORT_CONTROL,KS0108_CS2);

    }

    j_clrbit(KS0108_PORT_CONTROL,KS0108_RW);

    j_setbit(KS0108_PORT_CONTROL,KS0108_RS);

    

    KS0108_PORT_DATA=data;

    //j_us(2);

    j_setbit(KS0108_PORT_CONTROL,KS0108_ENABLE);

    //j_us(2);

    j_clrbit(KS0108_PORT_CONTROL,KS0108_ENABLE);

    //j_us(2);

    j_setbit2(KS0108_PORT_CONTROL,KS0108_CS1,KS0108_CS2);


}



unsigned char ks0108_read_data(unsigned char left_right)

{

    unsigned char data=0;

    //while(ks0108_busy_test());

    //j_us(2);

    KS0108_DDR_DATA=0;

    KS0108_PORT_DATA=0xFF;


    j_clrbit(KS0108_PORT_CONTROL,KS0108_ENABLE);

    if(left_right==1)

    {   //选择左半屏

        j_clrbit(KS0108_PORT_CONTROL,KS0108_CS1);

        j_setbit(KS0108_PORT_CONTROL,KS0108_CS2);

    }

    else if(left_right==0)

    {   //选择右半屏

        j_setbit(KS0108_PORT_CONTROL,KS0108_CS1);

        j_clrbit(KS0108_PORT_CONTROL,KS0108_CS2);

    }

    j_setbit(KS0108_PORT_CONTROL,KS0108_RW);

    j_setbit(KS0108_PORT_CONTROL,KS0108_RS);




    //j_us(2);

    j_setbit(KS0108_PORT_CONTROL,KS0108_ENABLE);

    //j_us(2);

    j_clrbit(KS0108_PORT_CONTROL,KS0108_ENABLE);

    //j_us(2);


    j_setbit(KS0108_PORT_CONTROL,KS0108_ENABLE);

    data=KS0108_PIN_DATA;

    //j_us(2);

    j_clrbit(KS0108_PORT_CONTROL,KS0108_ENABLE);

    

    //j_us(2);

    j_setbit2(KS0108_PORT_CONTROL,KS0108_CS1,KS0108_CS2);

    return data;

}







/////////

void ks0108_draw_point(unsigned char x,unsigned char y)

{

    unsigned char column=0,page=0;

    unsigned char left_right=1;

    unsigned char data=0;

    if(x<=63)

    {

        column=x;

    }

    else

    {

        column=x-64;

        left_right=0;

    }

    page=y/8;

    data=~(1<<(y%8));


    ks0108_set_page(page);

    ks0108_set_column(column);

 

    data&=ks0108_read_data(left_right);

 


    ks0108_set_page(page);

    ks0108_set_column(column);

    ks0108_write_data(data,left_right);

     

}


另外其中用到jlib.h中的几个以j打头的宏定义为自己写的一些简化用的东西

也发布下

//1226_2008 AVR_INCJ     elite version 0.13


//波特率 

#define BAUDRATE    19200    

//时钟频率

#define F_CPU ((double)4000000)

//延时 微秒

#define j_us(x) __delay_cycles((long)(F_CPU*(double)((x)/1000000.0)))

//延时 毫秒

#define j_ms(x) __delay_cycles((long)(F_CPU*(double)((x)/1000.0)))

//延时 空指令

#define j_nop() __no_operation()

//全局中断开,简化

#define j_sei() __enable_interrupt()

//全局中断关,简化

#define j_cli() __disable_interrupt()

//置位

#define j_setbit(tmp,x)  ((tmp)|=(1<<(x)))

//置双位

#define j_setbit2(tmp,x,y)  ((tmp)|=(1<<(x))|(1<<(y)))

//置三位

#define j_setbit3(tmp,x,y,z)  ((tmp)|=(1<<(x))|(1<<(y))|(1<<(z)))

//清位

#define j_clrbit(tmp,x)  ((tmp)&=(~(1<<(x))))

//清双位

#define j_clrbit2(tmp,x,y) ((tmp)&=(~(1<<(x)))&(~(1

[1] [2]
关键字:KS0108  AVR驱动  IAR 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic481963.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:轻松玩转LCD12864-基于AVR单片机的LCD12864串行显示
下一篇:AVR+FPGA实现六路闭环电流控制程序

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

酷睿i9-9900KS处理器正式发布 国行售价4299元
   Intel发布了酷睿i9-9900KS处理器,这是九代酷睿中的最新型号,也是最强型号——首次实现了全8核5GHz频率。这款处理器国内也开始预定了,售价4299元,但是只提供一年质保。从架构及工艺来说,酷睿i9-9900KS处理器没有多少新鲜的,依然是14nm++工艺,Coffee Lake-S架构,8核16线程,基础频率4.0GHz,全核加速频率5.0GHz,TDP 127W,相比之下酷睿i9-9900K处理器是基础频率3.6GHz,全核心加速4.7GHz,单核、双核加速频率5.0GHz,TDP 95W。关于处理器的性能,Intel的对比数据主要是跟三年前的PC相比,进行游戏、流媒体及录播时,酷睿i9-9900KS
发表于 2019-10-30
酷睿i9-9900KS处理器正式发布 国行售价4299元
曝i9-9900KS风冷超频到5.2GHz 全核5.2GHz跑分比i9-9900K典型分提高7%
    Intel此前预告,Core i9-9900KS处理器将于本月发售。但直到现在,确切日期仍未公布。不过,捷克网友FR33_L35T3R却提前拿到了一颗零售版的i9-9900KS,并成功在风冷下将其超频到了5.2GHz,电压1.36V。据悉,测试平台是基于华硕 ROG Maximus XI Hero (Wi-Fi)主板和一对博帝DDR4-2666内存。在Cinebench R20中,全核5.2GHz的i9-9900KS跑出5356分,比i9-9900K的典型分4984提高了7%,比5GHz的i9-9900KS的5266分提升了1.7%。Core i9-9900KS发布于今年台北电脑展
发表于 2019-10-18
曝i9-9900KS风冷超频到5.2GHz 全核5.2GHz跑分比i9-9900K典型分提高7%
LCD12864(KS0107 KS010)示例程序
//LCD12864: KS0107 KS0108//keilc51#include <\atmel\AT89x52.H>#define lcd_reset P3_3#define lcd_cs1   P3_4#define lcd_cs2   P3_2#define lcd_di    P3_7#define lcd_rw    P3_6#define lcd_e     P3_5#define lcd_dp    P0#define
发表于 2018-01-09
ATMEGA16 12864LCD驱动程序(KS0108芯片)
#include <mega16.h>  #include <delay.h>  #include <ks0108.h>        //我自己写的库函数  void main(void)      {      PORTB=0;      
发表于 2017-12-17
KS0108 128X64 LCD C语言AVR程序
KS0108 128X64 LCD C语言AVR程序/* LCD引脚定义 1---GND  2---VCC 3---VLCD 4---D/I 5---R/W 6---E 7到14 D0-D7 15--CS1 16--CS2 17--RESET 18--VEE19--SW 20--NC  */ #include <iom16v.h> #include <macros.h> 
发表于 2017-12-13
LED 驱动控制专用电路 TM1628 AVR 测试程序源代码
#include <avr/io.h>#include <util/delay.h>#define TM1628_DIO_PORTNAME     B#define TM1628_DIO_BIT          5#define TM1628_CLK_PORTNAME     B#define TM1628_CLK_BIT          7#define TM1628_STB_PORTNAME     B#define
发表于 2019-12-04
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved