|
最近在做关于光照强度的小系统,需要在12864上显示此时光照强度变化的波形,也因为以前一直注意的是模块方面,所以去弄12864的波形显示,就有些尴尬了。听大家说如果要画波形,就先学会画点。所以才开始学12864的画点 ,但遇到了问题如果我想在12864上显示一个点,那么屏幕上就会出现8个连续的点,如果我显示两个连续的,那么屏幕上便会出现连续点,但坐标却不是我设定的位置。
这是描点部分的代码: 希望大家能帮忙解决一下
/***********************void lcd_senddata(串行数据发送 )***********************/
void lcd_senddata (unsigned char lcddata) //写数据
{
uchar dat_H,dat_L;
dat_H=lcddata&0xf0; //取高四位
dat_L=(lcddata<<4)&0xf0; //取低四位
lcdsend(0xfa); //发送起始信号 //-1按时序第一个字节送 1111 1 RW=0 RS1 0 ,所以第一个字节为FAH
lcdsend(dat_H); //发送高四位
lcdsend(dat_L); //发送低四位
}
/******************************lcd_sendcom(串行指令发送)******************************/
void lcd_sendcom (unsigned char lcdcom)
{
unsigned char com_H,com_L;
//分高低字节发送,先送高字节XXXX+0000,再送低字节XXXX+0000
com_H=lcdcom&0xf0; //先取数据的高四位
com_L=(lcdcom<<4)&0xf0; //取低四位
lcdsend(0xf8); //发送起始信号 -1按时序第一个字节送 1111 1 RW=0 RS=0 0 ,所以第一个字节为F8H
lcdsend(com_H); //发送高四位
lcdsend(com_L); //发送低四位
}
/**********************void Clear_GDRAM(清除GDRAM内部数据) ********************/
void Clear_GDRAM()
{
uchar x,y;
for(y = 0;y<64;y++) //y轴方向一共64行
{
for(x = 0;x<16;x++) //每行数据16位
{
lcd_sendcom(0x34); //扩展指令集 关闭绘图
lcd_sendcom(y+0x80); //y轴方向
lcd_sendcom(x+0x80); //x轴方向
lcd_senddata(0x00); //送入清屏数据
}
}
lcd_sendcom(0x36);
lcd_sendcom(0x30);
}
/****************************** 12864 串行 数据读取 ******************************/
uchar lcd_readdata ()
{
uchar i ;
uchar value;
CS_H;
SID_READ;
for(i = 8;i>0;i--)
{
value<<=1;
SCLK_H;
delay_us(40);
SCLK_L;
delay_us(40);
if(P2IN&BIT1)
value|=1;
}
SID_WRITE;
return value;
}
/****************************** 12864 液晶显示 结束 ******************************/
/****************************** 12864 液晶绘图描点 ******************************/
void Draw_Point(uchar X,uchar Y)
{
X_Byte = X / 16 ; //确定在哪一个字节 总共8个字节
X_Bit = X % 16 ; //确定在字节的哪一位 每个字节16位
Y_Scr = Y / 32; //确定显示在上(下)屏幕 0:上 1:下
Y_Line = Y % 32; //确定在屏幕的哪一行
lcd_sendcom(DRAW_OFF); //关闭绘图功能
lcd_sendcom(EXTEND); //开启扩展指令集
lcd_sendcom(0x80+Y_Line); //先确定行的位置
lcd_sendcom(0x80+X_Byte+8*Y_Scr); //其次对显示部分以及大概坐标确定
lcd_readdata ();
temp1 = lcd_readdata () ;
temp2 = lcd_readdata () ;
temp1&=0xf0;
temp2=temp2>>4;
temp2&=0x0f;
lcd_sendcom(0x80+Y_Line); //先确定行的位置
lcd_sendcom(0x80+X_Byte+8*Y_Scr); //其次对显示部分以及大概坐标确定
if(X_Bit<8) //如果位数小于8位
{
lcd_senddata(temp1|(0x01<<(7-X_Bit)));//高位点亮并恢复之前的状态
lcd_senddata(temp2); //将之前低位的状态送入进去
}
else
{
lcd_senddata(temp1); //将之前高位的状态送入进去
lcd_senddata(temp2|(0x01<<(15-X_Bit)));//低位点亮并恢复之前的状态
}
lcd_sendcom(DRAW_ON); //开启绘图模式
lcd_sendcom(BASIC); //开启 由扩展转换为基本 指令集
}
void main( void )
{
WDTCTL = WDTPW + WDTHOLD;
DCOCTL = 0;
DCOCTL = CALDCO_8MHZ;
BCSCTL1= CALBC1_8MHZ;
P2DIR |= BIT0+BIT1+BIT2;
show_init();//显示初始化
Clear_GDRAM();//清楚GDRAM
Draw_Point(0,0) ;//显示一个点
}
这是显示一个点时候,出现问题的图片
出现了连续的8个点
file:///C:\Users\Mr.Pan\Documents\Tencent Files\582838441\Image\C2C\B7F9AD621E6D6DE9950AA3AF0CB49BCD.jpg
|
|