?? fanbai.c
字號:
//12864液晶的試驗程序,驅(qū)動芯片為ST7920
//目標板為DDC-128B
//驅(qū)動方式位并口
//JP10的所有短路塊拔掉,JP4短路塊位于右側(cè),JP7兩個短路塊均插好
//調(diào)節(jié)V0電位器調(diào)整對比度
//注意:因為廠家不同液晶的19腳和20腳(背光)有時會不同,導致背光不亮,需要注意。
#include <iom128.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
#define RS (1<<0)
#define RW (1<<1)
#define EN (1<<2)
//延時函數(shù)
void s_ms(uint ms)
{
for(;ms>1;ms--);
}
//此處定義字符串
char text_1[]={"北京東控開發(fā)板"};
char text_2[]={"反白練習"};
char text_3[]={"可以單字反白或不"};
char text_4[]={"反白"};
//寫數(shù)據(jù)
void WriteDataLCM(unsigned char WDLCM)
{
void ReadStatusLCM(); //檢測忙
s_ms(100);
PORTG|=RS; //RS=1
s_ms(100);
PORTG&=~RW; //RW=0
s_ms(100);
PORTG|=EN; //EN=1
s_ms(100);
PORTA=WDLCM; //輸出數(shù)據(jù)
s_ms(100);
PORTG&=~EN; //EN=0
s_ms(100);
}
//寫指令
void WriteCommandLCM(unsigned char WCLCM)
{
void ReadStatusLCM(); //根據(jù)需要檢測忙
s_ms(100);
PORTG&=~RS; //RS=0
s_ms(100);
PORTG&=~RW; //RW=0
s_ms(100);
PORTG|=EN; //EN=1
s_ms(100);
PORTA=WCLCM; //輸出指令
s_ms(100);
PORTG&=~EN; //EN=0
s_ms(100);
}
//讀狀態(tài):檢測忙
void ReadStatusLCM(void)
{
uchar temp;
uchar flag = 1;
while(flag==1)
{
DDRA=0x00; //端口A改為輸入
PORTA=0xff;
s_ms(100);
PORTG&=~RS; //RS=0
s_ms(100);
PORTG|=RW; //RW=1
s_ms(100);
PORTG|=EN; //EN=1
s_ms(100);
temp = PINA; //讀端口A
s_ms(100);
DDRA=0xff; //端口A改為
s_ms(100);
PORTG&=~EN; //EN=0
s_ms(100);
if(temp>>7==0)
flag = 0;
}
}
//LCM初始化
void LCMInit(void)
{
WriteCommandLCM(0x38); //三次顯示模式設置,不檢測忙信號
s_ms(1000);
WriteCommandLCM(0x38);
s_ms(1000);
WriteCommandLCM(0x38);
s_ms(1000);
WriteCommandLCM(0x38); //顯示模式設置,開始要求每次檢測忙信號
WriteCommandLCM(0x08); //關閉顯示
WriteCommandLCM(0x01); //顯示清屏
WriteCommandLCM(0x06); //顯示光標移動設置
WriteCommandLCM(0x0C); //顯示開及光標設置
}
//按指定位置顯示一串字符
//液晶顯示:漢字為16*16,字母及數(shù)字為8*16,此次顯示的文本
// 從第一行第一列開始,依次向左,如果想在不同的
// 位置顯示,只需修改相應的行值即可。液晶顯示
// 完畢后,轉(zhuǎn)入語音文本發(fā)送。
//DisplsyList(X,DData)函數(shù):X為0x80在第一行顯示;X為0x90在
// 第二行顯示;X為0x88在第三行顯示;X為0x98在
// 第四行顯示;DData為顯示數(shù)組。
void DisplayList(unsigned char X, char *DData)
{
unsigned char length;
unsigned char i=0;
char *p;
p = DData;
length = strlen(p);
WriteCommandLCM(0x08);
WriteCommandLCM(X);
WriteCommandLCM(0x06);
WriteCommandLCM(0x0C);
WriteCommandLCM(X);
for(i=0;i<length;i++)
{
WriteDataLCM(DData[i]);
i++;
WriteDataLCM(DData[i]);
}
}
/********************************
函數(shù)名稱:WriteGdram(uchar lcd_addr,uchar lcd_data)寫GdRAM
入口參數(shù):地址:lcd_addr,數(shù)據(jù):lcd_data
返回參數(shù):無
********************************/
void Set_White(void)
{
uchar i;
uchar j; //
WriteCommandLCM(0x36);
for(i=0;i<32;i++ ) //要反白時,先將整行的液晶全部清成不反白(此處行指y)
{
WriteCommandLCM(0x80|i); //設置繪圖區(qū)的Y地址坐標0
WriteCommandLCM(0x80); //設置繪圖區(qū)的X地址坐標0
for(j=0;j<16;j++) //
{
WriteDataLCM(0x00); //清成不反白
}
}
for(i=32;i<64;i++ ) //要反白時,先將整行的液晶全部清成不反白(此處行指y)
{
WriteCommandLCM(0x88|i); //設置繪圖區(qū)的Y地址坐標0
WriteCommandLCM(0x80); //設置繪圖區(qū)的X地址坐標0
for(j=0;j<16;j++) //
{
WriteDataLCM(0x00); //清成不反白
}
}
WriteCommandLCM(0x30);
}
void fan(uchar col)
{
uchar i;
uchar j; //
uchar clr_x;
uchar clr_y;
switch(col)
{
case 0:
clr_x = 0x80;
clr_y = 0x80;
break;
case 1:
clr_x = 0x80;
clr_y = 0x90;
break;
case 2:
clr_x = 0x80;
clr_y = 0x88;
break;
case 3:
clr_x = 0x80;
clr_y = 0x98;
break;
}
WriteCommandLCM(0x36);
for(i=0;i<16;i++ ) //16行,因為是16*16漢字
{
WriteCommandLCM(clr_y|i); //設置繪圖區(qū)的Y地址坐標0
WriteCommandLCM(clr_x); //設置繪圖區(qū)的X地址坐標0
for(j=0;j<16;j++) //
{
WriteDataLCM(0xff); //反白這一行的8個點,液晶地址自動加1
asm("nop");
}
}
}
//主函數(shù)
void main(void)
{
//端口初始化
DDRA=0xff;
PORTA=0xff;
DDRB=0xff;
PORTB=0xff;
DDRG=0xff;
PORTA=0x00;
PORTG|=(1<<3);
s_ms(200);
s_ms(200);
LCMInit(); //LCM初始化 //液晶初始化
DisplayList(0x80,text_1); //顯示第一行
DisplayList(0x90,text_2); //顯示第二行
DisplayList(0x88,text_3); //顯示第三行
DisplayList(0x98,text_4); //顯示第四行
s_ms(2000);
s_ms(2000);
// Set_White(0);
Set_White();
fan(3);
while(1);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -