明天回家拉,送大家一個1602顯示漢字的程序,懶的寫注釋
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
1.jpg (22.29 KB, 下載次數: 55)
下載附件
2021-10-23 22:27 上傳
單片機源程序如下:
- #include<reg51.h>
- void enable(void);
- void writeaddr(unsigned char m);
- void writedata(unsigned char m);
- void selfdata(unsigned char m,unsigned char a);
- void init(void);
- unsigned char writestring(unsigned char m);
- unsigned char move(unsigned char m);
- void delay10ms(unsigned char time);
- void shift(unsigned char s,unsigned char n);
- sbit P27=P2^7;
- sbit P25=P2^5;
- sbit P26=P2^6;
- sbit P37=P3^7;
- unsigned char s=0xc0;
- unsigned char code table[8][8]={
- 0x02,0x02,0x0A,0x0A,0x0A,0x04,0x08,0x1F,/***第一個自定義字符
- ***/0x04,0x1F,0x15,0x15,0x17,0x05,0x04,0x1F,
- 0x02,0x04,0x0C,0x14,0x04,0x04,0x04,0x1F,
- 0x14,0x3F,0x15,0x15,0x14,0x11,0x1F,0x1F,
- 0x04,0x08,0x3F,0x0A,0x04,0x0A,0x11,0x1F,
- 0x1E,0x0A,0x0F,0x01,0x1F,0x01,0x03,0x1F,
- 0x00,0x00,0x07,0x05,0x07,0x00,0x00,0x1F,
- 0x04,0x0A,0x11,0x0E,0x00,0x0E,0x0A,0x0E};
- unsigned char code string[]={"oh!wa!wa!wa!"};
- main()
- {
- init();
- while(1)
- {
- selfdata(0x80,1);
- selfdata(0x81,2);
- selfdata(0x82,1);
- selfdata(0x83,2);
- selfdata(0x84,1);
- selfdata(0x85,2);
- shift(s,1);
-
- } }
- void delay10ms(unsigned char time)
- {
- unsigned char a,b,c;
- for(a=0;a<time;a++)
- for(b=0;b<10;b++)
- for(c=0;c<120;c++);
- }
- void enable(void)
- {
-
- P27=1;
-
- P27=0;
- }
- void LCD_BZ(void)
- { P25=0;
- P26=1;
- P27=0;
- P3=0xFF;
- for(P27=1;P37==1; P27=~P27,P27=~P27);
- }
- void writeaddr(unsigned char m)
- { LCD_BZ();
- P25=0;
- P26=0;
- P3=m;
- enable();
- }
- void writedata(unsigned char m)
- { LCD_BZ();
- P25=1;
- P26=0;
- P3=m;
- enable(); }
- void init(void)
- { writeaddr(0x01);
- writeaddr(0x0c);
- writeaddr(0x38);
- writeaddr(0x06);
- }
- void selfdata(unsigned char m,unsigned char a)
- { unsigned char n;
- n=a-1;
- switch(n)
- {
- case 0:writeaddr(0x40);break;
- case 1:writeaddr(0x48);break;
- case 2:writeaddr(0x50);break;
- case 3:writeaddr(0x58);break;
- case 4:writeaddr(0x60);break;
- case 5:writeaddr(0x68);break;
- case 6:writeaddr(0x70);break;
- case 7:writeaddr(0x78);break;
- }
- for(a=0;a<8;a++)
- writedata(table[n][a]);
- writeaddr(m);
- writedata(n);
- }
- unsigned char writestring(unsigned char m)
- { unsigned char a=0,*n=string;
- writeaddr(m);
- for(;*n!=0;n++)
- {
- writedata(*n);
- a++; }
- return(a); }
- unsigned char move(unsigned char m)
- { static char d=1;
- unsigned char c,all,*p=string,n=0;
- delay10ms(50);
- writeaddr(0x01);
-
- all=writestring(m+=1);
- if(m+all>0xd0)
- {
- writeaddr(0xc0);
- c=d;
- for(n=(m+all-0xd0);n!=0;n--)
- {
- writedata(*(p+all-d));
- --d;
-
- }
-
- d=c;
- d++;
- if(d==all+1)
- {
- d=1;
- m=0xc0;
- }
- }
- s=m+1;
- return(m); }
- void shift(unsigned char s,unsigned char n)
- { s-=1;
- for(;n!=0;n--)
- move(s);
- }
復制代碼
仿真dsn文件:
Proteus仿真7.5版本.7z
(27.8 KB, 下載次數: 393)
2021-10-23 22:28 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|