#include<reg52.h>
#include<intrins.h>
sbit rs=P1^0;
sbit rw=P1^1;
sbit E=P1^2;
sbit PSB =P3^6;
#define uchar unsigned char
#define uint unsigned int
#define lcd_data P2
uchar table[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,};
void delay(uchar x)//短延時
{
for(x;x>0;x--)
_nop_(); //執行一個機器周期
}
void delay1(uchar x)//1ms延時
{
uchar y;
for(x;x>0;x--)
for(y=110;y>0;y--);
}
unsigned char read_busy(void)
{
//uchar i;
rs = 0;
rw = 1; //rs=0和rw=1的時候,表示讀忙標志(BF)及地址指針計數器(AC)的狀態
E = 1; //E=1配合 讀狀態或數據,指令
while (lcd_data & 0x80); //忙標志在 DB7 位 所以將讀到的數據與0x80 相與,取出 DB7,檢測其是否為1.
E = 0; // 釋放E
}
void write_data(uchar x)//寫數據
{
read_busy(); //操作液晶的時候要檢測忙信號
rs=1;
rw=0; //rs=1,rw=0,表示寫數據到數據暫存器DR中
lcd_data=x;
E = 1;
delay(2);
E = 0; //寫數據或者指令是在E由高電平到低電平的下降沿. 既是:1--0 的過程.
}
void write_com(uchar x)//寫指令
{
read_busy();
rs=0;
rw=0; //表示寫指令
lcd_data=x;
E = 1;
delay(2);
E = 0; //同上
}
void init()
{
write_com(0x36);//功能設定,表示DL=1,RE=0 既是選擇8位數據流,基本操作指令.
write_com(0x01); //清除顯示
write_com(0x06); //
write_com(0x0c);
}
void clear(void)
{
write_com(0x01); //顯示清屏
write_com(0x34); // 顯示光標移動設置
write_com(0x30); // 顯示開及光標設置
}
void main()
{
char i;
delay1(400);
init();
delay1(5);
while(1)
{
//clear();
delay(1);
//write_com(0x36);
write_com(0x34);//關閉繪圖顯示
write_com(0x80);//發送水平地址碼
write_com(0x80);//發送垂直地址碼,
for(i=0;i<16;i++)
write_data(table);
// write_com(0x30);
write_com(0x80);
write_com(0x81);
for(i=16;i<32;i++)
write_data(table);
write_com(0x36);//打開顯示
delay1(400);
delay1(400);
}
}
我寫這個總是亂碼,不知道錯在哪里,望高手們,不吝賜教啊!
| 歡迎光臨 (http://www.denmoz.com/bbs/) | Powered by Discuz! X3.1 |