|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
- #include <stc12c5a.h>
- #include <intrins.h>
- #include <math.h>
- //------------定义接口-------------//
- sbit RS=P2^2 ;
- sbit RW=P2^3 ;
- sbit E=P2^4;
- sbit PSB= P2^5; //H=并口; L="串口";
- //sbit P34=P3^4;
- //sbit P35=P3^5;
- //sbit P36=P3^6;
- #define Lcd_Bus P0
- // P0 接 LCM
- #define uchar unsigned char
- #define FIRST_ADDR 0
- uchar T=0,y=32,x=32;
- //定义字符/汉字显示起始位置
- /*------------------检查忙位-----------------------------*/
- void chk_busy()
- {
- RS=0 ;
- RW=1 ;
- E=1 ;
- Lcd_Bus=0xff ;
- while((Lcd_Bus&0x80)==0x80);
- E=0 ;
- }
- /*------------------延时子程序-----------------------------*/
- void delay(unsigned int t)
- {
- unsigned int i,j ;
- for(i=0;i<t;i++)
- for(j=0;j<10;j++);
- }
- /*------------------写命令到LCD------------------------------*/
- void write_com(unsigned char cmdcode)
- {
- chk_busy();
- RS=0 ;
- RW=0 ;
- E=1 ;
- Lcd_Bus=cmdcode ;
- delay(5);
- //------------------在数据写入的时候加入适当的延时
- E=0 ;
- delay(5);
- }
- /*-------------------写数据到LCD----------------------------*/
- void write_data(unsigned char Dispdata)
- {
- chk_busy();
- RS=1 ;
- RW=0 ;
- E=1 ;
- Lcd_Bus=Dispdata ;
- delay(5);
- //------------------在数据写入的时候加入适当的延时
- E=0 ;
- delay(5);
- }
- /*------------------初始化LCD屏--------------------------*/
- void lcdreset()
- {
- PSB = 1;
- delay(2000);
- write_com(0x30);
- delay(10);
- //选择基本指令集
- write_com(0x30);
- //选择8bit数据流
- delay(5);
- write_com(0x0c);
- //开显示(无游标、不反白)
- delay(10);
- write_com(0x01);
- //清除显示,并且设定地址指针为00H
- delay(500);
- write_com(0x06);
- //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位
- delay(0);
- }
- /*------------------显示字符串--------------------------*/
- void hzkdis(unsigned char code*s)
- {
- while(*s>0)
- {
- write_data(*s);
- s++;
- delay(50);
- }
- }
- /*------------------首屏显示--------------------------*/
- void ceshi()
- {
- write_com(0x01);
- //清除显示,并且设定地址指针为00H
- delay(5);
-
- write_com(0x80);
- //第一行(如果是地址是:80H,即LCD的第一行的第一个位置显示)
- hzkdis("贵阳学院");
-
- write_com(0x90);
- //第二行(如果是地址是:90H,即LCD的第二行的第一个位置显示)
- hzkdis("电子与通信工程");
-
- write_com(0x88);
- //第三行(如果是地址是:88H,即LCD的第二行的第一个位置显示)
- hzkdis("电子信息工程");
-
- write_com(0x98);
- //第四行(如果是地址是:98H,即LCD的第二行的第一个位置显示)
- hzkdis("波形测试程序");
- }
- //------------------清整个GDRAM空间----------------------------
- void clrgdram()
- {
- unsigned char x,y ;
- for(y=0;y<64;y++)
- for(x=0;x<16;x++)
- {
- write_com(0x34);
- write_com(y+0x80);
- //行地址
- write_com(x+0x80);
- //列地址
- write_com(0x30);
- write_data(0x00);
- write_data(0x00);
- }
- }
- //------------------------------------------------------------
- void clrscreen()
- {
- write_com(0x01);
- delay(10);
- }
- unsigned char ReadByte(void)
- {
- unsigned char byReturnValue ;
- chk_busy();
- Lcd_Bus=0xff ;
- RS=1 ;
- RW=1 ;
- E=0 ;
- E=1 ;
- byReturnValue=Lcd_Bus ;
- E=0 ;
-
- return byReturnValue ;
- }
- /*增加画点子程序
- 函数功能:在坐标为(x,y)点画一个点
- 参数意义?
- X:12864屏幕的横坐标,范围是0到128(从左到右)
- Y:12864的纵坐标,范围是0到64(从上到下)
- Color:为1的时候表示为黑点
- */
- void DrawPoint(unsigned char X,unsigned char Y,unsigned char Color)
- {
- unsigned char Row,Tier,Tier_bit ;
- unsigned char ReadOldH,ReadOldL ;
- write_com(0x34);
- write_com(0x36);
- Tier=X>>4 ;
- Tier_bit=X&0x0f ;
- if(Y<32)
- {
- Row=Y ;
- }
- else
- {
- Row=Y-32 ;
- Tier+=8 ;
- }
- write_com(Row+0x80);
- write_com(Tier+0x80);
- ReadByte();
- ReadOldH=ReadByte();
- ReadOldL=ReadByte();
- write_com(Row+0x80);
- write_com(Tier+0x80);
- if(Tier_bit<8)
- {
- switch(Color)
- {
- case 0 :
- ReadOldH&=(~(0x01<<(7-Tier_bit)));
- break ;
- case 1 :
- ReadOldH|=(0x01<<(7-Tier_bit));
- break ;
- case 2 :
- ReadOldH^=(0x01<<(7-Tier_bit));
- break ;
- default :
- break ;
- }
- write_data(ReadOldH);
- write_data(ReadOldL);
- }
- else
- {
- switch(Color)
- {
- case 0 :
- ReadOldL&=(~(0x01<<(15-Tier_bit)));
- break ;
- case 1 :
- ReadOldL|=(0x01<<(15-Tier_bit));
- break ;
- case 2 :
- ReadOldL^=(0x01<<(15-Tier_bit));
- break ;
- default :
- break ;
- }
- write_data(ReadOldH);
- write_data(ReadOldL);
- }
- write_com(0x30);
- }
- void main(void)
- {
- uchar i,j,colour=1;
- ET0=1;
- EA=1;
- TMOD=0X11;
- TR0=1;
- TH0=(65536-100)/256;
- TL0=(65536-100)%256;
- RW=0 ;
- lcdreset();
- ceshi();
- clrgdram();
- delay(2000);
- clrscreen();
- while(1)
- {
- for(i=127;i>0;i--)
- {
- j=y-x*sin(2*i*3.14/(64+T)); //y纵向参数,可以上下调节波形位置
- DrawPoint(i,j,colour); //T调节周期,x调节幅度
- }
- //T+=4;
- //clrgdram();
- delay(6000);
- //clrscreen();
-
- }
- while(1);
- }
- void key() interrupt 1
- {
- TH0=(65536-100)/256;
- TL0=(65536-100)%256;
- if(P34==0)
- { delay(20);
- if(P34==0)
- {
- clrgdram();
- T+=4;
- if(T>200)
- T=0;
- }
- }
-
- if(P35==0)
- { delay(20);
- if(P35==0)
- {
- clrgdram();
- x-=4;
- if(x<0)
- x=32;
- }
- }
-
-
- if(P36==0)
- { delay(20);
- if(P36==0)
- {
- clrgdram();
- y-=4;
- if(y<0)
- y=32;
- }
- }
- }
复制代码 |
-
-
波形.zip
54.9 KB, 下载次数: 6
, 下载积分:
资产 -2 信元, 下载支出 2 信元
51单片机用12864显示正弦波
|