📄 dm12864m串行.c
字号:
/****************************************************************************************
LCM(DM12864M-带字库,ST7920控制芯片)显示程序
程序功能:该程序是用AVR来控制对DM12864M
读写信号等的操作.
硬件连接:采用串行方式显示,分配PA.0,PA.1,PA.2
三个I/O口分别作为LCM片选CS,数据SID,时钟信
号CLK的控制。PA3置为低电平,用来串行选择信号。
PA4置位时开启背光。
****************************************************************************************/
#include <iom16v.h>
#include <macros.h>
#include <stdio.h>
#define LCDDDR DDRA
#define LCDDDR_IN LCDDDR&=~BIT(PA1);
#define LCDDDR_OUT LCDDDR|=BIT(PA0)|BIT(PA1)|BIT(PA2)|BIT(PA3)|BIT(PA4);
/*===============================================================*/
#define LCDCTL PORTA
#define LCD_RS_H LCDCTL |= BIT(PA0) //片选
#define LCD_RS_L LCDCTL &= ~BIT(PA0)
#define LCD_RW_H LCDCTL |= BIT(PA1) //数据
#define LCD_RW_L LCDCTL &= ~BIT(PA1)
#define LCD_EN_H LCDCTL |= BIT(PA2) //时钟
#define LCD_EN_L LCDCTL &= ~BIT(PA2)
#define LCD_PSB LCDCTL &= ~BIT(PA3) //串行选择
#define LCD_AK LCDCTL |= BIT(PA4) //开启背光
#define uchar unsigned char
/***********************函数体部分*********************************/
void dm12864_inputbyte(uchar comm) // 写入一字节数据
{
uchar i;
uchar mid;
for (i=0;i<8;i++)
{
mid=comm&0x80;
if (mid==0)
LCD_RW_L ;
else
LCD_RW_H ;
LCD_EN_H ;
//delay(15);
LCD_EN_L;
comm=comm<<1;
}
}
uchar dm12864_outputbyte(void) //读取一字节数据
{
uchar i,mid=0;
for (i=0;i<8;i++)
{
//delay(15);
LCDDDR_IN;
LCD_RS_H ;
mid=mid<<1;
if ((PINA&0x02)==0)
mid&=~BIT(PD0);
else
mid|=BIT(PD0);
LCDDDR_OUT;
LCD_EN_H ;
//delay(15);
LCD_EN_L;
}
return(mid);
}
/*-----------------读取标志位,判断控制器是否为忙状态--------------*/
void DetectLCMBusyState()
{
char BF = 0x00;
LCDDDR_OUT;
LCD_RS_H ;
LCD_EN_L ;
do
{
dm12864_inputbyte(0xfc);
BF=dm12864_outputbyte();
} while(BF==0x80);
LCD_RS_L ;
LCD_EN_H ;
//delay(15);
}
/*----------------------------写入命令-----------------------------*/
void LCMWriteCommand(char DisplayCmd)
{
uchar a,b;
a=DisplayCmd&0xf0;
b=(DisplayCmd<<4)&0xf0;
LCDDDR_OUT;
LCD_RS_H ;
LCD_EN_L ;
dm12864_inputbyte(0xf8);
dm12864_inputbyte(a);
dm12864_inputbyte(b);
LCD_EN_H ;
LCD_RS_L ;
//delay(15);
}
/*-----------------------写入一字节数据--------------------------*/
void LCMWriteData(char DisplayData)
{
uchar a,b;
a=DisplayData&0xf0;
b=(DisplayData<<4)&0xf0;
LCDDDR_OUT;
LCD_RS_H ;
LCD_EN_L ;
dm12864_inputbyte(0xfa);
dm12864_inputbyte(a);
dm12864_inputbyte(b);
LCD_EN_H ;
LCD_RS_L ;
//delay(15);
}
/*------------设置显示位置DisplayCol(1~8),DisplayRow(1~4)---------*/
void LCMSetXYAddress(char DisplayCol,char DisplayRow)
{
switch(DisplayRow)
{
case 1:LCMWriteCommand(0x7f + DisplayCol);
break;
case 2:LCMWriteCommand(0x8f + DisplayCol);
break;
case 3:LCMWriteCommand(0x87 + DisplayCol);
break;
case 4:LCMWriteCommand(0x97 + DisplayCol);
break;
}
}
/*-------------------在指定位置显示一半角字符-----------------------*/
void LCMDisplayASC(char DisplayCol,char DisplayRow,char ASCCharacter)
{
LCMSetXYAddress(DisplayCol,DisplayRow);
LCMWriteData(ASCCharacter);
}
/*----------------------在指定位置显示字符串-------------------------*/
void LCMDisplayString(char DisplayCol,char DisplayRow,char *DisplayString)
{
char LCD_temp;
LCMSetXYAddress(DisplayCol,DisplayRow);
LCD_temp=*DisplayString;
while(LCD_temp!=0x00)
{
LCMWriteData(LCD_temp);
LCD_temp=*(++DisplayString);
}
}
/*-------------------------显示一个整形数字,范围-32767~32767---------------------------*/
//宏定义判断函数,其中\是连接符
void LCMDisplayNummber(char DisplayCol,char DisplayRow,int DisplayNum)
{
char LCD_temp=0,flag=0;
LCMSetXYAddress(DisplayCol,DisplayRow);
if(DisplayNum < 0)
{
LCMWriteData(0x2d); //显示负号
DisplayNum = -DisplayNum;
}
LCD_temp=DisplayNum/10000;
if(flag | LCD_temp)
{
LCMWriteData(0x30 + LCD_temp);
flag = 1;
}
DisplayNum -= LCD_temp*10000;
LCD_temp = DisplayNum/1000;
if(flag | LCD_temp)
{
LCMWriteData(0x30 + LCD_temp);
flag = 1;
}
DisplayNum -= LCD_temp*1000;
LCD_temp = DisplayNum/100;
if(flag | LCD_temp)
{
LCMWriteData(0x30 + LCD_temp);
flag = 1;
}
DisplayNum -= LCD_temp*100;
LCD_temp = DisplayNum/10;
if(flag | LCD_temp)
{
LCMWriteData(0x30 + LCD_temp);
flag = 1;
}
DisplayNum -= LCD_temp*10;
LCD_temp = DisplayNum;
if(flag | LCD_temp)
{
LCMWriteData(0x30 + LCD_temp);
flag = 1;
}
if(!flag) LCMWriteData(0x30);
}
////////////////////////////////////////////////////////////////////
/*-----------------------液晶初始化-----------------------------*/
void LCMInit()
{
LCDDDR_OUT;
LCD_PSB;
LCD_AK;
LCD_EN_L;
LCD_RS_L;
LCD_RW_L;
LCMWriteCommand(0x30);
// 8 bits interface,basic instrument
LCMWriteCommand(0x0c);
// display,cursor on
LCMWriteCommand(0x01);
// clear DDRAM
LCMWriteCommand(0x02);
// cursor return
}
/*----------------------延时子函数---------------------------*/
void LCMDelay(int k)
{
int i;
int j;
for(i=0;i<k;i++)
{
for(j=0;j<=2000;j++)
{
;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -