前幾天,一直在玩這個,
因為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))))
上一篇:輕松玩轉LCD12864-基于AVR單片機的LCD12864串行顯示
下一篇:AVR+FPGA實現六路閉環電流控制程序
推薦閱讀
史海拾趣
GHI公司一直致力于提升產品品質和安全性。為了進入歐洲高端市場,GHI公司決定對其核心產品進行E-Mark認證。在認證過程中,GHI公司不斷完善質量管理體系,提升生產工藝水平,確保產品質量的穩定性和可靠性。最終,GHI公司的產品成功獲得了E-Mark認證,并在歐洲市場獲得了良好的口碑和市場份額。
作為江西省首家提供高端應用芯片整體解決方案的公司,聯智在集成電路設計領域展現了其強大的實力。公司不僅關注無線充電技術,還致力于電源管理、低功耗藍牙、近場感應等IoT(物聯網)應用芯片的研發和產業化。這種多元化的產品策略使聯智能夠滿足不同客戶的需求,進一步鞏固了其在市場中的地位。
在電子技術的不斷推動下,Global Specialties始終保持對新技術的高度敏感。公司不斷投入研發資源,對現有產品進行升級換代,并推出了一系列具有創新性的新產品。例如,公司開發的智能測試儀器能夠自動完成復雜的測試任務,大大提高了測試效率和準確性。這些技術創新不僅鞏固了Global Specialties在業內的領先地位,還為公司帶來了更多的商業機會。
隨著網絡安全問題的全球化趨勢日益明顯,Defender Security公司開始積極拓展國際市場。他們與多家國際知名的網絡安全企業建立了合作關系,共同應對全球網絡安全挑戰。通過技術交流和合作研發,Defender Security不斷提升自己的國際競爭力,逐漸成為了全球網絡安全領域的重要力量。
背景:隨著技術的成熟,Galaxy Microelectronics開始尋求與大型電子產品制造商的合作。
發展:2005年,Galaxy Microelectronics與一家領先的智能手機制造商達成合作協議,為其旗艦產品提供定制化的NAND閃存解決方案。這一合作不僅讓Galaxy Microelectronics的產品迅速進入市場,還顯著提升了其品牌知名度。隨后,公司陸續與多家知名電子產品廠商建立合作關系,進一步鞏固了其在閃存市場的地位。
背景:2000年代初,隨著全球對數字設備需求的激增,Galaxy Microelectronics在硅谷成立。公司創始人是一群來自斯坦福大學的工程師,他們看到了閃存技術在便攜式設備中的巨大潛力。
發展:Galaxy Microelectronics的初創團隊專注于研發高性能、低功耗的NAND閃存芯片。他們成功開發出了一種創新的電荷擷取閃存(CTF)技術,這項技術有效解決了當時浮柵架構的串擾問題,使得閃存芯片的耐用性和速度大幅提升。這一創新迅速吸引了市場關注,公司開始獲得風險投資的支持。
關于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也能看到, ...… 查看全部問答∨ |
//****************************************************************************** // MSP430F5438 Demo - USCI_A0, 9600 UART, SMCLK, LPM0, Echo with over-sampling // // Description: Echo a received characte ...… 查看全部問答∨ |
|
做一個矩陣算法,一開始沒有考慮平行化,程序可綜合,仿真正確。 為了提高速度而平行化,從新劃分了地址,分出了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 ...… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- 特斯拉:美國交付的Model Y/3電池包已實現100%美國生產
- 地平線與博世深化合作,攜手為多家車企提供輔助駕駛產品
- 強化中國市場戰略布局,德州儀器正靈活應對全球關稅挑戰
- Molex莫仕通過本地合作和創新加強支持中國汽車行業
- 貿澤開售Texas Instruments適用于高分辨率AR HUD的 全新DLP4620S-Q1 0.46"汽車數字微鏡器件
- ROHM推出高功率密度的新型SiC模塊,將實現車載充電器小型化!
- 用上車規級UFS 4.0,讓出行變得高效且可靠
- 車載測試技術解析:聚焦高帶寬、多通道同步采集與協議分析
- 傳統晶體管的極限!臺積電3nm N3P已量產
- 分析師稱H20出口管制毫無意義:對中國AI發展影響不大