下面的代码是我的主函数,这部分加上上面我上面讲的函数和一些基本设置就是整个代码,XY是这幅坐标图片取模得到的数组
void main()
{
init_picture();
show_Pic(XY);
while(1) // 进入程序主循环
{
}
}
二. 用打点方式显示任意图像
有的同学认为打点只需按照上面的显示图片的方法点亮需要的点就是了,其实这不行。因为你写进去的是八个点的控制,会影响周围的点,很容易出现乱码。比如,你写进去的是0x80,想的是只点亮左边一个点,其他的都不要影响,但是右边的7个0也是会显示的,如果在要显示0的地方原来显示的是1的话,你现在写进去的0就把1覆盖了,这样就容易产生乱码。所以我建议,你先把液晶的数据读出来,再用data &=(~(0x01<<(7-bit)))(bit是你点亮哪一位,data是读出来的数据)置0,置1也是类似的,最后再把data重新写进去就行了。 我的单片机接口是乱的,所以每一个液晶接口都用了位定义,并且用到了寄存器B,寄存器B的每一个当做一个变量的位来操作。我的具体代码如下:
bit lcd_busy() // 读写判断数据的D7读写位,用于判断1602是否忙
{
bit result;
D7 = 1; // 数据口D7置1,为读状态做准备
LCD_RS = 0; // 选择指令寄存
LCD_RW = 1; // 选择读控制线
LCD_EN = 1; // 开使能控制线
delayNOP(); // 时序延时
result = D7; // 读D7的电平
LCD_EN = 0; // 关使能 return(result); // 返回值1:忙,0可以执行操作
}
unsigned char readData(void) //读取数据函数
{
uchar i;
D0 = 1; D1 = 1;
D2 = 1; D3 = 1;
D4 = 1; D5 = 1;
D6 = 1; D7 = 1;
lcd_busy();
LCD_RS=1; LCD_RW=1;
LCD_EN=0; LCD_EN=1;
B_0=D0;B_1=D1; B_2=D2; B_3=D3; //B_1=B^1,在程序前段有位定义
B_4=D4;B_5=D5; B_6=D6; B_7=D7;
for(i=1;i<=7;i++)
delayNOP(); //这个函数是{_nop_();_nop_();_nop_();_nop_();};
LCD_EN=0;
return B;
}
uchar DrawDots(uchar x,uchar y,uchar color)//打点函数 //x,y为128*64
点阵的坐标
{
uchar row,xlabel,xlabel_bit;
uchar Read_H=0,Read_L=0;
lcd_wcmd(0x34); //扩充指令
lcd_wcmd(0x36); //绘图指令
xlabel=x>>4; //确定水平坐标地址
xlabel_bit=x & 0x0F; // 细分水平坐标中的第几位
if(y<32) row=y;
else { row=y-32; xlabel+=8; }
lcd_wcmd(row+0x80);
lcd_wcmd(xlabel+0x80);
readData();
Read_H=readData();
Read_L=readData();
lcd_wcmd(row+0x80);
lcd_wcmd(xlabel+0x80); //水平坐标地址+基址=显示的水平地址
if(xlabel_bit<8)
{
switch(color)
{
case 0:Read_H &=(~(0x01<<(7-xlabel_bit))); break; //变暗 ,看不见
case 1:Read_H |=(0x01<<(7-xlabel_bit)); break; //变亮 ,看得见
case 2:Read_H ^=(0x01<<(7-xlabel_bit)); break; //反转
default:break;
}
cd_wdat(Read_H);
cd_wdat(Read_L);
}
else
{
switch(color)
{
case 0:Read_L &=(~(0x01<<(15-xlabel_bit))); break; //变暗 ,看不见
case 1:Read_L |=(0x01<<(15-xlabel_bit)); break; //变亮 ,看得见
case 2:Read_L ^=(0x01<<(15-xlabel_bit)); break; //反转
default:break;
}
lcd_wdat(Read_H);
lcd_wdat(Read_L);
}
lcd_wcmd(0x30);//恢复正常模式
}
如果你的单片机和12864接口不是乱的,那可以这样写读取函数
unsigned char readData(void)
{
uchar i ,data;
P0=0xFF;
lcd_busy();
LCD_RS=1; LCD_RW=1;
LCD_EN=0; LCD_EN=1;
data=P0;
for(i=1;i<=7;i++)
delayNOP();
LCD_EN=0;
return data;
}
这样,整个代码就全部讲完了,下面是显示正弦波的图片
声明一下 此乃不是俺的杰作,这是他人杰作,俺是分享给大伙的
若有疏漏之处,希望大家多指正,交流交流
`