娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2024年12月04日(星期三)

正在發生

2019年12月04日 | KS0108_AVR驅動[0617]

發布者:eta17 來源: 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<<(y))))

//清三位

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

//位檢測1

#define j_bit_pos(tmp,x) ((tmp)&(x))

//位檢測0

#define j_bit_neg(tmp,x) (~((tmp)|~(x)))

//循環左移,=號兩邊都為volatile型時慎用

#define j_round_left(tmp,x) ((tmp)=((tmp)<<(x))|((tmp)>>(8-(x))))

//循環右移,=號兩邊都為volatile型時慎用

#define j_rount_right(tmp,x) ((tmp)=((tmp)>>(x))|((tmp)<<(8-(x))))


關鍵字:KS0108  AVR驅動  IAR 引用地址:KS0108_AVR驅動[0617]

上一篇:輕松玩轉LCD12864-基于AVR單片機的LCD12864串行顯示
下一篇:AVR+FPGA實現六路閉環電流控制程序

推薦閱讀

英特爾正與GE醫療集團*聯手交付可應用于多種醫療影像格式的人工智能解決方案,以幫助排定病患護理優先順序并簡化護理流程。GE醫療集團利用英特爾?OpenVINO?工具包(在基于X射線系統的英特爾處理器上運行),加快即時診斷醫療成像深度學習。使用該系統后,X射線技術專家、重癥護理團隊和放射科醫生可立即獲得檢測結果,從而進行進一步診斷。 “早期測試表...
1. 概覽PXIe-5668R矢量信號分析儀(VSA)提供的帶寬為765 MHz,具有一流的測量性能和測量速度。這款高性能微波信號分析儀可以滿足各種應用的嚴苛需求,比如無線通信、射頻集成電路(RFIC)特性化、無線電探測和定位(RADAR)測試以及頻譜監測/信號情報等。如圖1所示,PXIe-5668R將高射頻測量性能、高測量速度和高靈活性獨一無二地集于一身。這款儀器具有的行業...
  12月3日,雄韜股份氫燃料&鋰電戰略與新品發布會盛大舉辦。此次發布會重點發布了深圳氫瑞A1代燃料電池電堆,采用石墨雙極板,額定功率42-84kW,體積功率密度3.5kW/L。   該產品所采取的價格策略為:   一次性訂購200臺起,1999元/kW;   一次性訂購2000臺起,1599元/kW;   一次性訂購10000臺起,1199元/kW。   除重磅產品發布外,雄...
廣告摘要聲明廣告撰文 | 歌者2015年,埃斯頓在深圳證券交易所正式掛牌上市,成為中國擁有完全自主核心技術的國產機器人主流上市公司之一。當年,埃斯頓營收為4.83億元,2020年埃斯頓營收達到25.10億元,年復合增長率達31.61%。2021年9月22日,埃斯頓在投資者互動平臺表示,今年上半年,公司機器人銷售數量近4700臺;公司對完成全年一萬臺的出貨目標充滿...

史海拾趣

問答坊 | AI 解惑

關于bios里面電源管理的選項

關于bios里面電源管理的選項 bios里面關于電源管理的選項一般比較難懂,這里簡單介紹一下。之所以難懂,很大程度是因為不同的廠商,選項和叫法都不太一樣,所以介紹時只能挑一種比較典型的舉例說明,至于其他的大家還是舉一反三自己理解一下,然后 ...…

查看全部問答∨

藍芽的機會、挑戰與方向

短距無線藍芽技術已廣泛嵌入至多種消費裝置中,從手機、筆記型電腦、PDA到汽車,都可看到相關應用,而一般認為手機為帶動藍芽成長的最大動力。根據市場研究機構IC Insights近期公佈的報告指出,以Wi-Fi、藍芽(Bluetooth)為主的無線網路晶 ...…

查看全部問答∨

電阻器的選用經驗介紹

電阻器的選用經驗介紹      1.固定電阻器的選用  固定電阻器有多種類型,選擇哪一種材料和結構的電阻器, 應根據應用電路的具體要求而定。 高頻電路應選用分布電感和分布電容小的非線繞電阻器,例如碳膜電阻器、 ...…

查看全部問答∨

綜合布線系統升級需以人為本

綜合布線是一個用于傳輸語音、數據及視頻信號的智能樓宇基礎設施。在通常情況下,一個園區或一幢寫字樓的綜合布線使用壽命是15年~20年。但隨著社會信息化水平的不斷提高,人們對信息的傳輸需求從語音發展到現在的視頻、數據等。網絡速度也從最初的1 ...…

查看全部問答∨

DM9000可以正確發送,可是接受到的數據包卻大于1518B!!!

dmfe_packet_receive: DM9000\'s RxLen is: ffff 接收到的數據包長度為0xffff > 1518 可能原因是什麼啊?…

查看全部問答∨

platform builder 5.0 無法下載 nk!求救!

我在platform builder 5.0 下面,自己定制了一個wince,當編譯完后,發現無法下載到 9261的開發板上,板子上用的是DM9000,串口顯示DM9000正常,在target device connetivity 中,download->ethernet設置中,能看到開發板,并且板子的ip也能看到, ...…

查看全部問答∨

在c5402上實現濾波

請問下高手,用ccs軟件 把濾波器程序加載到5402上實現濾波功能,怎么去實現?有相關的程序嗎?謝謝各位高手指點幫幫忙!…

查看全部問答∨

TI的UART源代碼例子感覺用不了

//****************************************************************************** //   MSP430F5438 Demo - USCI_A0, 9600 UART, SMCLK, LPM0, Echo with over-sampling // //   Description: Echo a received characte ...…

查看全部問答∨

ISE VHDL 平行化中遇到的問題。

做一個矩陣算法,一開始沒有考慮平行化,程序可綜合,仿真正確。 為了提高速度而平行化,從新劃分了地址,分出了18個ram,3個一組,一共6組,運算的時候一次可以取12個數。 可是綜合錯誤: Portability:3 - This Xilinx application has run out ...…

查看全部問答∨

想用計數器代替軟延時,但下載到板子上,功能沒實現,請幫我分析下

#include<reg52.h> void Init_Value(); void Delay(unsigned char count); sbit Led = P1^0; //unsigned char i = 1; void main(void) { Init_Value(); while(1); } void Init_Value() { // TMOD = 0x01; // TH0 = (65535 - 100 ...…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 平陆县| 仪陇县| 昌平区| 额敏县| 彭阳县| 哈巴河县| 邻水| 吉首市| 大足县| 宝兴县| 湘西| 西乡县| 兴文县| 稻城县| 乌拉特前旗| 洱源县| 邓州市| 张北县| 金川县| 永州市| 鄂托克前旗| 安新县| 綦江县| 临潭县| 开平市| 长子县| 鄂州市| 务川| 屯留县| 双鸭山市| 尚义县| 交口县| 郴州市| 武乡县| 平山县| 新巴尔虎右旗| 抚州市| 旺苍县| 资溪县| 安福县| 通许县|