⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd.c

📁 avr单片机
💻 C
字号:
//12864K(7920)的串行模式
/***********************************
12864每行显示8个汉字,共四行,地址排列如下
80  81  82   83  84  85  86  87
90  91  92  93  94   95  96  97
88  89  8A  8B  8C   8D  8E  8F
98  99  9A  9B  9C   9C  9E  9F
*************************************/
#include <iom16v.h>
#include <stdio.h>
#include <macros.h>

#include "lcd.h"

//LCD引脚定义
//#define lcd_dt PORTA.3   	液晶串行数据输入、输出端
#define set_lcd_dt asm("sbi 0x1B,3")   
#define clr_lcd_dt asm("cbi 0x1B,3")

//#define lcd_clk PORTA.2	同步时钟输入端
#define set_lcd_clk asm("sbi 0x1B,2")   
#define clr_lcd_clk asm("cbi 0x1B,2")

void delay(unsigned int n) 
{
unsigned int i;
for(i=0; i<n;i++)
;
}

//串行发送一字节数据
void SendByte(unsigned char dat)
{
unsigned char i;
DDRA=0x0c;		//PA3,PA2输出  00001100
for(i=0;i<8;i++)
	{
	clr_lcd_clk;
	if(dat&0x80)
	set_lcd_dt;
	else clr_lcd_dt;
	set_lcd_clk;
	delay(10);
	dat=dat<<1;
	}
}

//串行接收一字节数据
unsigned char ReceiveByte(void)
{
unsigned char i,d1,d2;
DDRA&=0xf7;	  			//输入
PORTA&=0xf7;
DDRA|=0x04;
for(i=0;i<8;i++)
{
clr_lcd_clk;
delay(100);
set_lcd_clk;
if(PINA&0xFB)		  //11111011
d1++;
d1=d1<<1;
}
for(i=0;i<8;i++)
{
clr_lcd_clk;
delay(100);
set_lcd_clk;
if(PINA&0xFb)
d2++;
d2=d2<<1;
}
return (d1&0xF0+d2&0x0F);
}

//读取标志位BF
unsigned char ReadBF(unsigned char bf)
{
unsigned char dat;
SendByte(0xFA);	  //11111,01,0 RW=1,RS=0
dat=ReceiveByte();
if(dat>0x7F)bf=1;
else bf=0;
return bf;
} 

//写控制命令
void SendCMD(unsigned char dat)
{
// while(ReadBF){;}
// RS_CS=1;
SendByte(0xF8);	   //11111,00,0 RW=0,RS=0 同步标志
SendByte(dat&0xF0);//高四位
SendByte((dat&0x0F)<<4);//低四位
// RS_CS=0;
}

//写显示数据或单字节字符
void SendDat(unsigned char dat)
{
// while(ReadBF){;}
// RS_CS=1;
SendByte(0xFA);	   //11111,01,0 RW=0,RS=1
SendByte(dat&0xF0);//高四位
SendByte((dat&0x0F)<<4);//低四位
// RS_CS=0;
} 

/* 写汉字到LCD 指定的位置
x_add显示RAM的地址
dat1/dat2显示汉字编码
*/
void display(unsigned char x_add,unsigned char dat1,unsigned char dat2)
{
SendCMD(x_add);//1xxx,xxxx 设定DDRAM 7位地址xxx,xxxx到地址计数器AC
SendDat(dat1);
SendDat(dat2);
}

//初始化 LCM
void initlcm(void)
{
//RST=0;
// RS_CS=0;
// PSB=0;//serial mode
delay(100);
//RST=1;
SendCMD(0x30);//功能设置,一次送8位数据,基本指令集
SendCMD(0x0C);//0000,1100 整体显示,游标off,游标位置off
SendCMD(0x01);//0000,0001 清DDRAM
SendCMD(0x02);//0000,0010 DDRAM地址归位
SendCMD(0x80);//1000,0000 设定DDRAM 7位地址000,0000到地址计数器AC
// SendCMD(0x04);//点设定,显示字符/光标从左到右移位,DDRAM地址加 一
// SendCMD(0x0F);//显示设定,开显示,显示光标,当前显示位反白闪动
}

void clearrow(void)          //清一行
{
 	 display(0x90,0xb0,0xa0);
 	 display(0x91,0xb0,0xa0);
	 display(0x92,0xb0,0xa0);
	 display(0x93,0xb0,0xa0);
	 display(0x94,0xb0,0xa0);
 	 display(0x95,0xb0,0xa0);
	 display(0x96,0xb0,0xa0);
}

void kawuxiao(void)
{	 clearrow();
 	 display(0x90,0xbf,0xa8);//卡
 	 display(0x91,0xce,0xde);//无
	 display(0x92,0xd0,0xa7);//效
}

void yonghudenglu(void)
{	 clearrow();
 	 display(0x90,0xd3,0xc3);//用
 	 display(0x91,0xbb,0xa7);//户
	 display(0x92,0xb5,0xc7);//登
	 display(0x93,0xc2,0xbc);//陆
	 display(0x94,0xb3,0xc9);//成
	 display(0x95,0xb9,0xa6);//功
}

void shurufapiao(void)
{	 clearrow();
  	 display(0x90,0xc7,0xeb);//请
 	 display(0x91,0xca,0xe4);//输
	 display(0x92,0xc8,0xeb);//入
	 display(0x93,0xb7,0xa2);//发
	 display(0x94,0xc6,0xb1);//票
	 display(0x95,0xba,0xc5);//号	 
}

void buyongtantou(void)
{	 clearrow();
 	 display(0x90,0xc7,0xeb);//请
 	 display(0x91,0xB2,0xbb);//不
	 display(0x92,0xD2,0xAA);//要
	 display(0x93,0xCA,0xB9);//使
	 display(0x94,0xD3,0xC3);//用
 	 display(0x95,0xCC,0xBD);//探
	 display(0x96,0xCD,0xB7);//头
}

void weiguicaozuo(void)
{	 clearrow();
 	 display(0x90,0xce,0xa5);//违
 	 display(0x91,0xb9,0xe6);//规
	 display(0x92,0xb2,0xd9);//操
	 display(0x93,0xd7,0xf7);//作
}

void weishubugou(void)
{	 clearrow();
 	 display(0x90,0xb7,0xa2);//发
	 display(0x91,0xc6,0xb1);//票
	 display(0x92,0xce,0xbb);//位
	 display(0x93,0xca,0xfd);//数
	 display(0x94,0xB2,0xbb);//不
 	 display(0x95,0xb9,0xbb);//够
}

void zhunbeizhuangtai(void)
{	 clearrow();
 	display(0x90,0xd7,0xbc);//准
 	display(0x91,0xb1,0xb8);//备
	display(0x92,0xd7,0xb4);//状
	display(0x93,0xcc,0xac);//态
}

void jianchazhuangtai(void)
{	 clearrow();
 	 display(0x90,0xbc,0xec);//检
 	 display(0x91,0xb2,0xe9);//查
	 display(0x92,0xd7,0xb4);//状
	 display(0x93,0xcc,0xac);//态
}

void daojishi(void)
{	 clearrow();
	 display(0x90,0xbd,0xf8);//进
	 display(0x91,0xc8,0xeb);//入
	 display(0x92,0xb5,0xb9);//倒
	 display(0x93,0xbc,0xc6);//计
	 display(0x94,0xca,0xb1);//时
 	 
}

void chaoshi(void)
{	 
	 clearrow();
 	 display(0x90,0xb3,0xac);//超
 	 display(0x91,0xca,0xb1);//时
}

void chaoci(void)
{	 
	 clearrow();
 	 display(0x90,0xb3,0xac);//超
 	 display(0x91,0xb4,0xce);//次
}



/*
void displaynumber(unsigned char *num)
//12位的一位,次数,数
{
  display(0x88,num[0],num[1]);
  display(0x89,num[2],num[3]);
  display(0x8a,num[4],num[5]);
  display(0x8b,num[6],num[7]);
  display(0x8c,num[8],num[9]);
  display(0x8d,num[10],num[11]);
}
/*
void main(void)
{



//WriteByte(0x0000,0xf0);
//ReadByte(0x0000);
/*unsigned int address=0;
unsigned char i=0,num[10];
for(address=0;address<10;address++)
{
WriteByte(address,i);
i++;
}
i=0;
for(address=0;address<10;address++)
{
num[i]=ReadByte(address);
i++;
}
    display(0x80,num[0],num[1]);
    display(0x81,num[2],num[3]);
    display(0x82,num[4],num[5]);
    display(0x83,num[6],num[7]);
    display(0x84,num[8],num[9]);
	for(;;);
    
unsigned char maini,mainj=0,numb[12];
unsigned int address;
unsigned char *num;
num=numb;
initlcm();
for(;;)
{   
    shurufapiao();
	mainj=0;
    while(mainj<12)
    {
	  maini=kbscan();
	  if(maini<10)
	  {
	    numb[mainj]=number[maini];
		mainj++;
	   }
	   else if(maini==12)
	   {
	   if(mainj>0)
	   mainj--;
	   numb[mainj]=number[10];
	   }
	    display(0x88,num[0],num[1]);
        display(0x89,num[2],num[3]);
        display(0x8a,num[4],num[5]);
        display(0x8b,num[6],num[7]);
        display(0x8c,num[8],num[9]);
        display(0x8d,num[10],num[11]);
		delay(50000);
    }
	 	display(0x98,num[0],num[1]);
        display(0x99,num[2],num[3]);
        display(0x9a,num[4],num[5]);
        display(0x9b,num[6],num[7]);
        display(0x9c,num[8],num[9]);
        display(0x9d,num[10],num[11]);
	GetPCF8563();
//t_second=(rtc_read(2)&0x7f);    //寄存器0x02为秒寄存器
//t_minute=(rtc_read(3)&0x7f);    //寄存器0x03为分钟寄存器
//t_hour=(rtc_read(4)&0x3f);      //寄存器0x04为小时寄存器
//t_date=(rtc_read(5)&0x3f);      //寄存器0x05为天寄存器
//t_month=(rtc_read(7)&0x1f);     //寄存器0x07为月寄存器
//t_year=(rtc_read(8));           //寄存器0x08为年寄存器
 display(0x80,number[t_year>>4],number[t_year&0x0F]);
 display(0x81,number[11],number[t_month>>4]);
 display(0x82,number[t_month&0x0F],number[11]);
    display(0x83,number[t_date>>4],number[t_date&0x0F]);
    display(0x84,number[10],number[10]);
    display(0x85,number[t_hour>>4],number[t_hour&0x0F]);
    display(0x86,number[12],number[t_minute>>4]);
    display(0x87,number[t_minute&0x0F],number[12]);
    //display(0x84,num[t_second>>4],num[t_minute&0x0F]);
	/*
	for(address=0;address<12;address++)
	{
	 WriteByte(address,*num);
	 num++;
	}
	address=0;
	for(address=0;address<12;address++)
	{
	 *num=ReadByte(address);
	 num--;
	}
	display(0x80,num[0],num[1]);
    display(0x81,num[2],num[3]);
    display(0x82,num[4],num[5]);
    display(0x83,num[6],num[7]);
    display(0x84,num[8],num[9]);
    display(0x85,num[10],num[11]);
	
 }
}
}*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -