📄 st7920iccavrmega8.c
字号:
/****************************************************************************************
LCM(DM12864M-带字库,ST7920控制芯片)mega8控制显示程序
程序功能:该程序是用AVR来控制对DM12864M
读写信号等的操作.
硬件连接:采用串行方式显示,分配PB6=SID,PB7=SCK,PB1=LCD_ON
三个I/O口分别作为LCM数据,时钟信号,背光开关
的控制。
CS和/RESET直接接VCC;PSB直接接GND
作者:张国旗
2008年12月29号
****************************************************************************************/
#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) //数据
#define SID_OFF LCDCTL &= ~BIT(PB6)
#define SCK_ON LCDCTL |= BIT(PB7) //时钟
#define SCK_OFF LCDCTL &= ~BIT(PB7)
#define LCD_ON LCDCTL |= BIT(PB1) //开启背光
#define LCD_OFF LCDCTL &= ~BIT(PB1)
//#define uchar unsigned char
/***********************函数体部分*********************************/
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,
};
//=========发送一个字节程序=========
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;
}
}
//接收一个字节程序((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++; //与端口设置有关,主要修改端口时修改此位
LCDDDR_OUT;
SCK_ON;
SCK_OFF;
}
for(i=0;i<8;i++)
{
LCDDDR_IN;
temp2=temp2<<1;
if ((PINB&0x40)!=0)temp2++; //与端口设置有关,主要修改端口时修改此位
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);
}
//========写数据========
void WriteData( unsigned char Dbyte )
{
CheckBusy();
SendByte(0xfa); //11111,RW(0),RS(1),0
SendByte(0xf0&Dbyte);
SendByte(0xf0&Dbyte<<4);
}
//========读数据========
unsigned char ReadData( void )
{
CheckBusy();
SendByte(0xfe); //11111,RW(1),RS(1),0
return ReceiveByte();
}
//===延时程序 ,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控制方式,关图显
WriteCommand(0x03); //复位地址计数器
WriteCommand(0x0C); //开整体显示
WriteCommand(0x01); //清除屏显的数据
WriteCommand(0x06); //设置地址计数器递增
}
//=======清文字========
void LcmClearTXT( void )
{
LcmInit();
}
//=======清图片========
void LcmClearBMP( void )
{
unsigned char i,j;
WriteCommand(0x34); //关图显
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控制方式,关图显
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); //一个汉字的ASC码是一个16位的,所以要写入两个字节
puts++;
WriteData(*puts);
puts++;
col++;
}
}
//========写入一屏图片128*64=======
void PutBMP(unsigned char *puts)
{
unsigned char x,y,i,j,k;
x=0x80;
WriteCommand(0x34); //关图显
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); //开图显
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -