?? st7920iccavrmega8._c
字號(hào):
/****************************************************************************************
LCM(DM12864M-帶字庫,ST7920控制芯片)mega8控制顯示程序
程序功能:該程序是用AVR來控制對(duì)DM12864M
讀寫信號(hào)等的操作.
硬件連接:采用串行方式顯示,分配PB6=SID,PB7=SCK,PB1=LCD_ON
三個(gè)I/O口分別作為L(zhǎng)CM數(shù)據(jù),時(shí)鐘信號(hào),背光開關(guān)
的控制。
CS和/RESET直接接VCC;PSB直接接GND
作者:張國旗
2008年12月29號(hào)
****************************************************************************************/
#include <iom8v.h>
#include <macros.h>
#include <stdio.h>
#define LCDDDR DDRB
#define LCDDDR_IN LCDDDR&=~BIT(PB6);
#define LCDDDR_OUT LCDDDR|=BIT(PB1)|BIT(PB6)|BIT(PB7);
/*===============================================================*/
#define LCDCTL PORTB
#define SID_ON LCDCTL |= BIT(PB6) //數(shù)據(jù)
#define SID_OFF LCDCTL &= ~BIT(PB6)
#define SCK_ON LCDCTL |= BIT(PB7) //時(shí)鐘
#define SCK_OFF LCDCTL &= ~BIT(PB7)
#define LCD_ON LCDCTL |= BIT(PB1) //開啟背光
#define LCD_OFF LCDCTL &= ~BIT(PB1)
//#define uchar unsigned char
/***********************函數(shù)體部分*********************************/
unsigned char AC_TABLE[]={
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,
};
//=========發(fā)送一個(gè)字節(jié)程序=========
void SendByte(unsigned char Dbyte)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(Dbyte&0x80)SID_ON;
else SID_OFF;
SCK_ON;
SCK_OFF;
Dbyte=Dbyte<<1;
}
}
//接收一個(gè)字節(jié)程序((0xf0&temp1)+(0x0f&temp2))
unsigned char ReceiveByte(void)
{
unsigned char i,temp1,temp2;
temp1=temp2=0;
for(i=0;i<8;i++)
{
LCDDDR_IN;
temp1=temp1<<1;
if ((PINB&0x40)!=0)temp1++; //與端口設(shè)置有關(guān),主要修改端口時(shí)修改此位
LCDDDR_OUT;
SCK_ON;
SCK_OFF;
}
for(i=0;i<8;i++)
{
LCDDDR_IN;
temp2=temp2<<1;
if ((PINB&0x40)!=0)temp2++; //與端口設(shè)置有關(guān),主要修改端口時(shí)修改此位
LCDDDR_OUT;
SCK_ON;
SCK_OFF;
}
return ((0xf0&temp1)+(0x0f&temp2));
}
//液晶忙檢查CheckBusy
void CheckBusy( void )
{
do SendByte(0xfc); //11111,RW(1),RS(0),0
while(0x80&ReceiveByte());
}
//========寫命令========
void WriteCommand( unsigned char Cbyte )
{
CheckBusy();
SendByte(0xf8); //11111,RW(0),RS(0),0
SendByte(0xf0&Cbyte);
SendByte(0xf0&Cbyte<<4);
}
//========寫數(shù)據(jù)========
void WriteData( unsigned char Dbyte )
{
CheckBusy();
SendByte(0xfa); //11111,RW(0),RS(1),0
SendByte(0xf0&Dbyte);
SendByte(0xf0&Dbyte<<4);
}
//========讀數(shù)據(jù)========
unsigned char ReadData( void )
{
CheckBusy();
SendByte(0xfe); //11111,RW(1),RS(1),0
return ReceiveByte();
}
//===延時(shí)程序 ,12M/ms==
void Delay(unsigned int MS)
{
unsigned char us,usn;
while(MS!=0) //for 12M
{
usn = 2;
while(usn!=0)
{
us=0xf5;
while (us!=0){us--;};
usn--;
}
MS--;
}
}
//=====液晶初始化======
void LcmInit( void )
{
WriteCommand(0x30); //基本指令,選擇8位CPU控制方式,關(guān)圖顯
WriteCommand(0x03); //復(fù)位地址計(jì)數(shù)器
WriteCommand(0x0C); //開整體顯示
WriteCommand(0x01); //清除屏顯的數(shù)據(jù)
WriteCommand(0x06); //設(shè)置地址計(jì)數(shù)器遞增
}
//=======清文字========
void LcmClearTXT( void )
{
LcmInit();
}
//=======清圖片========
void LcmClearBMP( void )
{
unsigned char i,j;
WriteCommand(0x34); //關(guān)圖顯
for(i=0;i<32;i++)
{
WriteCommand(0x80|i); //寫入列地址
WriteCommand(0x80); //寫入行地址
for(j=0;j<32;j++)
WriteData(0);
}
//WriteCommand(0x36);//開圖顯
}
//==寫入一段文字,寫完一屏,清屏,從頭在寫新的一屏=======
void PutStr(unsigned char row,unsigned char col,unsigned char *puts)
{
WriteCommand(0x30); //基本指令,選擇8位CPU控制方式,關(guān)圖顯
WriteCommand(AC_TABLE[8*row+col]);
while(*puts != '\0')
{
if(col==8)
{
col=0;
row++;
}
if(row==4) row=0;
WriteCommand(AC_TABLE[8*row+col]);
WriteData(*puts); //一個(gè)漢字的ASC碼是一個(gè)16位的,所以要寫入兩個(gè)字節(jié)
puts++;
WriteData(*puts);
puts++;
col++;
}
}
//========寫入一屏圖片128*64=======
void PutBMP(unsigned char *puts)
{
unsigned char x,y,i,j,k;
x=0x80;
WriteCommand(0x34); //關(guān)圖顯
for(k=0;k<2;k++)
{
y=0x80;
for(j=0;j<32;j++)
{
WriteCommand(y); //寫入列地址
WriteCommand(x); //寫入行地址
for(i=0;i<16;i++)
{
WriteData(*(puts++));
}
y++;
}
x=0x88;
}
WriteCommand(0x36); //開圖顯
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -