📄 avr12864.c
字号:
/************************************************************
LCD采用HD61202,128x64
控制单片机ATMage16L 4MHz
************************************************************/
#include <mega16.h>
#include "hzk.h"
/* 全局定义 */
#define uchar unsigned char
#define uint unsigned int
#define code const
#define NOP5() #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP")
#define NOP10() NOP5();NOP5()
/* LCD引脚定义 PB0-7对应LCD DB0-DB7 */
#define RS PORTA.0 // DI
#define RW PORTA.1
#define E PORTA.2
#define CS1 PORTA.3
#define CS2 PORTA.4
#define RST PORTA.5
#define DATA0 PIND.2
#define LED PORTD.6
//#define BEEP PORTD.7
typedef code struct
{
uchar X;
uchar Y;
}LCDPos;
code LCDPos LCDInfo[]= {{0x00,0x02},{0x08,0x02},{0x10,0x02},{0x18,0x02},{0x20,0x02},{0x28,0x02},{0x30,0x02},{0x38,0x02},
{0x40,0x02},{0x48,0x02},{0x50,0x02},{0x58,0x02},{0x60,0x02},{0x68,0x02},{0x70,0x02},{0x78,0x02},
{0x40,0x04},{0x48,0x04},{0x50,0x04},{0x58,0x04},{0x60,0x04},{0x68,0x04},{0x70,0x04},{0x78,0x04}};
uchar LCDInfoBuf[16];
uchar LCDIDBUF[6];
int Count = 1234;
/* 韦根解码 */
bit check_flag=0;
bit id_sucess=0;
uchar id_bit=0;
uchar id[3];
void Delay(int x)
{
for(;x>0;x--)
NOP10();
}
/*
void LCD_BUSY(void)
{
bit bBusy;
RW=0;
RS=1;
reDetect:
bBusy=PINB.7;
if(bBusy) goto reDetect;
}
*/
/*
void LCD_NOP(void)
{
uchar i;
for(i=0;i<10;i++);
#asm("NOP");
}
*/
//LCD左半屏写命令字
void LCD_Write_ComL(uchar x)
{
CS1=1;
CS2=0;
// LCD_BUSY();
// LCD_NOP();
RS=0; //Instruction
E=1;
// LCD_NOP();
RW=0;
PORTB=x;
E=1;
E=0;
CS1=1;
CS2=1;
}
//LCD左半屏写数据
void LCD_Write_DatL(uchar x)
{
CS1=1;
CS2=0;
// LCD_BUSY();
// LCD_NOP();
RS=0;
E=1;
// LCD_NOP();
RS=1; //Data
RW=0;
PORTB=x;
E=1;
E=0;
CS1=1;
CS2=1;
}
//LCD右半屏写命令字
void LCD_Write_ComR(uchar x)
{
CS1=0;
CS2=1;
// LCD_BUSY();
// LCD_NOP();
RS=0;
E=1;
// LCD_NOP();
RW=0;
PORTB=x;
E=1;
E=0;
CS1=1;
CS2=1;
}
//LCD右半屏写数据
void LCD_Write_DatR(uchar x)
{
CS1=0;
CS2=1;
// LCD_BUSY();
// LCD_NOP();
RS=0;
E=1;
// LCD_NOP();
RS=1;
RW=0;
PORTB=x;
E=1;
E=0;
CS1=1;
CS2=1;
}
//LCD初始化
void LCD_Init(void)
{
RST = 1;
RST = 0;
Delay(200);
RST = 1;
LCD_Write_ComL(0x3e);
LCD_Write_ComR(0x3e);
LCD_Write_ComL(0x3f);
LCD_Write_ComR(0x3f);
LCD_Write_ComL(0xc0);
LCD_Write_ComR(0xc0);
}
//LCD清屏
void LCD_Clr(void)
{
uchar i,j;
for(j=0;j<8;j++)
{
LCD_Write_ComL(0xb8|j);
LCD_Write_ComL(0x40);
LCD_Write_ComR(0xb8|j);
LCD_Write_ComR(0x40);
for(i=0;i<64;i++)
{
LCD_Write_DatL(0x00);
LCD_Write_DatR(0x00);
}
}
}
//------------------------------------------------------
// 中英文写入函数
// X:X方向移动1点;Y:Y方向移动8点;fan:=0正常显示,=1为反白显示
//------------------------------------------------------
void CCW_PR(uint neima,uchar X,uchar Y,uchar fan)
{
uchar k,com,dat1,hz;
uint i;
Y=Y|0xb8; //置页地址
LCD_Write_ComL(Y);
LCD_Write_ComR(Y);
if(neima<CB1B1) //判断字库是不是汉字
hz=8;
else
hz=0;
if(X<0x40) //判断是否写命令字在第一块HD61202
{
com=X+0x40; //置列地址
LCD_Write_ComL(com);
k='L';
}
else
{
com=X;
LCD_Write_ComR(X); //Com=X-0x40+0x40
}
com=com&0x3f;
for(i=neima;i<(16+neima-hz);i++)
{
dat1=hzdot[i];
if(fan)
dat1=~dat1;
if(k=='L')
LCD_Write_DatL(dat1);
else
LCD_Write_DatR(dat1);
com++;
if(com==0x40) //判断是否为第二块HD61202
{
LCD_Write_ComR(com);
k='R';
}
}
Y++;
LCD_Write_ComL(Y);
LCD_Write_ComR(Y);
if(X<0x40) //判断是否写命令字在第一块HD61202
{
com=X|0x40;
LCD_Write_ComL(com);
k='L';
}
else
{
com=X;
LCD_Write_ComR(X); //Com=X-0x40+0x40
}
com=com&0x3f;
for(i=(16+neima-hz);i<(32+neima-hz-hz);i++) //调整字库点阵的位置
{
dat1=hzdot[i];
if(fan)
dat1=~dat1;
if(k=='L')
{
LCD_Write_DatL(dat1);
}
else
{
LCD_Write_DatR(dat1);
}
com++;
if(com==0x40) //判断是否为第二块HD61202
{
LCD_Write_ComR(com);
k='R';
}
}
}
void logo(void)
{
CCW_PR(CCFB5,0x00,0x00,0); //系
CCW_PR(CCDB3,0x10,0x00,0); //统
CCW_PR(CC9E8,0x20,0x00,0); //设
CCW_PR(CB6A8,0x30,0x00,0); //定
CCW_PR(CHAR_3A,0x40,0x00,0); //:
CCW_PR(CC9CF,0x50,0x00,1); //上
CCW_PR(CCFC2,0x60,0x00,1); //下
}
// External Interrupt 0 service routine
/* WG26 */
interrupt [EXT_INT1] void ext_int1_isr(void)
{
bit da0;
uchar i;
#asm("cli")
da0=DATA0; //端口数据
if (id_bit==0)
{
id_sucess=0;
check_flag=0;
id[0]=id[1]=id[2]=0;
}
check_flag=check_flag^da0;
id_bit++; //接收的位数
if(id_bit<10)
i=0;
else if(id_bit<18)
i=1;
else if(id_bit<26)
i=2;
if(id_bit!=26)
{
id[i]=(id[i]<<1);
if(da0==1)
id[i]=id[i]+1;
}
if (id_bit==14)
{
if (check_flag!=0) //偶校验 2-13
id_bit=0;
else check_flag=1; //偶校验成功
}
if(id_bit==26)
{ //奇校验 15-25
if(check_flag==0)
id_sucess=1; //校验成功
id_bit=0;
}
#asm("sei")
}
void flashled(void)
{
uint i=0;
uchar j=0;
for(;j<5;j++)
{
LED=~LED;
while(--i);
}
LED=1;
}
interrupt [TIM1_OVF] void ext_timer1_isr(void)
{
#asm("NOP");
}
/*每周期时间
110khz--582us=2328
125khz--512us=2048
140khz--457us=1828
*/
void ReadID(void)
{
while(DATA0)
NOP5();
while(!DATA0)
NOP5();
TCCR1B=0x01;
while(DATA0)
NOP5();
TCCR1B=0x00;
if(OCR1A>2194&&OCR1A<2794) //in 1.2T
{
}
#asm("NOP");
#asm("NOP");
#asm("NOP");
#asm("NOP");
#asm("NOP");
#asm("NOP");
#asm("NOP");
#asm("NOP");
#asm("NOP");
#asm("NOP");
}
void main(void)
{
uint i;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0xFC;
DDRD=0xF0;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
//No Prescaling
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
TIMSK|=0x04;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Falling Edge
// INT1: Off
// INT2: Off
GICR=0;//|=0x80; prohibit int1
MCUCR=0x08;
MCUCSR=0x00;
GIFR=0x80;
// Global enable interrupts
#asm("sei")
PORTB=0x00;// set portb as status
DDRB=0xff;// set portb as outport
PORTA=0X00;
DDRA=0xff;
LCD_Init(); //LCD初始化
LCD_Clr(); //LCD清屏
logo();
Delay(200);
while(1)
{
Delay(200);
Count++;
LCDInfoBuf[11]=(Count/10000)%10;
LCDInfoBuf[12]=(Count/1000)%10;
LCDInfoBuf[13]=(Count/100)%10;
LCDInfoBuf[14]=(Count/10)%10;
LCDInfoBuf[15]=(Count)%10;
for (i=11;i<16;i++)
{
CCW_PR((int)LCDInfoBuf[i]*16,LCDInfo[i].X,LCDInfo[i].Y,0);
}
if(id_sucess)
{
id_sucess=0;
LCDIDBUF[0]=id[0]>>4;
LCDIDBUF[1]=id[0]&0x0f;
LCDIDBUF[2]=id[1]>>4;
LCDIDBUF[3]=id[1]&0x0f;
LCDIDBUF[4]=id[2]>>4;
LCDIDBUF[5]=id[2]&0x0f;
CCW_PR(CHAR_4E,0x00,0x04,0);
CCW_PR(CHAR_4F,0x08,0x04,0);
CCW_PR(CHAR_3A,0x10,0x04,0);
for (i=0;i<6;i++)
{
CCW_PR((int)LCDIDBUF[i]*16,LCDInfo[i+16].X,LCDInfo[i+16].Y,0);
}
flashled();
}
ReadID();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -