#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_(); //執(zhí)行一個機器周期 } 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)及地址指針計數(shù)器(AC)的狀態(tài)
E = 1; //E=1配合 讀狀態(tài)或數(shù)據(jù),指令 while (lcd_data & 0x80); //忙標志在 DB7 位 所以將讀到的數(shù)據(jù)與0x80 相與,取出 DB7,檢測其是否為1. E = 0; // 釋放E }
void write_data(uchar x)//寫數(shù)據(jù) {
read_busy(); //操作液晶的時候要檢測忙信號
rs=1; rw=0; //rs=1,rw=0,表示寫數(shù)據(jù)到數(shù)據(jù)暫存器DR中
lcd_data=x; E = 1; delay(2); E = 0; //寫數(shù)據(jù)或者指令是在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位數(shù)據(jù)流,基本操作指令. 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);//發(fā)送水平地址碼 write_com(0x80);//發(fā)送垂直地址碼, 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); } }
我寫這個總是亂碼,不知道錯在哪里,望高手們,不吝賜教啊!
|