完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛扫一扫,分享给好友
|
RT,我用的是元器件中的12864没字库的,纵向取模,字节倒序,搞清了原理就写了一个程序,但有很大问题...哪里有问题呢?
顺便再问一下,这个proteus中的12864和现实中带字库的12864有什么主要区别,比如Proteus中是分页,现实中是可以控制输入模式等... 求大家帮帮忙~ #include typedef unsigned char uchar; typedef unsigned int uint; ***it en=P3^4; ***it rs=P3^5; ***it rw=P3^6; ***it cs1=P3^0; ***it cs2=P3^1; uchar code chen[]={0x40,0x42,0xCC,0x00,0x00,0x40,0x30,0x1E,0x10, 0xF0,0x10,0x10,0x18,0x10,0x00,0x00, 0x00,0x00,0x3F,0x10,0x08,0x01, 0x01,0x01,0x01,0x7F,0x01,0x01,0x01,0x01,0x00,0x00}; void delay(uchar z) { uchar a; for(z=z;z>0;z--) for(a=114;a>0;a--); } void read() { uchar r; rs=0; rw=1; en=0; do { P2=0x00; en=1; r=P2; delay(2); en=0; delay(2); r=0x80&r; } while(!(r==0x00)); } void write_com(uchar com) { read(); rw=0; rs=0; en=0; P2=com; delay(2); en=1; delay(2); en=0; } void write_dat(uchar dat) { read(); rw=0; rs=1; en=0; P2=dat; delay(2); en=1; delay(2); en=0; } void hanzi(uchar ye,uchar lie,uchar *daima) { uchar i,j; for(i=0;i<2;i++) { write_com(0xb8+ye+i); delay(5); write_com(0x40+lie); for(j=0;j<16;j++) write_dat(daima[i*16+j]); } } void clear() { uchar i,j; cs1=0; cs2=0; for(i=0;i<8;i++) { write_com(0xb8+i); delay(5); write_com(0x40); for(j=0;j<64;j++) write_dat(0x00); } } void init() { delay(10); cs1=cs2=1; delay(10); write_com(0x3e); delay(5); write_com(0xc0); delay(5); write_com(0xb8); delay(5); write_com(0x40); delay(5); write_com(0x3f); } void main() { init(); clear(); while(1) { cs1=0; cs2=1; hanzi(0,0,chen); } } |
|
相关推荐
3个回答
|
|
|
本帖最后由 MOP 于 2016-11-8 23:45 编辑
就是分有無字庫,就是看控制IC是不是ST7920,是的話指令集會不同,會有擴展跟非擴展,我看了指令都跟原本的無字庫(KS0108)控制IC不同,另外Proteus的LCD12864是無字庫的 ST7920的普通指令集 ST7920的擴展指令集 無字庫的指令集(KS0108) 另外看Code的話,您的CS是有問題的 void hanzi(uchar ye,uchar lie,uchar *daima) { uchar i,j,col; col=lie; for(i=0;i<2;i++) { if(col>63)//起始點判斷 { cs1=0; cs2=1; col=col-64; } else { cs1=1; cs2=0; } write_com(0xb8+ye+i); delay(5); write_com(0x40+col); for(j=0;j<16;j++) { write_dat(daima[i*16+j]); col=col+8; if(col>63)//寫數據中,超過邊界時 { col=col-64; if(lie>63) { cs1=1; cs2=0; } else { cs1=0; cs2=1; } write_com(0xb8+ye+i); delay(5); write_com(0x40+col); } } col=lie; } } 改過的函式假設您的參數範圍Page(ye)0~7,Column(lie)0~127,這樣顯示時,會在同一行,但這寫法只保證lie為8的倍數才不會截斷任何data,另外字串長度一個Page也不可超過8字 void init() { delay(10); cs1=1; cs2=1;分成兩行才不會cs1去讀取cs2的值來指派 void clear() { uchar i,j; cs1=1; cs2=1; for(i=0;i<8;i++) { write_com(0xb8+i); delay(5); write_com(0x40); for(j=0;j<64;j++) write_dat(0x00); } }清除時,兩個cs應都設為1 void read() { volatile uchar r;習慣給I/O變數加上volatile void main() { init(); clear(); while(1) { hanzi(0,0,chen); } }更改main函式,讓函式自己依照起始位置來決定cs1和cs2 以上您試看看 |
|
|
|
|
MOP 发表于 2016-11-8 03:14 您好,看了您的回复之后我立刻去试了试,但还是不对...今天一天我又写了两遍,但还是出现这种毛病,另外我去问了一下,数据是按照我想的那样写入的,默认开始的Y坐标是0x40+16*n,您加的col作用就不太不懂了...我明天去实验室拿实物再试试吧 |
|
|
|
|
MOP 发表于 2016-11-8 22:23 谢谢啦~ |
|
|
|
|
只有小组成员才能发言,加入小组>>
1064 浏览 1 评论
1885 浏览 0 评论
1865 浏览 1 评论
3286 浏览 5 评论
3614 浏览 9 评论
1068浏览 1评论
如何知道嵌入式电子控制单元 (ECU) 中的RAM使用情况?
1394浏览 1评论
1889浏览 0评论
1208浏览 0评论
1341浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-12 17:14 , Processed in 0.951950 second(s), Total 80, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
4930